diff --git a/code/HTMLWriter.cpp b/code/HTMLWriter.cpp new file mode 100644 index 0000000..e026f46 --- /dev/null +++ b/code/HTMLWriter.cpp @@ -0,0 +1,522 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" +#include "gdioutput.h" +#include +#include +#include +#include +#include +#include "meos_util.h" +#include "Localizer.h" +#include "gdiconstants.h" + +double getLocalScale(const string &fontName, string &faceName); +string getMeosCompectVersion(); + +static void generateStyles(ostream &fout, bool withTbl, const list &TL, + map< pair, pair > &styles) { + fout << "\n"; +} + +static void getStyle(const map< pair, pair > &styles, + gdiFonts font, const string &face, const string &extraStyle, string &starttag, string &endtag) { + starttag.clear(); + endtag.clear(); + string extra; + switch (font) { + case boldText: + case boldSmall: + extra = "b"; + break; + case italicSmall: + case italicText: + case italicMediumPlus: + extra = "i"; + break; + } + + pair key(font, face); + map< pair, pair >::const_iterator res = styles.find(key); + + if (res != styles.end()) { + const pair &stylePair = res->second; + + if (!stylePair.first.empty()) { + starttag = "<" + stylePair.first; + if (!stylePair.second.empty()) + starttag += " class=\"" + stylePair.second + "\""; + starttag += extraStyle; + starttag += ">"; + } + + if (!extra.empty()) { + starttag += "<" + extra + ">"; + endtag = ""; + } + + if (!stylePair.first.empty()) { + endtag += ""; + } + } + else { + string element; + switch(font) { + case boldHuge: + element="h1"; + break; + case boldLarge: + element="h2"; + break; + case fontLarge: + element="h2"; + break; + case fontMedium: + element="h3"; + break; + } + + if (!extraStyle.empty() && element.empty()) + element = "div"; + + if (element.size()>0) { + starttag = "<" + element + extraStyle + ">"; + } + + if (!extra.empty()) { + starttag += "<" + extra + ">"; + endtag = ""; + } + + if (element.size()>0) { + endtag += ""; + } + } +} + +bool gdioutput::writeHTML(const wstring &file, const string &title, int refreshTimeOut) const +{ + ofstream fout(file.c_str()); + + if (fout.bad()) + return false; + + + fout << "\n\n"; + + fout << "\n\n"; + fout << "\n"; + if (refreshTimeOut > 0) + fout << "\n"; + + + fout << "" << toUTF8(title) << "\n"; + + map< pair, pair > styles; + generateStyles(fout, false, TL, styles); + + fout << "\n"; + + fout << "\n"; + + list::const_iterator it = TL.begin(); + + double yscale = 1.3; + double xscale = 1.2; + int offsetY = 0; + while (it!=TL.end()) { + if (skipTextRender(it->format)) { + ++it; + continue; + } + + string yp = itos(int(yscale*it->yp) + offsetY); + string xp = itos(int(xscale *it->xp)); + + string estyle; + if (it->format!=1 && it->format!=boldSmall) { + if (it->format & textRight) + estyle = " style=\"position:absolute;left:" + + xp + "px;top:" + yp + "px\""; + else + estyle = " style=\"position:absolute;left:" + + xp + "px;top:" + yp + "px\""; + + } + else { + if (it->format & textRight) + estyle = " style=\"font-weight:bold;position:absolute;left:" + + xp + "px;top:" + yp + "px\""; + else + estyle = " style=\"font-weight:bold;position:absolute;left:" + + xp + "px;top:" + yp + "px\""; + } + string starttag, endtag; + getStyle(styles, it->getGdiFont(), it->font, estyle, starttag, endtag); + + if (!it->text.empty()) + fout << starttag << toUTF8(encodeXML(it->text)) << endtag << endl; + + if (it->format == boldLarge) { + list::const_iterator next = it; + ++next; + if (next == TL.end() || next->yp != it->yp) + offsetY += 7; + } + ++it; + } + + fout << "

"; + + char bf1[256]; + char bf2[256]; + GetTimeFormat(LOCALE_USER_DEFAULT, 0, NULL, NULL, bf2, 256); + GetDateFormat(LOCALE_USER_DEFAULT, 0, NULL, NULL, bf1, 256); + //fout << "Skapad av MeOS: " << bf1 << " "<< bf2 << "\n"; + fout << toUTF8(lang.tl("Skapad av ")) + "MeOS: " << bf1 << " "<< bf2 << "\n"; + fout << "

\n"; + + fout << "\n"; + fout << "\n"; + + return false; +} + +string html_table_code(const string &in) +{ + if (in.size()==0) + return " "; + else { + return encodeXML(in); + } +} + +bool sortTL_X(const TextInfo *a, const TextInfo *b) +{ + return a->xp < b->xp; +} + + +bool gdioutput::writeTableHTML(const wstring &file, + const string &title, int refreshTimeOut) const +{ + ofstream fout(file.c_str()); + + if (fout.bad()) + return false; + + return writeTableHTML(fout, title, false, refreshTimeOut); +} + +bool gdioutput::writeTableHTML(ostream &fout, + const string &title, + bool simpleFormat, + int refreshTimeOut) const { + + fout << "\n\n"; + + fout << "\n\n"; + fout << "\n"; + if (refreshTimeOut > 0) + fout << "\n"; + fout << "" << toUTF8(title) << "\n"; + + map< pair, pair > styles; + generateStyles(fout, true, TL, styles); + + fout << "\n"; + + fout << "\n"; + + list::const_iterator it = TL.begin(); + map tableCoordinates; + + //Get x-coordinates + while (it!=TL.end()) { + tableCoordinates[it->xp]=0; + ++it; + } + + map::iterator mit=tableCoordinates.begin(); + int k=0; + + while (mit!=tableCoordinates.end()) { + mit->second=k++; + ++mit; + } + tableCoordinates[MaxX]=k; + + vector sizeSet(k+1, false); + + fout << "\n"; + + int linecounter=0; + it=TL.begin(); + + vector< pair > > rows; + rows.reserve(TL.size() / 3); + vector ypRow; + int minHeight = 100000; + + while (it!=TL.end()) { + int y=it->yp; + vector row; + + int subnormal = 0; + int normal = 0; + int header = 0; + int mainheader = 0; + while (it!=TL.end() && it->yp==y) { + if (!gdioutput::skipTextRender(it->format)) { + row.push_back(&*it); + switch (it->getGdiFont()) { + case fontLarge: + case boldLarge: + case boldHuge: + mainheader++; + break; + case boldText: + case italicMediumPlus: + case fontMediumPlus: + header++; + break; + case fontSmall: + case italicSmall: + subnormal++; + break; + default: + normal++; + } + } + ++it; + } + + if (row.empty()) + continue; + + bool isMainHeader = mainheader > normal; + bool isHeader = (header + mainheader) > normal; + bool isSub = subnormal > normal; + + sort(row.begin(), row.end(), sortTL_X); + rows.resize(rows.size() + 1); + rows.back().first = isMainHeader ? 1 : (isHeader ? 2 : (isSub ? 3 : 0)); + rows.back().second.swap(row); + int last = ypRow.size(); + ypRow.push_back(y); + if (last > 0) { + minHeight = min(minHeight, ypRow[last] - ypRow[last-1]); + } + } + int numMin = 0; + for (size_t gCount = 1; gCount < rows.size(); gCount++) { + int h = ypRow[gCount] - ypRow[gCount-1]; + if (h == minHeight) + numMin++; + } + if (numMin == 0) + numMin = 1; + + int hdrLimit = (rows.size() / numMin) <= 4 ? int(minHeight * 1.2) : int(minHeight * 1.5); + for (size_t gCount = 1; gCount + 1 < rows.size(); gCount++) { + int type = rows[gCount].first; + int lastType = gCount > 0 ? rows[gCount-1].first : 0; + int nextType = gCount + 1 < rows.size() ? rows[gCount + 1].first : 0; + if (type == 0 && (lastType == 1 || lastType == 2) && (nextType == 1 || nextType == 2)) + continue; // No reclassify + + int h = ypRow[gCount] - ypRow[gCount-1]; + if (h > hdrLimit && rows[gCount].first == 0) + rows[gCount].first = 2; + } + + ypRow.clear(); + string lineclass; + for (size_t gCount = 0; gCount < rows.size(); gCount++) { + vector &row = rows[gCount].second; + int type = rows[gCount].first; + int lastType = gCount > 0 ? rows[gCount-1].first : 0; + int nextType = gCount + 1 < rows.size() ? rows[gCount + 1].first : 0; + + vector::iterator rit; + fout << "" << endl; + + if (simpleFormat) { + } + else if (type == 1) { + lineclass = " class=\"freeheader\""; + linecounter = 0; + } + else if (type == 2) { + linecounter = 0; + lineclass = " valign=\"bottom\" class=\"header\""; + } + else { + if (type == 3) + linecounter = 1; + + if ((lastType == 1 || lastType == 2) && (nextType == 1 || nextType == 2) && row.size() < 3) { + lineclass = ""; + } + else + lineclass = (linecounter&1) ? " class=\"e1\"" : " class=\"e0\""; + + linecounter++; + } + + for (size_t k=0;kxp]; + + if (k==0 && thisCol!=0) + fout << " "; + + int nextCol; + if (row.size()==k+1) + nextCol=tableCoordinates.rbegin()->second; + else + nextCol=tableCoordinates[row[k+1]->xp]; + + int colspan=nextCol-thisCol; + + assert(colspan>0); + + string style; + + if (row[k]->format&textRight) + style=" style=\"text-align:right\""; + + if (colspan==1 && !sizeSet[thisCol]) { + fout << " xp - row[k]->xp) : (MaxX-row[k]->xp)) << "\">"; + sizeSet[thisCol]=true; + } + else if (colspan>1) + fout << " "; + else + fout << " "; + + gdiFonts font = row[k]->getGdiFont(); + string starttag, endtag; + getStyle(styles, font, row[k]->font, "", starttag, endtag); + + fout << starttag << toUTF8(html_table_code(row[k]->text)) << endtag << "" << endl; + + } + fout << "\n"; + + row.clear(); + } + + fout << "
\n"; + + if (!simpleFormat) { + fout << "

"; + char bf1[256]; + char bf2[256]; + GetTimeFormat(LOCALE_USER_DEFAULT, 0, NULL, NULL, bf2, 256); + GetDateFormat(LOCALE_USER_DEFAULT, 0, NULL, NULL, bf1, 256); + string meos = getMeosCompectVersion(); + fout << toUTF8(lang.tl("Skapad av ")) + "MeOS " + << meos << ": " << bf1 << " "<< bf2 << "\n"; + fout << "


\n"; + } + fout << "\n"; + fout << "\n"; + + return true; +} \ No newline at end of file diff --git a/code/MeOSFeatures.cpp b/code/MeOSFeatures.cpp new file mode 100644 index 0000000..eeb5b0a --- /dev/null +++ b/code/MeOSFeatures.cpp @@ -0,0 +1,251 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" +#include "oEvent.h" +#include "MeOSFeatures.h" +#include "meosexception.h" +#include "meos_util.h" +#include +#include "classconfiginfo.h" + +MeOSFeatures::MeOSFeatures(void) +{ + addHead("General"); + add(DrawStartList, "SL", "Prepare start lists"); + add(Bib, "BB", "Bibs"); + add(Clubs, "CL", "Clubs"); + add(EditClub, "CC", "Edit Clubs").require(Clubs); + + add(InForest, "RF", "Track runners in forest"); + add(Network, "NW", "Several MeOS Clients in a network"); + + addHead("MeOS Features"); + add(Speaker, "SP", "Använd speakerstöd"); + add(SeveralStages, "ST", "Several stages"); + add(Economy, "EC", "Economy and fees").require(EditClub).require(Clubs); + add(Vacancy, "VA", "Vacancies and entry cancellations").require(DrawStartList); + add(TimeAdjust, "TA", "Manual time penalties and adjustments"); + add(RunnerDb, "RD", "Club and runner database").require(Clubs); + addHead("Teams and forking"); + add(ForkedIndividual, "FO", "Forked individual courses"); + add(Patrol, "PT", "Patrols"); + add(Relay, "RL", "Relays"); + add(MultipleRaces, "MR", "Several races for a runner").require(Relay); + + addHead("Rogaining"); + add(Rogaining, "RO", "Rogaining"); + add(PointAdjust, "PA", "Manual point reductions and adjustments").require(Rogaining); +} + +MeOSFeatures::FeatureDescriptor &MeOSFeatures::add(Feature feat, const char *code, const char *descr) { + assert(codeToIx.count(code) == 0); + assert(featureToIx.count(feat) == 0); + + featureToIx[feat] = desc.size(); + string codeS = code; + codeToIx[codeS] = desc.size(); + desc.push_back(FeatureDescriptor(feat, codeS, descr)); + return desc.back(); +} + +MeOSFeatures::FeatureDescriptor &MeOSFeatures::addHead(const char *descr) { + desc.push_back(FeatureDescriptor(_Head, "-", descr)); + return desc.back(); +} + +bool MeOSFeatures::isHead(int featureIx) const { + return getFeature(featureIx) == _Head; +} + +const string &MeOSFeatures::getHead(int featureIx) const { + if (isHead(featureIx)) + return desc[featureIx].desc; + else + isHead(-1);//Throws + return _EmptyString; +} + +MeOSFeatures::FeatureDescriptor::FeatureDescriptor(Feature featIn, + string codeIn, + string descIn) : + feat(featIn), code(codeIn), desc(descIn) +{ +} + +MeOSFeatures::~MeOSFeatures(void) +{ +} + +bool MeOSFeatures::hasFeature(Feature f) const { + return features.count(f) != 0; +} + +void MeOSFeatures::useFeature(Feature f, bool use, oEvent &oe) { + if (use) { + const set &dep = desc[getIndex(f)].dependsOn; + features.insert(f); + features.insert(dep.begin(), dep.end()); + } + else { + if (!isRequiredInternal(f)) + features.erase(f); + } + oe.getDI().setString("Features", serialize()); +} + +bool MeOSFeatures::isRequiredInternal(Feature f) const { + for (set::const_iterator it = features.begin(); it != features.end(); ++it) { + if (desc[getIndex(*it)].dependsOn.count(f)) + return true; + } + return false; +} + +bool MeOSFeatures::isRequired(Feature f, const oEvent &oe) const { + if (isRequiredInternal(f)) + return true; + + if (f == Rogaining && oe.hasRogaining() && hasFeature(Rogaining)) + return true; + + return false; +} + +int MeOSFeatures::getNumFeatures() const { + return desc.size(); +} + +MeOSFeatures::Feature MeOSFeatures::getFeature(int featureIx) const { + if (size_t(featureIx) < desc.size()) + return desc[featureIx].feat; + else + throw meosException("Index out of bounds"); +} + +const string &MeOSFeatures::getDescription(Feature f) const { + return desc[getIndex(f)].desc; +} + +const string &MeOSFeatures::getCode(Feature f) const { + return desc[getIndex(f)].code; +} + +int MeOSFeatures::getIndex(Feature f) const { + map::const_iterator res = featureToIx.find(f); + if (res == featureToIx.end()) + throw meosException("Index out of bounds"); + return res->second; +} + +string MeOSFeatures::serialize() const { + if (features.empty()) + return "NONE"; + + string st; + for (set::const_iterator it = features.begin(); it != features.end(); ++it) { + if (!st.empty()) + st += "+"; + st += getCode(*it); + } + return st; +} + +void MeOSFeatures::deserialize(const string &input, oEvent &oe) { + features.clear(); + + if (input == "NONE") + return; + else if (input.empty()) { + loadDefaults(oe); + } + + vector ff; + split(input, "+", ff); + for (size_t k = 0; k < ff.size(); k++) { + map::iterator res = codeToIx.find(ff[k]); + if (res != codeToIx.end()) + features.insert(desc[res->second].feat); + } + + set iF; + for (set::iterator it = features.begin(); it != features.end(); ++it) { + int ix = getIndex(*it); + iF.insert(desc[ix].dependsOn.begin(), desc[ix].dependsOn.end()); + } + + features.insert(iF.begin(), iF.end()); +} + +void MeOSFeatures::loadDefaults(oEvent &oe) { + if (oe.getDCI().getInt("UseEconomy") != 0) { + features.insert(Economy); + features.insert(EditClub); + } + + if (oe.getDCI().getInt("UseSpeaker") != 0) + features.insert(Speaker); + + if (oe.hasRogaining()) + features.insert(Rogaining); + + if (oe.getDCI().getInt("SkipRunnerDb") == 0 ) + features.insert(RunnerDb); + + ClassConfigInfo cnf; + oe.getClassConfigurationInfo(cnf); + if (cnf.hasPatrol()) + features.insert(Patrol); + + if (cnf.hasRelay()) + features.insert(Relay); + + if (cnf.raceNStart.size() > 0) { + features.insert(Relay); + features.insert(MultipleRaces); + } + + if (cnf.isMultiStageEvent()) + features.insert(SeveralStages); + + features.insert(Clubs); + features.insert(Network); + features.insert(ForkedIndividual); + + features.insert(Vacancy); + features.insert(InForest); + features.insert(DrawStartList); + features.insert(Bib); +} + +void MeOSFeatures::useAll(oEvent &oe) { + for (size_t k = 0; k < desc.size(); k++) { + if (desc[k].feat != _Head) + features.insert(desc[k].feat); + } + oe.getDI().setString("Features", serialize()); +} + +void MeOSFeatures::clear(oEvent &oe) { + features.clear(); + oe.getDI().setString("Features", serialize()); +} diff --git a/code/MeOSFeatures.h b/code/MeOSFeatures.h new file mode 100644 index 0000000..6b03a08 --- /dev/null +++ b/code/MeOSFeatures.h @@ -0,0 +1,103 @@ +#pragma once +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include +#include +#include + +class oEvent; + +class MeOSFeatures +{ +public: + enum Feature { + _Head = -1, + Speaker = 0, + Economy, + Clubs, + EditClub, + SeveralStages, + Network, + TimeAdjust, + PointAdjust, + ForkedIndividual, + Patrol, + Relay, + MultipleRaces, + Rogaining, + Vacancy, + InForest, + DrawStartList, + Bib, + RunnerDb, + }; + +private: + struct FeatureDescriptor { + Feature feat; + string code; + string desc; + set dependsOn; + FeatureDescriptor &require(Feature f) { + dependsOn.insert(f); + return *this; + } + FeatureDescriptor(Feature feat, string code, string desc); + }; + + vector desc; + map featureToIx; + map codeToIx; + FeatureDescriptor &add(Feature feat, const char *code, const char *desc); + FeatureDescriptor &addHead(const char *desc); + + set features; + + int getIndex(Feature f) const; + + void loadDefaults(oEvent &oe); + + bool isRequiredInternal(Feature f) const; + +public: + MeOSFeatures(void); + ~MeOSFeatures(void); + + bool hasFeature(Feature f) const; + void useFeature(Feature f, bool use, oEvent &oe); + bool isRequired(Feature f, const oEvent &oe) const; + + void useAll(oEvent &oe); + void clear(oEvent &oe); + + int getNumFeatures() const; + Feature getFeature(int featureIx) const; + bool isHead(int featureIx) const; + const string &getHead(int featureIx) const; + const string &getDescription(Feature f) const; + const string &getCode(Feature f) const; + + string serialize() const; + void deserialize(const string &input, oEvent &oe); +}; + diff --git a/code/Printer.h b/code/Printer.h new file mode 100644 index 0000000..83ae356 --- /dev/null +++ b/code/Printer.h @@ -0,0 +1,116 @@ +// printer.h: printing utilities. + +#pragma once + +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "gdistructures.h" + +/** Data structure describing text to print.*/ +struct PrintTextInfo { + float xp; + float yp; + float width; + TextInfo ti; + PrintTextInfo(const TextInfo &ti_) : xp(0), yp(0), width(0), ti(ti_) {}; + PrintTextInfo() : xp(0), yp(0), width(0) {}; +}; + +/** Data structure describing page to print*/ +struct PageInfo { + float topMargin; + float bottomMargin; + float pageY; + float leftMargin; + float scaleX; + float scaleY; + + bool printHeader; + bool noPrintMargin; + int nPagesTotal; //Total number of pages to print + + // Transfer mm to local printing coordinates: cLocalX = cx + m, cLocalX = cy + m. + double xMM2PrintC; + double xMM2PrintK; + + double yMM2PrintC; + double yMM2PrintK; + + void renderPages(const list &tl, + const list &rects, + bool invertHeightY, + vector &pages); + + string pageInfo(const RenderedPage &page) const; +}; + +/** A rendered page ready to print. */ +struct RenderedPage { + int nPage; // This page number + string info; + vector text; + vector rectangles; + __int64 checkSum; + + RenderedPage() : checkSum(0) {} + void calculateCS(const TextInfo &text); +}; + +struct PrinterObject { + //Printing + HDC hDC; + HGLOBAL hDevMode; + HGLOBAL hDevNames; + + void freePrinter(); + + string Device; + string Driver; + DEVMODE DevMode; + set<__int64> printedPages; + int nPagesPrinted; + int nPagesPrintedTotal; + bool onlyChanged; + + struct DATASET { + int pWidth_mm; + int pHeight_mm; + double pMgBottom; + double pMgTop; + double pMgRight; + double pMgLeft; + + int MarginX; + int MarginY; + int PageX; + int PageY; + double Scale; + bool LastPage; + } ds; + + void operator=(const PrinterObject &po); + + PrinterObject(); + ~PrinterObject(); + PrinterObject(const PrinterObject &po); +}; diff --git a/code/RunnerDB.cpp b/code/RunnerDB.cpp new file mode 100644 index 0000000..8714eaf --- /dev/null +++ b/code/RunnerDB.cpp @@ -0,0 +1,1232 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" +#include "RunnerDB.h" +#include "xmlparser.h" +#include "oRunner.h" +#include "Table.h" + +#include "io.h" +#include "fcntl.h" +#include "sys/stat.h" +#include "meos_util.h" +#include "oDataContainer.h" +#include "meosException.h" + +#include +#include +#include "intkeymapimpl.hpp" + +#include "oEvent.h" + +RunnerDB::RunnerDB(oEvent *oe_): oe(oe_) +{ + loadedFromServer = false; + dataDate = 20100201; + dataTime = 222222; + runnerTable = 0; + clubTable = 0; +} + +RunnerDB::~RunnerDB(void) +{ + releaseTables(); +} + +RunnerDBEntry::RunnerDBEntry() +{ + memset(this, 0, sizeof(RunnerDBEntry)); +} + +RunnerDBEntryV1::RunnerDBEntryV1() +{ + memset(this, 0, sizeof(RunnerDBEntryV1)); +} + + +void RunnerDBEntry::getName(string &n) const +{ + n=name; +} + +void RunnerDBEntry::setName(const char *n) +{ + memcpy(name, n, min(strlen(n)+1, baseNameLength)); + name[baseNameLength-1]=0; +} + +string RunnerDBEntry::getNationality() const +{ + if (national[0] < 30) + return _EmptyString; + + string n(" "); + n[0] = national[0]; + n[1] = national[1]; + n[2] = national[2]; + return n; +} + +string RunnerDBEntry::getSex() const +{ + if (sex == 0) + return _EmptyString; + string n("W"); + n[0] = sex; + return n; +} +string RunnerDBEntry::getGivenName() const +{ + return ::getGivenName(name); +} + +string RunnerDBEntry::getFamilyName() const +{ + return ::getFamilyName(name); +} + +__int64 RunnerDBEntry::getExtId() const +{ + return extId; +} + +void RunnerDBEntry::setExtId(__int64 id) +{ + extId = id; +} + +void RunnerDBEntry::init(const RunnerDBEntryV1 &dbe) +{ + memcpy(this, &dbe, sizeof(RunnerDBEntryV1)); + extId = 0; +} + + +RunnerDBEntry *RunnerDB::addRunner(const char *name, + __int64 extId, + int club, int card) +{ + rdb.push_back(RunnerDBEntry()); + RunnerDBEntry &e=rdb.back(); + e.cardNo = card; + e.clubNo = club; + e.setName(name); + e.extId = extId; + + if (!check(e) ) { + rdb.pop_back(); + return 0; + } else { + if (card>0) + rhash[card]=rdb.size()-1; + if (!idhash.empty()) + idhash[extId] = rdb.size()-1; + if (!nhash.empty()) + nhash.insert(pair(canonizeName(e.name), rdb.size()-1)); + } + return &e; +} + +int RunnerDB::addClub(oClub &c, bool createNewId) { + //map::iterator it = chash.find(c.getId()); + //if (it == chash.end()) { + if (createNewId) { + oDBClubEntry ce(c, cdb.size(), this); + cdb.push_back(ce); + int b = 0; + while(++b<0xFFFF) { + int newId = 10000 + rand() & 0xFFFF; + int dummy; + if (!chash.lookup(newId, dummy)) { + cdb.back().Id = newId; + chash[c.getId()]=cdb.size()-1; + return newId; + } + } + cdb.pop_back(); + throw meosException("Internal database error"); + } + + int value; + if (!chash.lookup(c.getId(), value)) { + oDBClubEntry ce(c, cdb.size(), this); + cdb.push_back(ce); + chash[c.getId()]=cdb.size()-1; + } + else { + oDBClubEntry ce(c, value, this); + cdb[value] = ce; + } + return c.getId(); +} + +void RunnerDB::importClub(oClub &club, bool matchName) +{ + pClub pc = getClub(club.getId()); + + if (pc && !pc->sameClub(club)) { + //The new id is used by some other club. + //Remap old club first + + int oldId = pc->getId(); + int newId = chash.size() + 1;//chash.rbegin()->first + 1; + + for (size_t k=0; kgetId(); + int newId = club.getId(); + + for (size_t k=0; k clubmap; + for (size_t k=0;k compacted; + for (size_t j=k+1;jba) { + best = &cdb[compacted[j]]; + ba=nba; + } + } + swap(ref, *best); + + //Update map + for (size_t j=0;j= rdb.size()) + throw meosException("Index out of bounds"); + + return (RunnerDBEntry *)&rdb[index]; +} + + +RunnerDBEntry *RunnerDB::getRunnerById(__int64 extId) const +{ + if (extId == 0) + return 0; + + setupIdHash(); + + int value; + + if (idhash.lookup(extId, value)) + return (RunnerDBEntry *)&rdb[value]; + + return 0; +} + +RunnerDBEntry *RunnerDB::getRunnerByName(const string &name, int clubId, + int expectedBirthYear) const +{ + if (expectedBirthYear>0 && expectedBirthYear<100) + expectedBirthYear = extendYear(expectedBirthYear); + + setupNameHash(); + vector ix; + string cname(canonizeName(name.c_str())); + multimap::const_iterator it = nhash.find(cname); + + while (it != nhash.end() && cname == it->first) { + ix.push_back(it->second); + ++it; + } + + if (ix.empty()) + return 0; + + if (clubId == 0) { + if (ix.size() == 1) + return (RunnerDBEntry *)&rdb[ix[0]]; + else + return 0; // Not uniquely defined. + } + + // Filter on club + vector ix2; + for (size_t k = 0;k 0) { + int bestMatch = 0; + int bestYear = 0; + for (size_t k = 0;k0) + return (RunnerDBEntry *)&rdb[bestMatch]; + } + + return 0; +} + +void RunnerDB::setupIdHash() const +{ + if (!idhash.empty()) + return; + + for (size_t k=0; k(canonizeName(rdb[k].name), k)); + } +} + +void RunnerDB::setupCNHash() const +{ + if (!cnhash.empty()) + return; + + vector split; + for (size_t k=0; k(split[j], k)); + } +} + +static bool isVowel(int c) { + return c=='a' || c=='e' || c=='i' || + c=='o' || c=='u' || c=='y' || + c=='å' || c=='ä' || c=='ö'; +} + +void RunnerDB::canonizeSplitName(const string &name, vector &split) +{ + split.clear(); + const char *cname = name.c_str(); + int k = 0; + for (k=0; cname[k]; k++) + if (cname[k] != ' ') + break; + + char out[128]; + int outp; + while (cname[k]) { + outp = 0; + while(cname[k] != ' ' && cname[k] && outp<(sizeof(out)-1) ) { + if (cname[k] == '-') { + k++; + break; + } + out[outp++] = toLowerStripped(cname[k]); + k++; + } + out[outp] = 0; + if (outp > 0) { + for (int j=1; j4 && out[outp-1]=='s') + out[outp-1] = 0; // Identify Linköping och Linköpings + split.push_back(out); + } + while(cname[k] == ' ') + k++; + } +} + +bool RunnerDB::getClub(int clubId, string &club) const +{ + //map::const_iterator it = chash.find(clubId); + + int value; + if (chash.lookup(clubId, value)) { + //if (it!=chash.end()) { + // int i=it->second; + club=cdb[value].getName(); + return true; + } + return false; +} + +oClub *RunnerDB::getClub(int clubId) const +{ + //map::const_iterator it = chash.find(clubId); + + //if (it!=chash.end()) + int value; + if (chash.lookup(clubId, value)) + return pClub(&cdb[value]); + + return 0; +} + +oClub *RunnerDB::getClub(const string &name) const +{ + setupCNHash(); + vector names; + canonizeSplitName(name, names); + vector< vector > ix(names.size()); + set iset; + + for (size_t k = 0; k::const_iterator it = cnhash.find(names[k]); + + while (it != cnhash.end() && names[k] == it->first) { + ix[k].push_back(it->second); + ++it; + } + + if (ix[k].size() == 1 && names[k].length()>3) + return pClub(&cdb[ix[k][0]]); + + if (iset.empty()) + iset.insert(ix[k].begin(), ix[k].end()); + else { + set im; + for (size_t j = 0; j::iterator it = iset.begin(); it != iset.end(); ++it) { + pClub pc = pClub(&cdb[*it]); + if (_stricmp(pc->getName().c_str(), name.c_str())==0) + return pc; + } + + string cname = canonizeName(name.c_str()); + // Looser compare + for (set::iterator it = iset.begin(); it != iset.end(); ++it) { + pClub pc = pClub(&cdb[*it]); + if (strcmp(canonizeName(pc->getName().c_str()), cname.c_str()) == 0 ) + return pc; + } + + double best = 1; + double secondBest = 1; + int bestIndex = -1; + for (set::iterator it = iset.begin(); it != iset.end(); ++it) { + pClub pc = pClub(&cdb[*it]); + + double d = stringDistance(cname.c_str(), canonizeName(pc->getName().c_str())); + + if (d0.4) + return pClub(&cdb[bestIndex]); + + return 0; +} + +void RunnerDB::saveClubs(const char *file) +{ + xmlparser xml(0); + + xml.openOutputT(file, true, "meosclubs"); + + vector::iterator it; + + xml.startTag("ClubList"); + + for (it=cdb.begin(); it != cdb.end(); ++it) + it->write(xml); + + xml.endTag(); + + xml.closeOut(); +} + +string RunnerDB::getDataDate() const +{ + char bf[128]; + if (dataTime<=0 && dataDate>0) + sprintf_s(bf, "%04d-%02d-%02d", dataDate/10000, + (dataDate/100)%100, + dataDate%100); + else if (dataDate>0) + sprintf_s(bf, "%04d-%02d-%02d %02d:%02d:%02d", dataDate/10000, + (dataDate/100)%100, + dataDate%100, + (dataTime/3600)%24, + (dataTime/60)%60, + (dataTime)%60); + else + return "2011-01-01 00:00:00"; + + return bf; +} + +void RunnerDB::setDataDate(const string &date) +{ + int d = convertDateYMS(date.substr(0, 10), false); + int t = date.length()>11 ? convertAbsoluteTimeHMS(date.substr(11), -1) : 0; + + if (d<=0) + throw std::exception("Felaktigt datumformat"); + + dataDate = d; + if (t>0) + dataTime = t; + else + dataTime = 0; +} + +void RunnerDB::saveRunners(const char *file) +{ + int f=-1; + _sopen_s(&f, file, _O_BINARY|_O_CREAT|_O_TRUNC|_O_WRONLY, + _SH_DENYWR, _S_IREAD|_S_IWRITE); + + if (f!=-1) { + int version = 5460002; + _write(f, &version, 4); + _write(f, &dataDate, 4); + _write(f, &dataTime, 4); + if (!rdb.empty()) + _write(f, &rdb[0], rdb.size()*sizeof(RunnerDBEntry)); + _close(f); + } + else throw std::exception("Could not save runner database."); +} + +void RunnerDB::loadClubs(const char *file) +{ + xmlparser xml(0); + + xml.read(file); + + xmlobject xo; + + //Get clubs + xo=xml.getObject("ClubList"); + if (xo) { + clearClubs(); + loadedFromServer = false; + + xmlList xl; + xo.getObjects(xl); + + xmlList::const_iterator it; + cdb.clear(); + chash.clear(); + freeCIx = 0; + cdb.reserve(xl.size()); + for (it=xl.begin(); it != xl.end(); ++it) { + if (it->is("Club")){ + oDBClubEntry c(oe, cdb.size(), this); + c.set(*it); + int value; + //if (chash.find(c.getId()) == chash.end()) { + if (!chash.lookup(c.getId(), value)) { + chash[c.getId()]=cdb.size(); + cdb.push_back(c); + } + } + } + } + + bool checkClubs = false; + + if (checkClubs) { + vector problems; + + for (size_t k=0; kgetName()); + if (!pc2) + problems.push_back(pc->getName()); + else if (pc != pc2) + problems.push_back(pc->getName() + "-" + pc2->getName()); + } + problems.begin(); + } +} + +void RunnerDB::loadRunners(const char *file) +{ + string ex=string("Bad runner database. ")+file; + int f=-1; + _sopen_s(&f, file, _O_BINARY|_O_RDONLY, + _SH_DENYWR, _S_IREAD|_S_IWRITE); + + if (f!=-1) { + clearRunners(); + loadedFromServer = false; + + int len = _filelength(f); + if ( (len%sizeof(RunnerDBEntryV1) != 0) && (len % sizeof(RunnerDBEntry) != 12)) { + _close(f); + return;//Failed + } + int nentry = 0; + + if (len % sizeof(RunnerDBEntry) == 12) { + nentry = (len-12) / sizeof(RunnerDBEntry); + + rdb.resize(nentry); + if (rdb.empty()) { + _close(f); + return; + } + int version; + _read(f, &version, 4); + _read(f, &dataDate, 4); + _read(f, &dataTime, 4); + _read(f, &rdb[0], len-12); + _close(f); + for (int k=0;k rdbV1(nentry); + + _read(f, &rdbV1[0], len); + _close(f); + for (int k=0;k0) + ncard++; + + rhash.resize(ncard); + + for (int k=0;k0 && !rdb[k].isRemoved()) { + rhash[rdb[k].cardNo]=k; + } + } + } + else throw std::exception(ex.c_str()); +} + +bool RunnerDB::check(const RunnerDBEntry &rde) const +{ + if (rde.cardNo<0 || rde.cardNo>99999999 + || rde.name[baseNameLength-1]!=0 || rde.clubNo<0) + return false; + return true; +} + +void RunnerDB::updateAdd(const oRunner &r, map &clubIdMap) +{ + if (r.getExtIdentifier() > 0) { + RunnerDBEntry *dbe = getRunnerById(int(r.getExtIdentifier())); + if (dbe) { + dbe->cardNo = r.CardNo; + return; // Do not change too much in runner from national database + } + } + + const pClub pc = r.Club; + int localClubId = r.getClubId(); + + if (pc) { + if (clubIdMap.count(localClubId)) + localClubId = clubIdMap[localClubId]; + + pClub dbClub = getClub(localClubId); + bool wrongId = false; + if (dbClub) { + if (dbClub->getName() != pc->getName()) { + dbClub = 0; // Wrong club! + wrongId = true; + } + } + + if (dbClub == 0) { + dbClub = getClub(r.getClub()); + if (dbClub) { + localClubId = dbClub->getId(); + clubIdMap[pc->getId()] = localClubId; + } + } + + if (dbClub == 0) { + localClubId = addClub(*pc, wrongId); + if (wrongId) + clubIdMap[pc->getId()] = localClubId; + } + } + + RunnerDBEntry *dbe = getRunnerByCard(r.getCardNo()); + + if (dbe == 0) { + dbe = addRunner(r.getName().c_str(), 0, localClubId, r.getCardNo()); + if (dbe) + dbe->birthYear = r.getDCI().getInt("BirthYear"); + } + else { + if (dbe->getExtId() == 0) { // Only update entries not in national db. + dbe->setName(r.getName().c_str()); + dbe->clubNo = localClubId; + dbe->birthYear = r.getDCI().getInt("BirthYear"); + } + } +} + +void RunnerDB::getAllNames(vector &givenName, vector &familyName) +{ + givenName.reserve(rdb.size()); + familyName.reserve(rdb.size()); + for (size_t k=0;kclear(); + +} + +void RunnerDB::clearRunners() +{ + nhash.clear(); + idhash.clear(); + rhash.clear(); + rdb.clear(); + if (runnerTable) + runnerTable->clear(); +} + +const vector &RunnerDB::getClubDB() const { + return cdb; +} + +const vector &RunnerDB::getRunnerDB() const { + return rdb; +} + +void RunnerDB::prepareLoadFromServer(int nrunner, int nclub) { + loadedFromServer = true; + clearClubs(); // Implicitly clears runners + cdb.reserve(nclub); + rdb.reserve(nrunner); +} + +void RunnerDB::fillClubs(vector< pair > &out) const { + out.reserve(cdb.size()); + for (size_t k = 0; kgetDBRunnersInEvent(runnerInEvent); + if (addEntry) { + addEntry->addTableRow(table); + return; + } + + table.reserve(rdb.size()); + oRDB.resize(rdb.size(), oDBRunnerEntry(oe)); + for (size_t k = 0; kreloadRow(value + 1); + } + catch (const std::exception &) { + // Ignore any problems with the table. + } + } + } +} + +void RunnerDB::refreshTables() { + if (runnerTable) + refreshRunnerTableData(*runnerTable); + + if (clubTable) + refreshClubTableData(*clubTable); +} + +void RunnerDB::releaseTables() { + if (runnerTable) + runnerTable->releaseOwnership(); + runnerTable = 0; + + if (clubTable) + clubTable->releaseOwnership(); + clubTable = 0; +} + +Table *RunnerDB::getRunnerTB()//Table mode +{ + if (runnerTable == 0) { + Table *table=new Table(oe, 20, "Löpardatabasen", "runnerdb"); + + table->addColumn("Index", 70, true, true); + table->addColumn("Id", 70, true, true); + table->addColumn("Namn", 200, false); + table->addColumn("Klubb", 200, false); + table->addColumn("SI", 70, true, true); + table->addColumn("Nationalitet", 70, false, true); + table->addColumn("Kön", 50, false, true); + table->addColumn("Födelseår", 70, true, true); + table->addColumn("Anmäl", 70, false, true); + + table->setTableProp(Table::CAN_INSERT|Table::CAN_DELETE|Table::CAN_PASTE); + table->setClearOnHide(false); + table->addOwnership(); + runnerTable = table; + } + int nr = 0; + for (size_t k = 0; k < rdb.size(); k++) { + if (!rdb[k].isRemoved()) + nr++; + } + + if (runnerTable->getNumDataRows() != nr) + runnerTable->update(); + return runnerTable; +} + +void RunnerDB::generateClubTableData(Table &table, oClub *addEntry) +{ + if (addEntry) { + addEntry->addTableRow(table); + return; + } + + table.reserve(cdb.size()); + for (size_t k = 0; ksetObject(cdb[k]); + } + } +} + +void RunnerDB::refreshRunnerTableData(Table &table) { + for (size_t k = 0; ksetObject(oRDB[k]); + } + } +} + +Table *RunnerDB::getClubTB()//Table mode +{ + bool canEdit = !oe->isClient(); + + if (clubTable == 0) { + Table *table = new Table(oe, 20, "Klubbdatabasen", "clubdb"); + + table->addColumn("Id", 70, true, true); + table->addColumn("Ändrad", 70, false); + + table->addColumn("Namn", 200, false); + oClub::buildTableCol(oe, table); + + if (canEdit) + table->setTableProp(Table::CAN_DELETE|Table::CAN_INSERT|Table::CAN_PASTE); + else + table->setTableProp(0); + + table->setClearOnHide(false); + table->addOwnership(); + clubTable = table; + } + + int nr = 0; + for (size_t k = 0; k < cdb.size(); k++) { + if (!cdb[k].isRemoved()) + nr++; + } + + if (clubTable->getNumDataRows() != nr) + clubTable->update(); + return clubTable; +} + + +void oDBRunnerEntry::addTableRow(Table &table) const { + bool canEdit = !oe->isClient(); + + oDBRunnerEntry &it = *(oDBRunnerEntry *)(this); + table.addRow(index+1, &it); + if (!db) + throw meosException("Not initialized"); + + RunnerDBEntry &r = db->rdb[index]; + int row = 0; + table.set(row++, it, TID_INDEX, itos(index+1), false, cellEdit); + + char bf[16]; + oBase::converExtIdentifierString(r.extId, bf); + table.set(row++, it, TID_ID, bf, false, cellEdit); + table.set(row++, it, TID_NAME, r.name, canEdit, cellEdit); + + const pClub pc = db->getClub(r.clubNo); + if (pc) + table.set(row++, it, TID_CLUB, pc->getName(), canEdit, cellSelection); + else + table.set(row++, it, TID_CLUB, "", canEdit, cellSelection); + + table.set(row++, it, TID_CARD, r.cardNo > 0 ? itos(r.cardNo) : "", canEdit, cellEdit); + char nat[4] = {r.national[0],r.national[1],r.national[2], 0}; + + table.set(row++, it, TID_NATIONAL, nat, canEdit, cellEdit); + char sex[2] = {r.sex, 0}; + table.set(row++, it, TID_SEX, sex, canEdit, cellEdit); + table.set(row++, it, TID_YEAR, itos(r.birthYear), canEdit, cellEdit); + + oClass *val = 0; + bool found = false; + + if (r.extId != 0) + found = db->runnerInEvent.lookup(r.extId, val); + + if (canEdit) + table.setTableProp(Table::CAN_DELETE|Table::CAN_INSERT|Table::CAN_PASTE); + else + table.setTableProp(0); + + if (!found) + table.set(row++, it, TID_ENTER, "@+", false, cellAction); + else + table.set(row++, it, TID_ENTER, val ? val->getName() : "", false, cellEdit); +} + +const RunnerDBEntry &oDBRunnerEntry::getRunner() const { + if (!db) + throw meosException("Not initialized"); + return db->rdb[index]; +} + +bool oDBRunnerEntry::inputData(int id, const string &input, + int inputId, string &output, bool noUpdate) +{ + if (!db) + throw meosException("Not initialized"); + RunnerDBEntry &r = db->rdb[index]; + + switch(id) { + case TID_NAME: + r.setName(input.c_str()); + r.getName(output); + db->nhash.clear(); + return true; + case TID_CARD: + db->rhash.remove(r.cardNo); + r.cardNo = atoi(input.c_str()); + db->rhash.insert(r.cardNo, index); + if (r.cardNo) + output = itos(r.cardNo); + else + output = ""; + return true; + case TID_NATIONAL: + if (input.empty()) { + r.national[0] = 0; + r.national[1] = 0; + r.national[2] = 0; + } + else if (input.size() >= 2) + memcpy(r.national, input.c_str(), 3); + + output = r.getNationality(); + break; + case TID_SEX: + r.sex = input[0]; + output = r.getSex(); + break; + case TID_YEAR: + r.birthYear = short(atoi(input.c_str())); + output = itos(r.getBirthYear()); + break; + + case TID_CLUB: + r.clubNo = inputId; + output = input; + break; + } + return false; +} + +void oDBRunnerEntry::fillInput(int id, vector< pair > &out, size_t &selected) +{ + RunnerDBEntry &r = db->rdb[index]; + if (id==TID_CLUB) { + db->fillClubs(out); + out.push_back(make_pair("-", 0)); + selected = r.clubNo; + } +} + +void oDBRunnerEntry::remove() { + RunnerDBEntry &r = db->rdb[index]; + r.remove(); + db->idhash.remove(r.extId); + string cname(canonizeName(r.name)); + multimap::const_iterator it = db->nhash.find(cname); + + while (it != db->nhash.end() && cname == it->first) { + if (it->second == index) { + db->nhash.erase(it); + break; + } + ++it; + } + + if (r.cardNo > 0) { + int ix = -1; + if (db->rhash.lookup(r.cardNo, ix) && ix == index) { + db->rhash.remove(r.cardNo); + } + } +} + +bool oDBRunnerEntry::canRemove() const { + return true; +} + +oDBRunnerEntry *RunnerDB::addRunner() { + rdb.push_back(RunnerDBEntry()); + oRDB.push_back(oDBRunnerEntry(oe)); + oRDB.back().init(this, rdb.size() - 1); + + return &oRDB.back(); +} + +oClub *RunnerDB::addClub() { + freeCIx = max(freeCIx + 1, cdb.size()); + while (chash.count(freeCIx)) + freeCIx++; + + cdb.push_back(oDBClubEntry(oe, freeCIx, cdb.size(), this)); + chash.insert(freeCIx, cdb.size()-1); + cnhash.clear(); + + return &cdb.back(); +} + +oDataContainer &oDBRunnerEntry::getDataBuffers(pvoid &data, pvoid &olddata, pvectorstr &strData) const { + throw meosException("Not implemented"); +} + +oDBClubEntry::oDBClubEntry(oEvent *oe, int id, int ix, RunnerDB *dbin) : oClub(oe, id) { + index = ix; + db = dbin; +} + +oDBClubEntry::oDBClubEntry(const oClub &c, int ix, RunnerDB *dbin) : oClub(c) { + index = ix; + db = dbin; +} + +oDBClubEntry::~oDBClubEntry() { +} + +void oDBClubEntry::remove() { + Removed = true; + db->chash.remove(getId()); + + vector split; + db->canonizeSplitName(getName(), split); + for (size_t j = 0; j::const_iterator it = db->cnhash.find(split[j]); + while (it != db->cnhash.end() && split[j] == it->first) { + if (it->second == index) { + db->cnhash.erase(it); + break; + } + ++it; + } + } +} + +bool oDBClubEntry::canRemove() const { + return true; +} + +int oDBClubEntry::getTableId() const { + return index + 1; +} + \ No newline at end of file diff --git a/code/RunnerDB.h b/code/RunnerDB.h new file mode 100644 index 0000000..1b57b0d --- /dev/null +++ b/code/RunnerDB.h @@ -0,0 +1,249 @@ +#pragma once + +#include +#include +#include "inthashmap.h" +#include "oclub.h" +#include +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +const int baseNameLength=32; + +//Has 0-clearing constructor. Must not contain any +//dynamic data etc. +struct RunnerDBEntryV1 { + RunnerDBEntryV1(); + + char name[baseNameLength]; + int cardNo; + int clubNo; + char national[3]; + char sex; + short int birthYear; + short int reserved; +}; + +struct RunnerDBEntry { + // Init from old struct + void init(const RunnerDBEntryV1 &dbe); + RunnerDBEntry(); + + /** Binary compatible with V1*/ + char name[baseNameLength]; + int cardNo; + int clubNo; + char national[3]; + char sex; + short int birthYear; + short int reserved; + /** End of V1*/ + + __int64 extId; + + void getName(string &name) const; + void setName(const char *name); + + string getGivenName() const; + string getFamilyName() const; + + string getNationality() const; + int getBirthYear() const {return birthYear;} + string getSex() const; + + __int64 getExtId() const; + void setExtId(__int64 id); + + bool isRemoved() const {return (reserved & 1) == 1;} + void remove() {reserved |= 1;} +}; + +typedef vector RunnerDBVector; + +class oDBRunnerEntry; +class oClass; +class oDBClubEntry; + +class RunnerDB { +private: + oEvent *oe; + + Table *runnerTable; + Table *clubTable; + + bool check(const RunnerDBEntry &rde) const; + + intkeymap runnerInEvent; + + /** Init name hash lazy */ + void setupNameHash() const; + void setupIdHash() const; + void setupCNHash() const; + + vector rdb; + vector cdb; + vector oRDB; + + // Runner card hash + inthashmap rhash; + + // Runner id hash + mutable intkeymap idhash; + + // Club id hash + inthashmap chash; + + // Last known free index + int freeCIx; + + // Name hash + mutable multimap nhash; + + // Club name hash + mutable multimap cnhash; + + static void canonizeSplitName(const string &name, vector &split); + + bool loadedFromServer; + + /** Date when database was updated. The format is YYYYMMDD */ + int dataDate; + + /** Time when database was updated. The format is HH:MM:SS */ + int dataTime; + + void fillClubs(vector< pair > &out) const; + +public: + + void generateRunnerTableData(Table &table, oDBRunnerEntry *addEntry); + void generateClubTableData(Table &table, oClub *addEntry); + + void refreshRunnerTableData(Table &table); + void refreshClubTableData(Table &table); + void refreshTables(); + + Table *getRunnerTB(); + Table *getClubTB(); + + void hasEnteredCompetition(__int64 extId); + + void releaseTables(); + + /** Get the date, YYYY-MM-DD HH:MM:SS when database was updated */ + string getDataDate() const; + /** Set the date YYYY-MM-DD HH:MM:SS when database was updated */ + void setDataDate(const string &date); + + + /** Returns true if the database was loaded from server */ + bool isFromServer() const {return loadedFromServer;} + + /** Prepare for loading runner from server*/ + void prepareLoadFromServer(int nrunner, int nclub); + + const vector& getRunnerDB() const; + const vector& getClubDB() const; + + void clearRunners(); + void clearClubs(); + + /** Add a club. Create a new Id if necessary*/ + int addClub(oClub &c, bool createNewId); + RunnerDBEntry *addRunner(const char *name, __int64 extId, + int club, int card); + + oDBRunnerEntry *addRunner(); + oClub *addClub(); + + RunnerDBEntry *getRunnerByIndex(size_t index) const; + RunnerDBEntry *getRunnerById(__int64 extId) const; + RunnerDBEntry *getRunnerByCard(int card) const; + RunnerDBEntry *getRunnerByName(const string &name, int clubId, + int expectedBirthYear) const; + + bool getClub(int clubId, string &club) const; + oClub *getClub(int clubId) const; + + oClub *getClub(const string &name) const; + + void saveClubs(const char *file); + void saveRunners(const char *file); + void loadRunners(const char *file); + void loadClubs(const char *file); + + void updateAdd(const oRunner &r, map &clubIdMap); + + void importClub(oClub &club, bool matchName); + void compactifyClubs(); + + void getAllNames(vector &givenName, vector &familyName); + RunnerDB(oEvent *); + ~RunnerDB(void); + friend class oDBRunnerEntry; + friend class oDBClubEntry; +}; + +class oDBRunnerEntry : public oBase { +private: + RunnerDB *db; + int index; +protected: + /** Get internal data buffers for DI */ + oDataContainer &getDataBuffers(pvoid &data, pvoid &olddata, pvectorstr &strData) const; + int getDISize() const {return 0;} + void changedObject() {} +public: + + int getIndex() const {return index;} + void init(RunnerDB *db_, int index_) {db=db_, index=index_; Id = index;} + + const RunnerDBEntry &getRunner() const; + + void addTableRow(Table &table) const; + bool inputData(int id, const string &input, + int inputId, string &output, bool noUpdate); + void fillInput(int id, vector< pair > &out, size_t &selected); + + oDBRunnerEntry(oEvent *oe); + virtual ~oDBRunnerEntry(); + + void remove(); + bool canRemove() const; + + string getInfo() const {return "Database Runner";} +}; + + +class oDBClubEntry : public oClub { +private: + int index; + RunnerDB *db; +public: + oDBClubEntry(oEvent *oe, int id, int index, RunnerDB *db); + oDBClubEntry(const oClub &c, int index, RunnerDB *db); + + int getTableId() const; + virtual ~oDBClubEntry(); + void remove(); + bool canRemove() const; +}; diff --git a/code/SportIdent.cpp b/code/SportIdent.cpp new file mode 100644 index 0000000..8b2d9f5 --- /dev/null +++ b/code/SportIdent.cpp @@ -0,0 +1,2341 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +// SportIdent.cpp: implementation of the SportIdent class. +// +////////////////////////////////////////////////////////////////////// + +// Check implementation r56. + +#include "stdafx.h" +#include "meos.h" +#include "SportIdent.h" +#include +#include +#include +#include "localizer.h" +#include "meos_util.h" +#include "oPunch.h" +#include + +#include +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +//#define DEBUG_SI + +SI_StationData::SI_StationData() { + stationNumber=0; + stationMode=0; + extended=false; + handShake=false; + autoSend=false; + radioChannel = 0; +} + +SI_StationInfo::SI_StationInfo() +{ + ThreadHandle=0; + hComm=0; + memset(&TimeOuts, 0, sizeof(TimeOuts)); + + tcpPort=0; + localZeroTime=0; +} + +SportIdent::SportIdent(HWND hWnd, DWORD Id) +{ + ClassId=Id; + hWndNotify=hWnd; + + //hComm=0; + //ThreadHandle=0; + n_SI_Info=0; + + ZeroTime=0; + InitializeCriticalSection(&SyncObj); + + tcpPortOpen=0; + serverSocket=0; +} + +SportIdent::~SportIdent() +{ + CloseCom(0); + DeleteCriticalSection(&SyncObj); +} + +// CRC algoritm used by SPORTIdent GmbH +// implemented for MeOS in C++ +WORD SportIdent::CalcCRC(BYTE *data, DWORD count) +{ + // Return 0 for no or one data byte + if (count<2) + return 0; + + size_t index=0; + WORD crc = (WORD(data[index])<<8) + WORD(data[index+1]); + index +=2; + // Return crc for two data bytes + if (count==2) + return crc; + + WORD value; + for (size_t k = count>>1; k>0; k--) { + if (k>1) { + value = (WORD(data[index])<<8) + WORD(data[index+1]); + index +=2; + } + else // If the number of bytes is odd, complete with 0. + value = (count&1) ? data[index]<<8 : 0; + + for (int j = 0; j<16; j++) { + if (crc & 0x8000) { + crc <<= 1; + if (value & 0x8000) + crc++; + crc ^= 0x8005; + } + else { + crc <<= 1; + if (value & 0x8000) + crc++; + } + value <<= 1; + } + } + return crc; +} + +void SportIdent::SetCRC(BYTE *bf) +{ + DWORD len=bf[1]; + WORD crc=CalcCRC(bf, len+2); + bf[len+2]=HIBYTE(crc); + bf[len+3]=LOBYTE(crc); +} + +bool SportIdent::CheckCRC(BYTE *bf) +{ + DWORD len=bf[1]; + WORD crc=CalcCRC(bf, len+2); + + return bf[len+2]==HIBYTE(crc) && bf[len+3]==LOBYTE(crc); +} + +bool SportIdent::ReadSystemData(SI_StationInfo *si, int retry) +{ + BYTE c[16]; + BYTE buff[256]; + + c[0]=STX; + c[1]=0x83; + c[2]=0x02; + c[3]=0x70; //Request address 0x70 + c[4]=0x06; //And 6 bytes + //Address 0x74 = protocoll settings + //Address 0x71 = Programming ctrl/readout/finish etc. + SetCRC(c+1); + c[7]=ETX; + + DWORD written=0; + WriteFile(si->hComm, c, 8, &written, NULL); + Sleep(100); + memset((void *)buff, 0, 30); + DWORD offset = 0; + ReadBytes_delay(buff, sizeof(buff), 15, si->hComm); + if (buff[0] == 0xFF && buff[1] == STX) + offset++; + if (1){ + if (CheckCRC(LPBYTE(buff+1 + offset))){ + si->data.resize(1); + SI_StationData &da = si->data[0]; + da.stationNumber=511 & MAKEWORD(buff[4 + offset], buff[3 + offset]); + BYTE PR=buff[6+4 + offset]; + BYTE MO=buff[6+1 + offset]; + da.extended = (PR&0x1)!=0; + da.handShake = (PR&0x4)!=0; + da.autoSend = (PR&0x2)!=0; + da.stationMode = MO & 0xf; + } + else if (retry>0) + return ReadSystemData(si, retry-1); + else return false; + } + else if (retry>0) + return ReadSystemData(si, retry-1); + else + return false; + + return true; +} + +bool SportIdent::ReadSystemDataV2(SI_StationInfo &si) +{ + BYTE c[16]; + BYTE buff[4096]; + + int maxbytes = 256; + while (ReadByte(c[0], si.hComm) == 1 && maxbytes> 0) { + maxbytes--; + } + + // 02 83 01 00 80 bf 17 03 + + c[0]=STX; + c[1]=0x83; + c[2]=0x02; + c[3]=0; + c[4]=0x80; + c[5]=0xbf; + c[6]=0x17; + SetCRC(c+1); + c[7]=ETX; + + DWORD written=0; + WriteFile(si.hComm, c, 8, &written, NULL); + Sleep(100); + memset((void *)buff, 0, sizeof(buff) ); +// DWORD offset = 0; + int consumed = 0; + int read = ReadBytes_delay(buff, sizeof(buff), -1, si.hComm); + const int requested = 0x80; + while ( (read - consumed) >= requested) { + while (consumed < read && buff[consumed] != STX) + consumed++; + + BYTE *db = buff + consumed; + if ((read - consumed) >= requested && db[0] == STX) { + si.data.push_back(SI_StationData()); + int used = analyzeStation(db, si.data.back()); + if (used == 0) { + si.data.pop_back(); // Not valid + break; + } + else consumed += used; + + // Test duplicate units: si.data.push_back(si.data.back()); + } + else break; + } + + return si.data.size() > 0; +} + +int SportIdent::analyzeStation(BYTE *db, SI_StationData &si) { + DWORD size = 0; + DWORD addr = 0x70; + if (CheckCRC(LPBYTE(db+1))) { + size = DWORD(db[2]) + 6; + + bool dongle = db[0x11] == 0x6f && db[0x12] == 0x21; + + if (dongle) { + BYTE PR=db[69]; + BYTE MO=db[6+1+addr]; + si.extended=(PR&0x1)!=0; + si.handShake = false; + si.autoSend=db[68] == 1; + si.stationMode=MO & 0xf; + si.radioChannel = db[58] & 0x1; + si.stationNumber = 0; + } + else { + si.stationNumber=511 & MAKEWORD(db[4], db[3]); + BYTE PR=db[6+4+addr]; + BYTE MO=db[6+1+addr]; + si.extended=(PR&0x1)!=0; + si.handShake=(PR&0x4)!=0; + si.autoSend=(PR&0x2)!=0; + si.stationMode=MO & 0xf; + si.radioChannel = 0; + } + } + + return size; +} + +string decode(BYTE *bf, int read) +{ + string st; + for(int k=0;k<=read;k++){ + if (bf[k]==STX) + st+="STX "; + else if (bf[k]==ETX) + st+="ETX "; + else if (bf[k]==ACK) + st+="ACK "; + else if (bf[k]==DLE) + st+="DLE "; + else{ + char d[10]; + sprintf_s(d, "%02X ", bf[k]); + st+=d; + } + } + return st; +} + +bool SportIdent::OpenComListen(const char *com, DWORD BaudRate) { + CloseCom(com); + + SI_StationInfo *si = findStation(com); + + if (!si) { + SI_Info[n_SI_Info].ComPort=com; + SI_Info[n_SI_Info].ThreadHandle=0; + si=&SI_Info[n_SI_Info]; + n_SI_Info++; + } + si->data.clear(); + + string comfile=string("//./")+com; + si->hComm = CreateFile( comfile.c_str(), + GENERIC_READ | GENERIC_WRITE, + 0, + 0, + OPEN_EXISTING, + 0, + 0); + + if (si->hComm == INVALID_HANDLE_VALUE) { + si->hComm=0; + return false; // error opening port; abort + } + + //Store comport + //ComPort=com; + + GetCommTimeouts(si->hComm, &si->TimeOuts); + COMMTIMEOUTS MyTimeOuts=si->TimeOuts; + MyTimeOuts.ReadIntervalTimeout=50; + MyTimeOuts.ReadTotalTimeoutMultiplier = 10; + MyTimeOuts.ReadTotalTimeoutConstant = 300; + MyTimeOuts.WriteTotalTimeoutMultiplier = 10; + MyTimeOuts.WriteTotalTimeoutConstant = 300; + + SetCommTimeouts(si->hComm, &MyTimeOuts); + + DCB dcb; + memset(&dcb, 0, sizeof(dcb)); + dcb.DCBlength=sizeof(dcb); + dcb.BaudRate=BaudRate; + dcb.fBinary=TRUE; + dcb.fDtrControl=DTR_CONTROL_DISABLE; + dcb.fRtsControl=RTS_CONTROL_DISABLE; + dcb.Parity=NOPARITY; + dcb.StopBits=ONESTOPBIT; + dcb.ByteSize =8; + + SetCommState(si->hComm, &dcb); + return true; +} + +bool SportIdent::tcpAddPort(int port, DWORD zeroTime) +{ + CloseCom("TCP"); + + SI_StationInfo *si = findStation("TCP"); + + if (!si) { + SI_Info[n_SI_Info].ComPort="TCP"; + SI_Info[n_SI_Info].ThreadHandle=0; + si=&SI_Info[n_SI_Info]; + n_SI_Info++; + } + + si->tcpPort=port; + si->localZeroTime=zeroTime; + si->hComm=0; + return true; +} + +bool SportIdent::OpenCom(const char *com) +{ + CloseCom(com); + + SI_StationInfo *si = findStation(com); + + if (!si) { + SI_Info[n_SI_Info].ComPort=com; + SI_Info[n_SI_Info].ThreadHandle=0; + si=&SI_Info[n_SI_Info]; + n_SI_Info++; + } + + si->data.clear(); + + string comfile=string("//./")+com; + si->hComm = CreateFile( comfile.c_str(), + GENERIC_READ | GENERIC_WRITE, + 0, + 0, + OPEN_EXISTING, + 0,//FILE_FLAG_OVERLAPPED, + 0); + + if (si->hComm == INVALID_HANDLE_VALUE) { + si->hComm=0; + return false; // error opening port; abort + } + + GetCommTimeouts(si->hComm, &si->TimeOuts); + COMMTIMEOUTS MyTimeOuts=si->TimeOuts; + MyTimeOuts.ReadIntervalTimeout=50; + MyTimeOuts.ReadTotalTimeoutMultiplier = 10; + MyTimeOuts.ReadTotalTimeoutConstant = 300; + MyTimeOuts.WriteTotalTimeoutMultiplier = 10; + MyTimeOuts.WriteTotalTimeoutConstant = 300; + + SetCommTimeouts(si->hComm, &MyTimeOuts); + + DCB dcb; + memset(&dcb, 0, sizeof(dcb)); + dcb.DCBlength=sizeof(dcb); + dcb.BaudRate=CBR_38400; + dcb.fBinary=TRUE; + dcb.fDtrControl=DTR_CONTROL_DISABLE; + dcb.fRtsControl=RTS_CONTROL_DISABLE; + dcb.Parity=NOPARITY; + dcb.StopBits=ONESTOPBIT; + dcb.ByteSize =8; + + SetCommState(si->hComm, &dcb); + + BYTE c[128]; + + c[0]=WAKEUP; + c[1]=STX; + c[2]=STX; + c[3]=0xF0; + c[4]=0x01; + c[5]=0x4D; + SetCRC(c+3); + + c[8]=ETX; + + DWORD written; + + WriteFile(si->hComm, c, 9, &written, NULL); + Sleep(700); + //c[6]= + DWORD read; + BYTE buff[128]; + memset(buff, 0, sizeof(buff)); + read = ReadBytes(buff, 1, si->hComm); + + if (read == 1 && buff[0] == 0xFF){ + Sleep(100); + read = ReadBytes(buff, 1, si->hComm); + } + + if (read==1 && buff[0]==STX) { + ReadFile(si->hComm, buff, 8, &read, NULL); + + if (!ReadSystemDataV2(*si)) + ReadSystemData(si, 1); + } + else { + dcb.BaudRate=CBR_4800; + SetCommState(si->hComm, &dcb); + + WriteFile(si->hComm, c, 9, &written, NULL); + Sleep(600); + //c[6]= + DWORD read; + BYTE buff[128]; + + read=ReadByte(*buff, si->hComm); + + if (read==1 && buff[0]==STX) { + ReadFile(si->hComm, buff, 8, &read, NULL); + ReadSystemData(si); + } + else { + BYTE cold[8]; + cold[0]=STX; + cold[1]=0x70; + cold[2]=0x4D; + cold[3]=ETX; + + WriteFile(si->hComm, cold, 4, &written, NULL); + + Sleep(500); + + read=ReadByte(*buff, si->hComm); + + if (read!=1 || buff[0]!=STX) { + CloseCom(si->ComPort.c_str()); + return false; + } + + read=ReadBytesDLE_delay(buff, sizeof(buff), 4, si->hComm); + if (read==4) { + si->data.resize(1); + if (buff[1]>30) + si->data[0].stationNumber = buff[1]; + else{ + si->data[0].stationNumber = buff[2]; + + } + if (buff[3]!=ETX) + ReadByte(buff[4], si->hComm); + } + } + } + + return true; +} + + +SI_StationInfo *SportIdent::findStation(const string &com) +{ + for(int i=0;iComPort=="TCP") { + if (tcpPortOpen) { + EnterCriticalSection(&SyncObj); + shutdown(SOCKET(serverSocket), SD_BOTH); + LeaveCriticalSection(&SyncObj); + + Sleep(300); + + EnterCriticalSection(&SyncObj); + closesocket(SOCKET(serverSocket)); + tcpPortOpen = 0; + serverSocket = 0; + LeaveCriticalSection(&SyncObj); + } + } + else if (si && si->hComm) + { + if (si->ThreadHandle) + { + EnterCriticalSection(&SyncObj); + TerminateThread(si->ThreadHandle, 0); + LeaveCriticalSection(&SyncObj); + + CloseHandle(si->ThreadHandle); + si->ThreadHandle=0; + } + SetCommTimeouts(si->hComm, &si->TimeOuts); //Restore + CloseHandle(si->hComm); + si->hComm=0; + } + } +} + + +int SportIdent::ReadByte_delay(BYTE &byte, HANDLE hComm) +{ + byte=0; + return ReadBytes_delay(&byte, 1, 1, hComm); +} + + +int SportIdent::ReadByte(BYTE &byte, HANDLE hComm) +{ + byte=0; + + if (!hComm) + return -1; + + DWORD dwRead; + + if (ReadFile(hComm, &byte, 1, &dwRead, NULL)) + { +#ifdef DEBUG_SI2 + char t[64]; + sprintf_s(t, 64, "read=%02X\n", (int)byte); + OutputDebugString(t); +#endif + if (dwRead) + return 1; + else return 0; + } + else return -1; +} + + + +int SportIdent::ReadBytes_delay(BYTE *byte, DWORD buffSize, DWORD len, HANDLE hComm) { + int read=0; + int d; + bool autoLen = false; + if (len == -1) { + len = min(buffSize, 10); + autoLen = true; + } + int toread=len; + + for(d=0;d<7 && read(buffSize - read, len); + if (maxToRead <= 0) + return read; + + int r = ReadBytes(byte+read, maxToRead, hComm); + + if (r==-1) { + if (read > 0) + return read; + return -1; + } + read+=r; + if (read == 1 && byte[0] == NAK) + return read; + + if (autoLen && r == len) { + int rloop; + Sleep(100); + while (read < int(buffSize) && (rloop = ReadBytes(byte+read, min(16, buffSize-read), hComm)) > 0) { + read += rloop; + } + } + + if (read < toread) { + len = toread - read; + Sleep(100); + } + } +#ifdef DEBUG_SI2 + char t[64]; + sprintf_s(t, 64, "retry=%d\n", d); + OutputDebugString(t); + + for (int k = 0; k < read; k++) { + char t[64]; + sprintf_s(t, 64, "mreadd=%02X\n", (int)byte[k]); + OutputDebugString(t); + } +#endif + + return read; +} + +int SportIdent::ReadBytes(BYTE *byte, DWORD len, HANDLE hComm) +{ + if (!hComm) + return -1; + + DWORD dwRead; + + if (ReadFile(hComm, byte, len, &dwRead, NULL)) + { +#ifdef DEBUG_SI2 + for (int k = 0; k < dwRead; k++) { + char t[64]; + sprintf_s(t, 64, "mread=%02X\n", (int)byte[k]); + OutputDebugString(t); + } +#endif + return dwRead; + } + else return -1; +} + + +int SportIdent::ReadBytesDLE_delay(BYTE *byte, DWORD buffSize, DWORD len, HANDLE hComm) +{ + int read=0; + int toread=len; + int d; + + for(d=0;d<15 && read 0) + { + DWORD ip=0; + DWORD op=0; + + for (ip=0;ip 10) { + if (GetTickCount() > timeout) { + break; + } + else + iter = 0; + } + Sleep(0); + } + + r=recv(client, temp, 15, 0); + + if (r==15) { + //BYTE c[15]={0, 0x64,0,0x48, 0xa4, 0x07, 00, 0x05, 00, 00, 00, 0x8d, 0x16, 0x06, 0x00}; + //memcpy(temp, c, 15); + op.Type=temp[0]; + op.CodeNo=*(WORD*)(&temp[1]); + op.SICardNo=*(DWORD *)(&temp[3]); + op.CodeDay=*(DWORD *)(&temp[7]); + op.CodeTime=*(DWORD *)(&temp[11]); + + if (op.Type == 64 && op.CodeNo>1 && op.CodeNo<=192 && op.CodeTime == 0) { + // Recieved card + int nPunch = op.CodeNo; + vector punches(nPunch); + r = recv(client, (char*)&punches[0], 8 * nPunch, 0); + if (r == 8 * nPunch) { + SICard card; + card.CheckPunch.Code = -1; + card.StartPunch.Code = -1; + card.FinishPunch.Code = -1; + card.CardNumber = op.SICardNo; + for (int k = 0; k < nPunch; k++) { + punches[k].Time /= 10; + if (punches[k].Code == oPunch::PunchStart) + card.StartPunch = punches[k]; + else if (punches[k].Code == oPunch::PunchFinish) + card.FinishPunch = punches[k]; + else if (punches[k].Code == oPunch::PunchCheck) + card.CheckPunch = punches[k]; + else + card.Punch[card.nPunch++] = punches[k]; + } + addCard(card); + } + } + else + AddPunch(op.CodeTime/10, op.CodeNo, op.SICardNo, 0); + } + else r=-1; + + } + //close the client socket + closesocket(client); + } + else { + int err=WSAGetLastError(); + + if (err==WSAESHUTDOWN || err==WSAECONNABORTED) { + tcpPortOpen=0; + serverSocket=0; + closesocket(server); + //MessageBox(0, "TCP CLOSE", 0, MB_OK); + return 0; + } + } + } + + //MessageBox(0, "TCP CLOSE BYE", 0, MB_OK); + + //closesocket() closes the socket and releases the socket descriptor + closesocket(server); + + WSACleanup(); + return 1; +} + +bool SportIdent::MonitorSI(SI_StationInfo &si) +{ + HANDLE hComm=si.hComm; + + if (!hComm) + return false; + + DWORD dwCommEvent; + DWORD dwRead; + BYTE chRead; + + if (!SetCommMask(hComm, EV_RXCHAR)) + { + // Error setting communications event mask. + //Sleep(1000); + return false; + } + else + { + for ( ; ; ) { + if (WaitCommEvent(hComm, &dwCommEvent, NULL)) { + if (dwCommEvent & EV_RXCHAR) do{ + if ( (dwRead=ReadByte(chRead, hComm))!=-1) + { + // A byte has been read; process it. + if (chRead==STX && ReadByte(chRead, hComm)) + { + switch(chRead) + { + case 0xD3:{//Control Punch, extended mode. + BYTE bf[32]; + bf[0]=chRead; + ReadBytes(bf+1, 17, hComm); + if (CheckCRC(LPBYTE(bf))) + { + WORD Station=MAKEWORD(bf[3], bf[2]); + + DWORD ShortCard=MAKEWORD(bf[7], bf[6]); + DWORD Series=bf[5]; + + + DWORD Card=MAKELONG(MAKEWORD(bf[7], bf[6]), MAKEWORD(bf[5], bf[4])); + + if (Series<=4 && Series>=1) + Card=ShortCard+100000*Series; + + DWORD Time=0; + if (bf[8]&0x1) Time=3600*12; + Time+=MAKEWORD(bf[10], bf[9]); +#ifdef DEBUG_SI + char str[128]; + sprintf_s(str, "EXTENDED: Card = %d, Station = %d, StationMode = %d", Card, Station, si.StationMode); + MessageBox(NULL, str, NULL, MB_OK); +#endif + AddPunch(Time, Station & 511, Card & 0x00FFFFFF, si.stationMode()); + } + break; + } + case 0x53:{ //Control Punch, old mode + BYTE bf[32]; + bf[0]=chRead; + //Sleep(200); + ReadBytesDLE(bf+1, 30, hComm); + + BYTE Station=bf[2]; + BYTE Series=bf[3]; + WORD Card=MAKEWORD(bf[5], bf[4]); + + + DWORD DCard; + + if (Series==1) + DCard=Card; + else if (Series<=4) + DCard=Card+100000*Series; + else + DCard=MAKELONG(Card, Series); + + //if (Series!=1) + // Card+=100000*Series; + + DWORD Time=MAKEWORD(bf[8], bf[7]); + BYTE p=bf[1]; + if (p&0x1) Time+=3600*12; + +#ifdef DEBUG_SI + char str[128]; + sprintf_s(str, "OLD: Card = %d, Station = %d, StationMode = %d", DCard, Station, si.StationMode); + MessageBox(NULL, str, NULL, MB_OK); +#endif + AddPunch(Time, Station, DCard, si.stationMode()); + break; + } + case 0xE7:{//SI5/6 removed + BYTE bf[32]; + ReadBytes(bf+1, 10, hComm); + break; + } + + case 0xE6:{ + BYTE bf[32]; + bf[0]=0xE6; + ReadBytes(bf+1, 10, hComm); + + //ReadByte(chRead); //ETX! + if (CheckCRC(LPBYTE(bf))) + GetSI6DataExt(hComm); + + break; + } + case 0xE5:{ + BYTE bf[32]; + bf[0]=0xE5; + ReadBytes(bf+1, 10, hComm); + + if (CheckCRC(LPBYTE(bf))) + GetSI5DataExt(hComm); + + break; + } + case 0x46: + ReadByte(chRead, hComm); //0x49?! + ReadByte(chRead, hComm); //ETX! + GetSI5Data(hComm); + break; + case 0x66:{ //STX, 66h, CSI, TI, TP, CN3, CN2, CN1, CN0, ETX + BYTE bf[32]; + //SICard5Detect si5; + //si5.code=0xE5; + bf[0]=0xE6; + ReadBytesDLE(bf+1, 8, hComm); + + GetSI6Data(hComm); + + break; + } + case 0xB1:{ + BYTE bf[200]; + bf[0]=chRead; + ReadBytes(bf+1, 200, hComm); + //GetSI5DataExt(hComm); + MessageBox(NULL, "Programmera stationen utan AUTOSEND!", NULL, MB_OK); + } + break; + + case 0xE1:{ + BYTE bf[200]; + bf[0]=chRead; + ReadBytes(bf+1, 200, hComm); + MessageBox(NULL, "Programmera stationen utan AUTOSEND!", NULL, MB_OK); + } + break; + case 0xE8:{ + BYTE bf[32]; + bf[0]=0xE8; + ReadBytes(bf+1, 10, hComm); + + //ReadByte(chRead); //ETX! + if (CheckCRC(LPBYTE(bf))) + GetSI9DataExt(hComm); + + break; + } + // MessageBox(NULL, "SI-card not supported", NULL, MB_OK); + // break; + default: + + BYTE bf[128]; + bf[0]=chRead; + int rb=ReadBytes(bf+1, 120, hComm); + + string st; + for(int k=0;k<=rb;k++){ + if (bf[k]==STX) + st+="STX "; + else if (bf[k]==ETX) + st+="ETX "; + else if (bf[k]==ACK) + st+="ACK "; + else if (bf[k]==DLE) + st+="DLE "; + else{ + char d[10]; + sprintf_s(d, "%02X (%d) ", bf[k], bf[k]); + st+=d; + } + } + //MessageBox(NULL, st.c_str(), "Unknown SI response", MB_OK); + } + } + } + else + { + // An error occurred in the ReadFile call. + return false; + } + } while (dwRead); + else + { + // MessageBox(hWndNotify, "EXIT 1", NULL, MB_OK); + // Error in WaitCommEvent + // return false; + } + } + else + { + for(int i=0;i2) + compact = true; + } + } + + if (compact) { + BYTE b2[128*7]; + // 192 punches, sicard6 star + for (int k = 0; k<128*8; k++) { + if (k<128) + b2[k] = b[k]; + else if (k>=256 && k<128*6) + b2[k+128] = b[k]; + else if (k>=128*6) + b2[k-128*5] = b[k]; + } + memcpy(b, b2, sizeof(b2)); + } + + c[0]=ACK; + WriteFile(hComm, c, 1, &written, NULL); + + OutputDebugString("-ACK-"); + SICard card; + GetCard6Data(b, card); + + addCard(card); +} + +void SportIdent::GetSI5Data(HANDLE hComm) +{ + BYTE c[128]; + + c[0]=STX; + c[1]=0x31; + c[2]=ETX; + + DWORD written=0; + WriteFile(hComm, c, 3, &written, NULL); + + if (written==3) + { + Sleep(900); + BYTE bf[256]; + memset(bf, 0, 256); + + int read=ReadBytesDLE(bf, 3, hComm); + + if (read==0) + { + Sleep(1000); + read=ReadBytesDLE(bf, 3, hComm); + } + + if (bf[0]==STX && bf[1]==0x31) + { + + BYTE sum=bf[2]; //Start calc checksum + + read=ReadBytesDLE(bf, 128, hComm); + BYTE cs, etx; + ReadBytesDLE(&cs, 1, hComm); + ReadByte(etx, hComm); + + for(int i=0;i<128;i++) + sum+=bf[i]; + + if (sum==cs) + { + c[0]=ACK; + WriteFile(hComm, c, 1, &written, NULL); + + //BYTE *Card5Data=bf+5; + SICard card; + GetCard5Data(bf, card); + + addCard(card); + } + } + } +} + + + +bool SportIdent::GetCard5Data(BYTE *data, SICard &card) +{ +/* ofstream fout("si.txt"); + + for(int m=0;m<128;m++) + { + if (m%16==0) fout << endl; + + char bf[16]; + sprintf(bf, "%02x ", (DWORD)data[m]); + fout << bf; + } + + fout << endl; + return 0; +*/ + memset(&card, 0, sizeof(card)); + + DWORD number=MAKEWORD(data[5], data[4]); + + if (data[6]==1) + card.CardNumber=number; + else + card.CardNumber=100000*data[6]+number; + + data+=16; + + + AnalyseSI5Time(data+3, card.StartPunch.Time, card.StartPunch.Code); + AnalyseSI5Time(data+5, card.FinishPunch.Time, card.FinishPunch.Code); + AnalyseSI5Time(data+9, card.CheckPunch.Time, card.CheckPunch.Code); + +// card.StartPunch=MAKEWORD(data[4], data[3]); +// card.FinishPunch=MAKEWORD(data[6], data[5]); + card.nPunch=data[7]-1; + + data+=16; + + for (DWORD k=0;k> 2) & 0x0F; +// BYTE month = ((dt1 & 0x03) << 2) + (dt0 >> 6); +// BYTE day = (dt0 >> 1) & 0x1F; + + control=cn; + time=MAKEWORD(ptl, pth)+3600*12*(dt0&0x1); + } + else { + control=-1; + time=0; + } +} + +bool SportIdent::GetCard6Data(BYTE *data, SICard &card) +{ + /*ofstream fout("si.txt"); + + for(int m=0;m<128*3;m++) + { + if (m%16==0) fout << endl; + + char bf[16]; + sprintf_s(bf, 16, "%02x ", (DWORD)data[m]); + fout << bf; + } + + fout << endl;*/ + //return 0; + + memset(&card, 0, sizeof(card)); + + WORD hi=MAKEWORD(data[11], data[10]); + WORD lo=MAKEWORD(data[13], data[12]); + + card.CardNumber=MAKELONG(lo, hi); + + data+=16; + +// DWORD control; +// DWORD time; + + AnalysePunch(data+8, card.StartPunch.Time, card.StartPunch.Code); + AnalysePunch(data+4, card.FinishPunch.Time, card.FinishPunch.Code); + AnalysePunch(data+12, card.CheckPunch.Time, card.CheckPunch.Code); + card.nPunch=min(int(data[2]), 192); + + int i; + + memcpy(card.LastName, data+32, 20); + for(i=19;i>0 && card.LastName[i]==0x20;i--) + card.LastName[i]=0; + + memcpy(card.FirstName, data+32+20, 20); + for(i=19;i>0 && card.FirstName[i]==0x20;i--) + card.FirstName[i]=0; + + data+=128-16; + + for(unsigned k=0;k>6)&0x3); + time=MAKEWORD(ptl, pth)+3600*12*(ptd&0x1); + return true; + } + else + { + control=-1; + time=0; + return false; + } +} + +void SportIdent::AnalyseSI5Time(BYTE *data, DWORD &time, DWORD &control) +{ + if (*LPWORD(data)!=0xEEEE) { + time=MAKEWORD(data[1], data[0]); + + if (ZeroTime<12*3600) { + //Förmiddag + if ( time < ZeroTime ) + time+=12*3600; //->Eftermiddag + } + else { + //Eftermiddag + + if ( time >= ZeroTime%(12*3600) ) { + //Eftermiddag + time+=12*3600; + } + // else Efter midnatt OK. + } + control=0; + } + else { + control=-1; + time=0; + } +} + + +void SportIdent::EnumrateSerialPorts(list &ports) +{ + //Make sure we clear out any elements which may already be in the array + ports.clear(); + + //Determine what OS we are running on + OSVERSIONINFO osvi; + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + BOOL bGetVer = GetVersionEx(&osvi); + + //On NT use the QueryDosDevice API + if (bGetVer && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)) + { + //Use QueryDosDevice to look for all devices of the form COMx. This is a better + //solution as it means that no ports have to be opened at all. + TCHAR szDevices[65535]; + DWORD dwChars = QueryDosDevice(NULL, szDevices, 65535); + if (dwChars) + { + int i=0; + + for (;;) + { + //Get the current device name + TCHAR* pszCurrentDevice = &szDevices[i]; + + //If it looks like "COMX" then + //add it to the array which will be returned + int nLen = _tcslen(pszCurrentDevice); + if (nLen > 3 && _tcsnicmp(pszCurrentDevice, _T("COM"), 3) == 0) + { + //Work out the port number + int nPort = _ttoi(&pszCurrentDevice[3]); + ports.push_front(nPort); + } + + // Go to next NULL character + while(szDevices[i] != _T('\0')) + i++; + + // Bump pointer to the next string + i++; + + // The list is double-NULL terminated, so if the character is + // now NULL, we're at the end + if (szDevices[i] == _T('\0')) + break; + } + } + //else + // TRACE(_T("Failed in call to QueryDosDevice, GetLastError:%d\n"), GetLastError()); + } + else + { + //On 95/98 open up each port to determine their existence + + //Up to 255 COM ports are supported so we iterate through all of them seeing + //if we can open them or if we fail to open them, get an access denied or general error error. + //Both of these cases indicate that there is a COM port at that number. + for (UINT i=1; i<256; i++) + { + //Form the Raw device name + char sPort[256]; + + sprintf_s(sPort, 256, "\\\\.\\COM%d", i); + + //Try to open the port + BOOL bSuccess = FALSE; + HANDLE hPort = ::CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); + if (hPort == INVALID_HANDLE_VALUE) + { + DWORD dwError = GetLastError(); + + //Check to see if the error was because some other app had the port open or a general failure + if (dwError == ERROR_ACCESS_DENIED || dwError == ERROR_GEN_FAILURE) + bSuccess = TRUE; + } + else + { + //The port was opened successfully + bSuccess = TRUE; + + //Don't forget to close the port, since we are going to do nothing with it anyway + CloseHandle(hPort); + } + + //Add the port number to the array which will be returned + if (bSuccess) + ports.push_front(i); + } + } +} + + + +void SportIdent::addCard(const SICard &sic) +{ + EnterCriticalSection(&SyncObj); + try { + ReadCards.push_front(sic); + } + catch(...) { + LeaveCriticalSection(&SyncObj); + throw; + } + LeaveCriticalSection(&SyncObj); + + PostMessage(hWndNotify, WM_USER, ClassId, 0); +} + +void SportIdent::AddPunch(DWORD Time, int Station, int Card, int Mode) +{ + SICard sic; + memset(&sic, 0, sizeof(sic)); + sic.CardNumber=Card; + sic.StartPunch.Code = -1; + sic.CheckPunch.Code = -1; + sic.FinishPunch.Code = -1; + + if (Mode==0 || Mode == 11){ // 11 is dongle + if (Station>30){ + sic.Punch[0].Code=Station; + sic.Punch[0].Time=Time; + sic.nPunch=1; + } + else if (Station == oPunch::PunchStart) { + sic.StartPunch.Time = Time; + sic.StartPunch.Code = oPunch::PunchStart; + } + else if (Station == oPunch::PunchCheck) { + sic.CheckPunch.Time = Time; + sic.CheckPunch.Code = oPunch::PunchCheck; + } + else{ + sic.FinishPunch.Time=Time; + sic.FinishPunch.Code = oPunch::PunchFinish; + } + } + else{ + if (Mode==0x02 || Mode == 50){ + sic.Punch[0].Code=Station; + sic.Punch[0].Time=Time; + sic.nPunch=1; + } + else if (Mode == 3) { + sic.StartPunch.Time=Time; + sic.StartPunch.Code = oPunch::PunchStart; + } + else if (Mode == 10) { + sic.CheckPunch.Time=Time; + sic.CheckPunch.Code = oPunch::PunchCheck; + } + else{ + sic.FinishPunch.Time=Time; + sic.FinishPunch.Code = oPunch::PunchFinish; + } + } + sic.PunchOnly=true; + + addCard(sic); +} + + +bool SportIdent::GetCard(SICard &sic) +{ + bool ret=false; + + EnterCriticalSection(&SyncObj); + + if (!ReadCards.empty()) { + sic=ReadCards.front(); + ReadCards.pop_front(); + ret=true; + } + + LeaveCriticalSection(&SyncObj); + + return ret; +} + +void start_si_thread(void *ptr) +{ + SportIdent *si=(SportIdent *)ptr; + + if (!si->Current_SI_Info) + return; + + EnterCriticalSection(&si->SyncObj); + SI_StationInfo si_info=*si->Current_SI_Info; //Copy data. + si->Current_SI_Info=0; + LeaveCriticalSection(&si->SyncObj); + + if (si_info.ComPort=="TCP") { + si->MonitorTCPSI(si_info.tcpPort, si_info.localZeroTime); + } + else { + if (!si_info.hComm) MessageBox(NULL, "ERROR", 0, MB_OK); + si->MonitorSI(si_info); + } +} + +void SportIdent::StartMonitorThread(const char *com) +{ + SI_StationInfo *si = findStation(com); + + if (si && (si->hComm || si->ComPort=="TCP")) + { + if (si->ComPort=="TCP") + tcpPortOpen=0; + + Current_SI_Info=si; + si->ThreadHandle=(HANDLE)_beginthread(start_si_thread, 0, this); + + while((volatile void *)Current_SI_Info) + Sleep(0); + + if (si->ComPort=="TCP") { + DWORD ec=0; + while( (GetExitCodeThread(si->ThreadHandle, &ec)!=0 && ec==STILL_ACTIVE && tcpPortOpen==0)) + Sleep(0); + } + } + else MessageBox(NULL, "ERROR", 0, MB_OK); +} + +void checkport_si_thread(void *ptr) +{ + int *port=(int *)ptr; + char bf[16]; + sprintf_s(bf, 16, "COM%d", *port); + SportIdent si(NULL, *port); + + if (!si.OpenCom(bf)) + *port=0; //No SI found here + else { + bool valid = true; + SI_StationInfo *sii = si.findStation(bf); + if (sii) { + if (sii->data.empty() || sii->data[0].stationNumber>=1024 || sii->data[0].stationMode>15 || + !(sii->data[0].autoSend || sii->data[0].handShake)) + valid = false; + } + if (valid) + *port = -(*port); + else + *port = 0; + } + si.CloseCom(0); + //_endthread(); +} + + +bool SportIdent::AutoDetect(list &ComPorts) +{ + list Ports; + + EnumrateSerialPorts(Ports); + + int array[128]; + //memset(array, 0, 128*sizeof(int)); + int i=0; + + while(!Ports.empty() && i<128) + { + array[i]=Ports.front(); + Ports.pop_front(); + (HANDLE)_beginthread(checkport_si_thread, 0, &array[i]); + i++; + //Sleep(0); + } + + int maxel=1; + while(maxel>0) + { + Sleep(300); + maxel=0; + + for(int k=0;kComPort=="TCP") + return tcpPortOpen && serverSocket; + else + return si!=0 && si->hComm && si->ThreadHandle; +} + +void SportIdent::getInfoString(const string &com, vector &infov) +{ + infov.clear(); + SI_StationInfo *si = findStation(com); + + if (com=="TCP") { + if (!si || !tcpPortOpen || !serverSocket) { + infov.push_back("TCP: "+lang.tl("ej aktiv.")); + return; + } + + char bf[128]; + sprintf_s(bf, lang.tl("TCP: Port %d, Nolltid: %s").c_str(), tcpPortOpen, "00:00:00"); + infov.push_back(bf); + return; + } + + if (!(si!=0 && si->hComm && si->ThreadHandle)) { + infov.push_back(com+": "+lang.tl("ej aktiv.")); + return; + } + + for (size_t k = 0; k < si->data.size(); k++) { + string info = si->ComPort; + + if (si->data.size() > 1) + info += MakeDash("-") + itos(k+1); + + const SI_StationData &da = si->data[k]; + if (da.extended) info+=lang.tl(": Utökat protokoll. "); + else info+=lang.tl(": Äldre protokoll. "); + + switch(da.stationMode){ + case 2: + case 50: + info+=lang.tl("Kontrol"); + break; + case 4: + info+=lang.tl("Mål"); + break; + case 3: + info+=lang.tl("Start"); + break; + case 5: + info+=lang.tl("Läs brickor"); + break; + case 7: + info+=lang.tl("Töm"); + break; + case 10: + info+=lang.tl("Check"); + break; + case 11: + info+=lang.tl("SRR Dongle ") + (da.radioChannel == 0? lang.tl("red channel.") : lang.tl("blue channel.")); + break; + default: + info+=lang.tl("Okänd funktion"); + } + + if (da.stationNumber) { + char bf[16]; + sprintf_s(bf, " (%d).", da.stationNumber); + info+=bf; + } + + info += lang.tl(" Kommunikation: "); + if (da.autoSend) info+=lang.tl("skicka stämplar."); + else if (da.handShake) info+=lang.tl("handskakning."); + else info+=lang.tl("[VARNING] ingen/okänd."); + + infov.push_back(info); + } +} + +vector SICard::codeLogData(int row) const +{ + vector log; + + log.push_back(itos(row)); + if (readOutTime[0] == 0) + log.push_back(getLocalTime()); + else + log.push_back(readOutTime); + log.push_back(itos(CardNumber)); + log.push_back(""); + log.push_back(""); + log.push_back(FirstName); + log.push_back(LastName); + log.push_back(Club); + log.push_back(""); + log.push_back(""); + log.push_back(""); + log.push_back(""); //email + log.push_back(""); + log.push_back(""); + log.push_back(""); + log.push_back(""); //zip + + log.push_back(""); //CLR_NO + log.push_back(""); + log.push_back(""); + + //We set monday on every punch, since this is our way of + //saying that we have 24-h clock. + if (signed(CheckPunch.Code) >= 0) { + log.push_back(itos(CheckPunch.Code)); + log.push_back("MO"); + log.push_back(formatTime(CheckPunch.Time)); + } + else { + log.push_back(""); //CHCK_NO + log.push_back(""); + log.push_back(""); + } + + if (signed(StartPunch.Code) >= 0) { + log.push_back(itos(StartPunch.Code)); + log.push_back("MO"); + log.push_back(formatTime(StartPunch.Time)); + } + else { + log.push_back(""); //START_NO + log.push_back(""); + log.push_back(""); + } + + if (signed(FinishPunch.Code) >= 0) { + log.push_back(itos(FinishPunch.Code)); + log.push_back("MO"); + log.push_back(formatTime(FinishPunch.Time)); + } + else { + log.push_back(""); //FINISH_NO + log.push_back(""); + log.push_back(""); + } + log.push_back(itos(nPunch)); + + for (int k=0;k<192;k++) { + if (k0) { + log.push_back("MO"); + log.push_back(formatTime(Punch[k].Time)); + } + else { + log.push_back(""); + log.push_back(""); + } + } + else { + log.push_back(""); + log.push_back(""); + log.push_back(""); + } + } + return log; +} + +vector SICard::logHeader() +{ + vector log; + + log.push_back("No."); + log.push_back("read at"); + log.push_back("SI-Card"); + log.push_back("St no"); + log.push_back("cat"); + log.push_back("First name"); + log.push_back("name"); + log.push_back("club"); + log.push_back("country"); + log.push_back("sex"); + log.push_back("year-op"); + log.push_back("EMail"); + log.push_back("mobile"); + log.push_back("city"); + log.push_back("street"); + log.push_back("zip"); + + log.push_back("CLR_CN"); + log.push_back("CLR_DOW"); + log.push_back("clear time"); + + log.push_back("CHK_CN"); + log.push_back("CHK_DOW"); + log.push_back("check time"); + + log.push_back("ST_CN"); + log.push_back("ST_DOW"); + log.push_back("start time"); + + log.push_back("FI_CN"); + log.push_back("FO_DOW"); + log.push_back("Finish time"); + + log.push_back("No. of punches"); + + for (int k=0;k<192;k++) { + string pf = itos(k+1); + log.push_back(pf+".CN"); + log.push_back(pf+".DOW"); + log.push_back(pf+".Time"); + } + return log; +} + +unsigned SICard::calculateHash() const { + unsigned h = nPunch * 100000 + FinishPunch.Time; + for (unsigned i = 0; i < nPunch; i++) { + h = h * 31 + Punch[i].Code; + h = h * 31 + Punch[i].Time; + } + h += StartPunch.Time; + return h; +} + +string SICard::serializePunches() const { + string ser; + if (CheckPunch.Code != -1) + ser += "C-" + itos(CheckPunch.Time); + + if (StartPunch.Code != -1) { + if (!ser.empty()) ser += ";"; + ser += "S-" + itos(StartPunch.Time); + } + for (DWORD i = 0; i < nPunch; i++) { + if (!ser.empty()) ser += ";"; + ser += itos(Punch[i].Code) + "-" + itos(Punch[i].Time); + } + + if (FinishPunch.Code != -1) { + if (!ser.empty()) ser += ";"; + ser += "F-" + itos(FinishPunch.Time); + } + return ser; +} + +void SICard::deserializePunches(const string &arg) { + FinishPunch.Code = -1; + StartPunch.Code = -1; + CheckPunch.Code = -1; + vector out; + split(arg, ";", out); + nPunch = 0; + for (size_t k = 0; k< out.size(); k++) { + vector mark; + split(out[k], "-", mark); + if (mark.size() != 2) + throw std::exception("Invalid string"); + DWORD *tp = 0; + if (mark[0] == "F") { + FinishPunch.Code = 1; + tp = &FinishPunch.Time; + } + else if (mark[0] == "S") { + StartPunch.Code = 1; + tp = &StartPunch.Time; + } + else if (mark[0] == "C") { + CheckPunch.Code = 1; + tp = &CheckPunch.Time; + } + else { + Punch[nPunch].Code = atoi(mark[0].c_str()); + tp = &Punch[nPunch++].Time; + } + + *tp = atoi(mark[1].c_str()); + } + if (out.size() == 1) + PunchOnly = true; +} diff --git a/code/SportIdent.h b/code/SportIdent.h new file mode 100644 index 0000000..bd4acf0 --- /dev/null +++ b/code/SportIdent.h @@ -0,0 +1,227 @@ +// SportIdent.h: interface for the SportIdent class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_SPORTIDENT_H__F13F5795_8FA9_4CE6_8497_7407CD590139__INCLUDED_) +#define AFX_SPORTIDENT_H__F13F5795_8FA9_4CE6_8497_7407CD590139__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ +const BYTE STX=0x02; +const BYTE ETX=0x03; +const BYTE ACK=0x06; +const BYTE DLE=0x10; +const BYTE WAKEUP=0xFF; +const BYTE NAK=0x15; + +// This is taken from r56 and checked in on r63 +#include + +struct SICard5Detect +{ + BYTE code;//Code; + BYTE len; + SHORT station; + DWORD number; + WORD crc; +}; + +struct SIPunch +{ + DWORD Code; + DWORD Time; +}; + +struct SICard +{ + SICard() { + clear(0); + convertedTime = false; + } + // Clears the card if this == condition or condition is 0 + void clear(const SICard *condition) { + if (this==condition || condition==0) + memset(this, 0, sizeof(SICard)); + } + bool empty() const {return CardNumber==0;} + DWORD CardNumber; + SIPunch StartPunch; + SIPunch FinishPunch; + SIPunch CheckPunch; + DWORD nPunch; + SIPunch Punch[192]; + char FirstName[21]; + char LastName[21]; + char Club[41]; + char readOutTime[32]; + bool PunchOnly; + bool convertedTime; + // Used for manual time input + int runnerId; + int relativeFinishTime; + bool statusOK; + bool statusDNF; + + vector codeLogData(int row) const; + static vector logHeader(); + + unsigned calculateHash() const; + bool isManualInput() const {return runnerId != 0;} + + string serializePunches() const; + void deserializePunches(const string &arg); +}; + +struct SI_StationData { + SI_StationData(); + + int stationNumber; + int stationMode; + bool extended; + bool handShake; + bool autoSend; + int radioChannel; +}; + +struct SI_StationInfo +{ + SI_StationInfo(); + HANDLE ThreadHandle; + string ComPort; + HANDLE hComm; + COMMTIMEOUTS TimeOuts; + + vector data; + + int stationMode() const { + if (data.empty()) + return 0; + else + return data[0].stationMode; + } + + bool extended() const { + if (data.empty()) + return false; + bool ext = true; + for (size_t k = 0; k < data.size(); k++) { + if (!data[k].extended) + ext = false; + } + return ext; + } + //Used for TCP ports + WORD tcpPort; + int localZeroTime; +}; + + +class SportIdent +{ +protected: + bool ReadSI6Block(HANDLE hComm, BYTE *data); + bool ReadSystemData(SI_StationInfo *si, int retry=2); + bool ReadSystemDataV2(SI_StationInfo &si); + CRITICAL_SECTION SyncObj; + + DWORD ZeroTime; //Used to analyse times. Seconds 0-24h (0-24*3600) + int ReadByte_delay(BYTE &byte, HANDLE hComm); + int ReadBytes_delay(BYTE *byte, DWORD buffSize, DWORD len, HANDLE hComm); + int ReadBytesDLE_delay(BYTE *byte, DWORD buffSize, DWORD len, HANDLE hComm); + + int ReadByte(BYTE &byte, HANDLE hComm); + int ReadBytes(BYTE *byte, DWORD len, HANDLE hComm); + int ReadBytesDLE(BYTE *byte, DWORD len, HANDLE hComm); + + // Returns zero on failure, number of bytes used on success. + int analyzeStation(BYTE *db, SI_StationData &si); + + SI_StationInfo SI_Info[32]; + int n_SI_Info; //Number of structures.. + SI_StationInfo *Current_SI_Info; //Current SI_Info in use (for thread startup); + + WORD CalcCRC(BYTE *data, DWORD length); + bool CheckCRC(BYTE *bf); + void SetCRC(BYTE *bf); + + bool GetCard5Data(BYTE *data, SICard &card); + bool GetCard6Data(BYTE *data, SICard &card); + bool GetCard9Data(BYTE *data, SICard &card); + + DWORD GetExtCardNumber(BYTE *data) const; + + void GetSI5Data(HANDLE hComm); + void GetSI5DataExt(HANDLE hComm); + + void GetSI6Data(HANDLE hComm); + void GetSI6DataExt(HANDLE hComm); + void GetSI9DataExt(HANDLE hComm); + + void AnalyseSI5Time(BYTE *data, DWORD &time, DWORD &control); + bool AnalysePunch(BYTE *data, DWORD &time, DWORD &control); + void AnalyseTPunch(BYTE *data, DWORD &time, DWORD &control); + + //Card read waiting to be processed. + list ReadCards; + HWND hWndNotify; + DWORD ClassId; + + volatile int tcpPortOpen; + volatile unsigned int serverSocket; + + bool MonitorSI(SI_StationInfo &si); + int MonitorTCPSI(WORD port, int localZeroTime); + +public: + SI_StationInfo *findStation(const string &com); + + void getInfoString(const string &com, vector &info); + bool IsPortOpen(const string &com); + void SetZeroTime(DWORD zt); + bool AutoDetect(list &ComPorts); + void StopMonitorThread(); + + void StartMonitorThread(const char *com); + bool GetCard(SICard &sic); + void addCard(const SICard &sic); + void AddPunch(DWORD Time, int Station, int Card, int Mode=0); + + + void EnumrateSerialPorts(list &ports); + + void CloseCom(const char *com); + bool OpenCom(const char *com); + bool tcpAddPort(int port, DWORD zeroTime); + + bool OpenComListen(const char *com, DWORD BaudRate); + + SportIdent(HWND hWnd, DWORD Id); + virtual ~SportIdent(); + friend void start_si_thread(void *ptr); + +}; + +#endif // !defined(AFX_SPORTIDENT_H__F13F5795_8FA9_4CE6_8497_7407CD590139__INCLUDED_) diff --git a/code/StdAfx.cpp b/code/StdAfx.cpp new file mode 100644 index 0000000..a1655bc --- /dev/null +++ b/code/StdAfx.cpp @@ -0,0 +1,12 @@ +// stdafx.cpp : source file that includes just the standard includes +//meos.pch will be the pre-compiled header +//stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +const string _EmptyString=""; +const string _VacantName="Vakant"; +const string _UnkownName="N.N."; + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/code/StdAfx.h b/code/StdAfx.h new file mode 100644 index 0000000..431715c --- /dev/null +++ b/code/StdAfx.h @@ -0,0 +1,55 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) +#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + +#define NOMINMAX +// Windows Header Files: +#include +#include + +// C RunTime Header Files + +#define _CRTDBG_MAP_ALLOC +#include +#include + +#include +#include + +#include +#include +#include +#include + +using namespace std; +bool getUserFile(char *fileNamePath, const char *fileName); +bool getDesktopFile(char *fileNamePath, const char *fileName, const char *subFolder = 0); +bool getMeOSFile(char *FileNamePath, const char *FileName); + +class gdioutput; +gdioutput *createExtraWindow(const string &tag, const string &title, int max_x = 0, int max_y = 0); +gdioutput *getExtraWindow(const string &tag, bool toForeGround); +string uniqueTag(const char *base); + +void LoadPage(const string &name); + +string getTempFile(); +string getTempPath(); +void removeTempFile(const string &file); // Delete a temporyary +void registerTempFile(const string &tempFile); //Register a file/folder as temporary => autmatic removal on exit. + +const extern string _EmptyString; +const extern string _VacantName; +const extern string _UnkownName; + +#endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) diff --git a/code/TabAuto.cpp b/code/TabAuto.cpp new file mode 100644 index 0000000..1ac1487 --- /dev/null +++ b/code/TabAuto.cpp @@ -0,0 +1,1142 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" + +#include "resource.h" + +#include +#include + +#include "oEvent.h" +#include "xmlparser.h" +#include "gdioutput.h" +#include "csvparser.h" +#include "SportIdent.h" +#include "classconfiginfo.h" +#include "onlineresults.h" +#include "onlineinput.h" + +#include "TabAuto.h" +#include "TabSI.h" +#include "meos_util.h" +#include + +#include "gdiconstants.h" +#include "meosexception.h" + +static TabAuto *tabAuto = 0; +int AutoMachine::uniqueId = 1; + +extern HWND hWndMain; +extern HWND hWndWorkspace; + +TabAuto::TabAuto(oEvent *poe):TabBase(poe) +{ + synchronize=false; + synchronizePunches=false; +} + +AutoMachine *AutoMachine::getMachine(int id) { + if (tabAuto) + return tabAuto->getMachine(id); + throw meosException("Internal error"); +} + +AutoMachine* AutoMachine::construct(Machines ms) { + switch(ms) { + case mPrintResultsMachine: + return new PrintResultMachine(0); + case mSplitsMachine: + return new SplitsMachine(); + case mPrewarningMachine: + return new PrewarningMachine(); + case mPunchMachine: + return new PunchMachine(); + case mOnlineInput: + return new OnlineInput(); + case mOnlineResults: + return new OnlineResults(); + case mSaveBackup: + return new SaveMachine(); + } + throw meosException("Invalid machine"); +} + +AutoMachine *TabAuto::getMachine(int id) { + if (id == 0) + return 0; + list::iterator it; + for (it=machines.begin(); it!=machines.end(); ++it) { + if (*it != 0 && (*it)->getId() == id) { + return *it; + } + } + throw meosException("Service X not found.#" + itos(id)); +} + +TabAuto::~TabAuto(void) +{ + list::iterator it; + for (it=machines.begin(); it!=machines.end(); ++it) { + delete *it; + *it=0; + } + tabAuto=0; +} + + +void tabAutoKillMachines() +{ + if (tabAuto) + tabAuto->killMachines(); +} + +void tabAutoRegister(TabAuto *ta) +{ + tabAuto=ta; +} + +void tabAutoAddMachinge(const AutoMachine &am) +{ + if (tabAuto) { + tabAuto->addMachine(am); + } +} + +void tabForceSync(gdioutput &gdi, pEvent oe) +{ + if (tabAuto) + tabAuto->syncCallback(gdi); +} + +int AutomaticCB(gdioutput *gdi, int type, void *data) +{ + if (!tabAuto) + throw std::exception("tabAuto undefined."); + + switch(type){ + case GUI_BUTTON: { + //Make a copy + ButtonInfo bu=*static_cast(data); + return tabAuto->processButton(*gdi, bu); + } + case GUI_LISTBOX:{ + ListBoxInfo lbi=*static_cast(data); + return tabAuto->processListBox(*gdi, lbi); + } + } + return 0; +} + +void TabAuto::syncCallback(gdioutput &gdi) +{ + string msg; + try { + list::iterator it; + for (it=machines.begin(); it!=machines.end(); ++it) { + AutoMachine *am=*it; + if (am && am->synchronize && !am->isEditMode()) + am->process(gdi, oe, SyncDataUp); + } + } + catch(std::exception &ex) { + msg=ex.what(); + } + catch(...) { + msg="Ett okänt fel inträffade."; + } + if (!msg.empty()) { + gdi.alert(msg); + gdi.setWaitCursor(false); + } + +} + +void TabAuto::updateSyncInfo() +{ + list::iterator it; + synchronize=false; + synchronizePunches=false; + + for (it=machines.begin(); it!=machines.end(); ++it) { + AutoMachine *am=*it; + if (am){ + am->synchronize= am->synchronize || am->synchronizePunches; + synchronize=synchronize || am->synchronize; + synchronizePunches=synchronizePunches || am->synchronizePunches; + } + } +} + +void TabAuto::timerCallback(gdioutput &gdi) +{ + DWORD tc=GetTickCount(); + + list::iterator it; + bool reload=false; + + for (it=machines.begin(); it!=machines.end(); ++it) { + AutoMachine *am=*it; + if (am && am->interval && tc >= am->timeout && !am->isEditMode()) { + am->process(gdi, oe, SyncTimer); + setTimer(am); + reload=true; + } + } + + DWORD d=0; + if (reload && !editMode && gdi.getData("AutoPage", d) && d) + loadPage(gdi); + } + +void TabAuto::setTimer(AutoMachine *am) +{ + DWORD tc=GetTickCount(); + + if (am->interval>0) { + DWORD to=am->interval*1000+tc; + + if (tointerval=0; + } + + am->timeout=to; + } +} + +int TabAuto::processButton(gdioutput &gdi, const ButtonInfo &bu) +{ + + if (bu.id=="GenerateCMP") { +#ifndef MEOSDB + int nClass=gdi.getTextNo("nClass"); + int nRunner=gdi.getTextNo("nRunner"); + + if (nRunner>0 && + gdi.ask("Vill du dumpa aktuellt tävling och skapa en testtävling?")) { + oe->generateTestCompetition(nClass, nRunner, gdi.isChecked("UseRelay")); + gdi.getTabs().get(TCmpTab)->loadPage(gdi); + return 0; + } +#endif + } + else if (bu.id == "BrowseFolder") { + const char *edit = bu.getExtra(); + string currentPath = gdi.getText(edit); + string newPath = gdi.browseForFolder(currentPath, 0); + if (!newPath.empty()) + gdi.setText(edit, newPath); + } + else if (bu.id == "StartBackup") { + SaveMachine *sm=dynamic_cast(getMachine(bu.getExtraInt())); + if (sm) + sm->saveSettings(gdi); + updateSyncInfo(); + loadPage(gdi); + } + else if (bu.id=="Result") { + PrintResultMachine *sm=dynamic_cast(getMachine(bu.getExtraInt())); + settings(gdi, sm, mPrintResultsMachine); + } + else if (bu.id == "BrowseFile") { + static int index = 0; + vector< pair > ext; + ext.push_back(make_pair("Webbdokument", "*.html;*.htm")); + + string file = gdi.browseForSave(ext, "html", index); + if (!file.empty()) + gdi.setText("ExportFile", file); + } + else if (bu.id == "BrowseScript") { + vector< pair > ext; + ext.push_back(make_pair("Skript", "*.bat;*.exe;*.js")); + + string file = gdi.browseForOpen(ext, "bat"); + if (!file.empty()) + gdi.setText("ExportScript", file); + } + else if (bu.id == "DoExport") { + bool stat = gdi.isChecked(bu.id); + gdi.setInputStatus("ExportFile", stat); + gdi.setInputStatus("ExportScript", stat); + gdi.setInputStatus("BrowseFile", stat); + gdi.setInputStatus("BrowseScript", stat); + gdi.setInputStatus("HTMLRefresh", stat); + gdi.setInputStatus("StructuredExport", stat); + } + else if (bu.id == "DoPrint") { + bool stat = gdi.isChecked(bu.id); + gdi.setInputStatus("PrinterSetup", stat); + } + else if (bu.id=="Splits") { + SplitsMachine *sm=dynamic_cast(getMachine(bu.getExtraInt())); + settings(gdi, sm, mSplitsMachine); + } + else if (bu.id=="Prewarning") { + PrewarningMachine *sm=dynamic_cast(getMachine(bu.getExtraInt())); + settings(gdi, sm, mPrewarningMachine); + } + else if (bu.id=="Punches") { + PunchMachine *sm=dynamic_cast(getMachine(bu.getExtraInt())); + settings(gdi, sm, mPunchMachine); + } + else if (bu.id=="OnlineResults") { + OnlineResults *sm=dynamic_cast(getMachine(bu.getExtraInt())); + settings(gdi, sm, mOnlineResults); + } + else if (bu.id=="OnlineInput") { + OnlineInput *sm=dynamic_cast(getMachine(bu.getExtraInt())); + settings(gdi, sm, mOnlineInput); + } + else if (bu.id=="SaveBackup") { + SaveMachine *sm=dynamic_cast(getMachine(bu.getExtraInt())); + settings(gdi, sm, mSaveBackup); + } + else if (bu.id=="StartResult") { +#ifndef MEOSDB + string minute=gdi.getText("Interval"); + int t=convertAbsoluteTimeMS(minute); + + if (t<2 || t>7200) { + gdi.alert("Intervallet måste anges på formen MM:SS."); + } + else { + PrintResultMachine *prm=dynamic_cast(getMachine(bu.getExtraInt())); + + if (prm) { + prm->interval = t; + prm->doExport = gdi.isChecked("DoExport"); + prm->doPrint = gdi.isChecked("DoPrint"); + prm->exportFile = gdi.getText("ExportFile"); + prm->exportScript = gdi.getText("ExportScript"); + prm->structuredExport = gdi.isChecked("StructuredExport"); + prm->htmlRefresh = gdi.isChecked("HTMLRefresh") ? t : 0; + if (!prm->readOnly) { + gdi.getSelection("Classes", prm->classesToPrint); + + ListBoxInfo lbi; + if (gdi.getSelectedItem("ListType", lbi)) { + oListParam par; + par.selection=prm->classesToPrint; + par.listCode = EStdListType(lbi.data); + par.pageBreak = gdi.isChecked("PageBreak"); + par.showInterTimes = gdi.isChecked("ShowInterResults"); + par.splitAnalysis = gdi.isChecked("SplitAnalysis"); + int legNr = gdi.getSelectedItem("LegNumber").first; + if (legNr >= 0) + par.setLegNumberCoded(legNr); + else + par.setLegNumberCoded(0); + + oe->generateListInfo(par, gdi.getLineHeight(), prm->listInfo); + } + } + prm->po.onlyChanged = gdi.isChecked("OnlyChanged"); + prm->pageBreak = gdi.isChecked("PageBreak"); + prm->showInterResult = gdi.isChecked("ShowInterResults"); + prm->splitAnalysis = gdi.isChecked("SplitAnalysis"); + prm->synchronize=true; //To force continuos data sync. + setTimer(prm); + } + updateSyncInfo(); + loadPage(gdi); + } +#endif + } + else if (bu.id=="StartSplits") { + + string ivt = gdi.getText("Interval"); + + int iv = gdi.getTextNo("Interval"); + const string &file=gdi.getText("FileName"); + + if (!ivt.empty() && (iv < 1 || iv > 7200)) { + throw meosException("Ogiltigt antal sekunder: X#" + gdi.getText("Interval")); + } + + if (file.empty()) { + throw meosException("Filnamnet får inte vara tomt"); + } + + //Try exporting. + oe->exportIOFSplits(oEvent::IOF20, file.c_str(), true, false, + set(), -1, false, true, true, false); + SplitsMachine *sm=dynamic_cast(getMachine(bu.getExtraInt())); + + if (sm) { + sm->interval=iv; + + sm->file=file; + sm->synchronize=true; + setTimer(sm); + } + updateSyncInfo(); + loadPage(gdi); + } + else if (bu.id=="Save") { // General save + AutoMachine *sm=getMachine(bu.getExtraInt()); + if (sm) { + sm->save(*oe, gdi); + setTimer(sm); + } + updateSyncInfo(); + loadPage(gdi); + } + else if (bu.id=="StartPrewarning") { + PrewarningMachine *pwm=dynamic_cast(getMachine(bu.getExtraInt())); + + if (pwm) { + pwm->waveFolder=gdi.getText("WaveFolder"); + gdi.getSelection("Controls", pwm->controls); + + oe->synchronizeList(oLPunchId); + oe->clearPrewarningSounds(); + + pwm->synchronizePunches=true; + pwm->controlsSI.clear(); + for (set::iterator it=pwm->controls.begin();it!=pwm->controls.end();++it) { + pControl pc=oe->getControl(*it, false); + + if (pc) + pwm->controlsSI.insert(pc->Numbers, pc->Numbers+pc->nNumbers); + } + } + updateSyncInfo(); + loadPage(gdi); + } + else if (bu.id=="StartPunch") { + + string minute=gdi.getText("Interval"); + int t=atoi(minute.c_str()); + + if (t<1 || t>7200) { + throw meosException("Ogiltigt antal sekunder: X#" + minute); + } + else { + PunchMachine *pm=dynamic_cast(getMachine(bu.getExtraInt())); + + if (pm) { + pm->interval=t; + pm->radio=gdi.getTextNo("Radio"); + setTimer(pm); + } + } + updateSyncInfo(); + loadPage(gdi); + } + else if (bu.id == "Cancel") { + loadPage(gdi); + } + else if (bu.id == "Stop") { + if (bu.getExtraInt()) + stopMachine(getMachine(bu.getExtraInt())); + + updateSyncInfo(); + loadPage(gdi); + } + else if (bu.id == "PrinterSetup") { + PrintResultMachine *prm = + dynamic_cast(getMachine(bu.getExtraInt())); + + if (prm) { + gdi.printSetup(prm->po); + } + } + else if (bu.id == "PrintNow") { + PrintResultMachine *prm = + dynamic_cast(getMachine(bu.getExtraInt())); + + if (prm) { + prm->process(gdi, oe, SyncNone); + setTimer(prm); + loadPage(gdi); + } + } + else if (bu.id == "SelectAll") { + const char *ctrl = bu.getExtra(); + set lst; + lst.insert(-1); + gdi.setSelection(ctrl, lst); + } + else if (bu.id == "SelectNone") { + const char *ctrl= bu.getExtra(); + set lst; + gdi.setSelection(ctrl, lst); + } + else if (bu.id == "TestVoice") { + PrewarningMachine *pwm=dynamic_cast(getMachine(bu.getExtraInt())); + + if (pwm) + oe->tryPrewarningSounds(pwm->waveFolder, rand()%400+1); + } + else if ( bu.id == "WaveBrowse") { + string wf=gdi.browseForFolder(gdi.getText("WaveFolder"), 0); + + if (wf.length()>0) + gdi.setText("WaveFolder", wf); + } + else if ( bu.id == "BrowseSplits") { + int index=0; + vector< pair > ext; + ext.push_back(make_pair("Sträcktider", "*.xml")); + + string wf = gdi.browseForSave(ext, "xml", index); + + if (!wf.empty()) + gdi.setText("FileName", wf); + } + + return 0; +} + +int TabAuto::processListBox(gdioutput &gdi, const ListBoxInfo &bu) +{ + return 0; +} + +bool TabAuto::stopMachine(AutoMachine *am) +{ + list::iterator it; + for (it=machines.begin(); it!=machines.end(); ++it) + if (am==*it) { + if (am->stop()) { + delete am; + machines.erase(it); + return true; + } + } + return false; +} + +void TabAuto::settings(gdioutput &gdi, AutoMachine *sm, Machines ms) { + editMode=true; + bool createNew = (sm==0); + if (!sm) { + sm = AutoMachine::construct(ms); + machines.push_back(sm); + } + + gdi.restore("", false); + gdi.dropLine(); + int cx = gdi.getCX(); + int cy = gdi.getCY(); + int d = gdi.scaleLength(6); + gdi.setCX(cx + d); + sm->setEditMode(true); + sm->settings(gdi, *oe, createNew); + int w = gdi.getWidth(); + int h = gdi.getHeight(); + + RECT rc; + rc.top = cy - d; + rc.bottom = h + d; + rc.left = cx - d; + rc.right = w + d; + gdi.addRectangle(rc, colorLightBlue, true, true); + gdi.refresh(); +} + +void TabAuto::killMachines() +{ + while(!machines.empty()) { + machines.back()->stop(); + delete machines.back(); + machines.pop_back(); + } + AutoMachine::resetGlobalId(); +} + +bool TabAuto::loadPage(gdioutput &gdi) +{ + oe->checkDB(); + tabAuto=this; + editMode=false; + gdi.selectTab(tabId); + DWORD isAP = 0; + gdi.getData("AutoPage", isAP); + int storedOY = 0; + int storedOX = 0; + if (isAP) { + storedOY = gdi.GetOffsetY(); + storedOX = gdi.GetOffsetX(); + } + + gdi.clearPage(false); + gdi.setData("AutoPage", 1); + gdi.addString("", boldLarge, "Automater"); + gdi.setRestorePoint(); + + gdi.addString("", 10, "help:10000"); + + gdi.dropLine(); + gdi.addString("", fontMediumPlus, "Tillgängliga automater").setColor(colorDarkBlue); + gdi.dropLine(); + gdi.fillRight(); + gdi.pushX(); + gdi.addButton("Result", "Resultatutskrift / export", AutomaticCB, "tooltip:resultprint"); + gdi.addButton("OnlineResults", "Resultat online", AutomaticCB, "Publicera resultat direkt på nätet"); + gdi.addButton("OnlineInput", "Inmatning online", AutomaticCB, "Hämta stämplingar m.m. från nätet"); + gdi.popX(); + gdi.dropLine(2.5); + gdi.addButton("Splits", "Sträcktider (WinSplits)", AutomaticCB, "Spara sträcktider till en fil för automatisk synkronisering med WinSplits"); + gdi.addButton("Prewarning", "Förvarningsröst", AutomaticCB, "tooltip:voice"); + gdi.addButton("Punches", "Stämplingstest", AutomaticCB, "Simulera inläsning av stämplar"); + gdi.popX(); + gdi.dropLine(2.5); + gdi.addButton("SaveBackup", "Säkerhetskopiering", AutomaticCB); + + gdi.fillDown(); + gdi.dropLine(3); + gdi.popX(); + + if (!machines.empty()) { + gdi.addString("", fontMediumPlus, "Startade automater").setColor(colorDarkBlue);; + list::iterator it; + + int baseX = gdi.getCX(); + int dx = gdi.scaleLength(6); + + for (it=machines.begin(); it!=machines.end(); ++it) { + AutoMachine *am=*it; + if (am) { + RECT rc; + rc.left = baseX; + rc.right = gdi.scaleLength(500); + rc.top = gdi.getCY(); + gdi.dropLine(0.5); + gdi.setCX(baseX+dx); + am->setEditMode(false); + am->status(gdi); + gdi.setCX(baseX); + gdi.dropLine(0.5); + rc.bottom = gdi.getCY(); + gdi.addRectangle(rc, colorLightGreen, true, true); + gdi.dropLine(); + } + } + gdi.dropLine(); + } + + if (isAP) { + gdi.setOffset(storedOY, storedOY, true); + } + + gdi.refresh(); + return true; +} + +void AutoMachine::settingsTitle(gdioutput &gdi, char *title) { + gdi.dropLine(0.5); + gdi.addString("", fontMediumPlus, title).setColor(colorDarkBlue); + gdi.dropLine(0.5); +} + +void AutoMachine::startCancelInterval(gdioutput &gdi, char *startCommand, bool created, IntervalType type, const string &interval) { + gdi.pushX(); + gdi.fillRight(); + if (type == IntervalMinute) + gdi.addInput("Interval", interval, 7, 0, "Tidsintervall (MM:SS):"); + else if (type == IntervalSecond) + gdi.addInput("Interval", interval, 7, 0, "Tidsintervall (sekunder):"); + gdi.dropLine(1); + gdi.addButton(startCommand, "Starta automaten", AutomaticCB).setExtra(getId()); + gdi.addButton(created ? "Stop":"Cancel", "Avbryt", AutomaticCB).setExtra(getId()); + + gdi.popX(); + gdi.fillDown(); + gdi.dropLine(2.5); + int dx = gdi.scaleLength(3); + RECT rc; + rc.left = gdi.getCX() - dx; + rc.right = rc.left + gdi.scaleLength(450); + rc.top = gdi.getCY(); + rc.bottom = rc.top + dx; + gdi.addRectangle(rc, colorDarkBlue, false, false); + gdi.dropLine(); +} + + +void PrintResultMachine::settings(gdioutput &gdi, oEvent &oe, bool created) { + settingsTitle(gdi, "Resultatutskrift / export"); + string time=created ? "10:00" : getTimeMS(interval); + startCancelInterval(gdi, "StartResult", created, IntervalMinute, time); + + if (created) { + oe.getAllClasses(classesToPrint); + } + + gdi.pushX(); + gdi.fillRight(); + gdi.addCheckbox("DoPrint", "Skriv ut", AutomaticCB, doPrint); + gdi.dropLine(-0.5); + gdi.addButton("PrinterSetup", "Skrivare...", AutomaticCB, "Välj skrivare...").setExtra(getId()); + + gdi.dropLine(4); + gdi.popX(); + gdi.addCheckbox("DoExport", "Exportera", AutomaticCB, doExport); + gdi.dropLine(-1); + int cx = gdi.getCX(); + gdi.addInput("ExportFile", exportFile, 32, 0, "Fil att exportera till:"); + gdi.dropLine(0.7); + gdi.addButton("BrowseFile", "Bläddra...", AutomaticCB); + gdi.setCX(cx); + gdi.dropLine(2.3); + gdi.addCheckbox("StructuredExport", "Strukturerat exportformat", 0, structuredExport); + gdi.addCheckbox("HTMLRefresh", "HTML med AutoRefresh", 0, htmlRefresh != 0); + gdi.dropLine(1.2); + gdi.setCX(cx); + gdi.addInput("ExportScript", exportScript, 32, 0, "Skript att köra efter export:"); + gdi.dropLine(0.7); + gdi.addButton("BrowseScript", "Bläddra...", AutomaticCB); + gdi.dropLine(3); + gdi.popX(); + + gdi.setInputStatus("ExportFile", doExport); + gdi.setInputStatus("ExportScript", doExport); + gdi.setInputStatus("BrowseFile", doExport); + gdi.setInputStatus("BrowseScript", doExport); + gdi.setInputStatus("StructuredExport", doExport); + gdi.setInputStatus("HTMLRefresh", doExport); + gdi.setInputStatus("PrinterSetup", doPrint); + + if (!readOnly) { + gdi.fillDown(); + gdi.addString("", 1, "Listval"); + gdi.dropLine(); + gdi.fillRight(); + gdi.addListBox("Classes", 150,300,0,"","", true); + gdi.pushX(); + gdi.fillDown(); + vector< pair > d; + gdi.addItem("Classes", oe.fillClasses(d, oEvent::extraNone, oEvent::filterNone)); + gdi.setSelection("Classes", classesToPrint); + + gdi.addSelection("ListType", 200, 100, 0, "Lista"); + oe.fillListTypes(gdi, "ListType", 1); + if (notShown) { + notShown = false; + ClassConfigInfo cnf; + oe.getClassConfigurationInfo(cnf); + int type = EStdResultListLARGE; + if (cnf.hasRelay()) + type = EStdTeamAllLegLARGE; + else if (cnf.hasPatrol()) + type = EStdPatrolResultListLARGE; + + gdi.selectItemByData("ListType", type); + } + else + gdi.selectItemByData("ListType", listInfo.getListCode()); + + gdi.addSelection("LegNumber", 140, 300, 0, "Sträcka:"); + set clsUnused; + vector< pair > out; + oe.fillLegNumbers(clsUnused, listInfo.isTeamList(), true, out); + gdi.addItem("LegNumber", out); + gdi.selectItemByData("LegNumber", listInfo.getLegNumberCoded()); + + gdi.addCheckbox("PageBreak", "Sidbrytning mellan klasser", 0, pageBreak); + gdi.addCheckbox("ShowInterResults", "Visa mellantider", 0, showInterResult, + "Mellantider visas för namngivna kontroller."); + gdi.addCheckbox("SplitAnalysis", "Med sträcktidsanalys", 0, splitAnalysis); + + gdi.addCheckbox("OnlyChanged", "Skriv endast ut ändade sidor", 0, po.onlyChanged); + + gdi.popX(); + gdi.addButton("SelectAll", "Välj allt", AutomaticCB, "").setExtra("Classes"); + gdi.popX(); + gdi.addButton("SelectNone", "Välj inget", AutomaticCB, "").setExtra("Classes"); + } + else { + gdi.fillDown(); + gdi.addString("", 1, "Lista av typ 'X'#" + listInfo.getName()); + gdi.addCheckbox("OnlyChanged", "Skriv endast ut ändade sidor", 0, po.onlyChanged); + } +} + +void PrintResultMachine::process(gdioutput &gdi, oEvent *oe, AutoSyncType ast) +{ + if (lock) + return; + + if (ast!=SyncDataUp) { + string printError; + lock = true; + try { + gdioutput gdiPrint("print", gdi.getScale(), gdi.getEncoding()); + gdiPrint.clearPage(false); + oe->generateList(gdiPrint, true, listInfo, false); + if (doPrint) { + gdiPrint.refresh(); + try { + gdiPrint.print(po, oe); + } + catch (const meosException &ex) { + printError = ex.what(); + if (printError.empty()) + printError = "Printing failed (X: Y) Z#Auto#0#Unknown"; + } + } + if (doExport) { + if (!exportFile.empty()) { + if (structuredExport) + gdiPrint.writeTableHTML(gdi.toWide(exportFile), oe->getName(), htmlRefresh); + else + gdiPrint.writeHTML(gdi.toWide(exportFile), oe->getName(), htmlRefresh); + + if (!exportScript.empty()) { + ShellExecute(NULL, NULL, exportScript.c_str(), exportFile.c_str(), NULL, SW_HIDE); + } + } + } + } + catch (...) { + lock = false; + throw; + } + lock = false; + + if (!printError.empty() && !errorLock) { + errorLock = true; + gdi.alert(printError); + errorLock = false; + } + } +} + +void PrintResultMachine::status(gdioutput &gdi) +{ + gdi.fillRight(); + gdi.pushX(); + gdi.addString("", 0, name); + gdi.addString("", 0, listInfo.getName()); + gdi.dropLine(); + if (doExport) { + gdi.popX(); + gdi.addString("", 0, "Målfil: "); + gdi.addStringUT(0, exportFile).setColor(colorRed); + gdi.dropLine(); + } + gdi.fillRight(); + gdi.popX(); + if (interval>0){ + gdi.addString("", 0, "Automatisk utskrift / export: "); + gdi.addTimer(gdi.getCY(), gdi.getCX(), timerIgnoreSign, (GetTickCount()-timeout)/1000); + } + else { + + } + gdi.popX(); + gdi.dropLine(2); + gdi.addButton("Stop", "Stoppa automaten", AutomaticCB).setExtra(getId()); + gdi.addButton("PrintNow", "Exportera nu", AutomaticCB).setExtra(getId()); + gdi.fillDown(); + gdi.addButton("Result", "Inställningar...", AutomaticCB).setExtra(getId()); + gdi.popX(); +} + +void PrewarningMachine::settings(gdioutput &gdi, oEvent &oe, bool created) { + settingsTitle(gdi, "Förvarningsröst"); + startCancelInterval(gdi, "StartPrewarning", created, IntervalNone, ""); + + gdi.addString("", 10, "help:computer_voice"); + + gdi.pushX(); + gdi.fillRight(); + gdi.addInput("WaveFolder", waveFolder, 32, 0, "Ljudfiler, baskatalog."); + + gdi.fillDown(); + gdi.dropLine(); + gdi.addButton("WaveBrowse", "Bläddra...", AutomaticCB); + gdi.popX(); + + gdi.addListBox("Controls", 100, 200, 0, "", "", true); + gdi.pushX(); + gdi.fillDown(); + vector< pair > d; + oe.fillControls(d, oEvent::CTCourseControl); + gdi.addItem("Controls", d); + gdi.setSelection("Controls", controls); + gdi.popX(); + gdi.addButton("SelectAll", "Välj alla", AutomaticCB, "").setExtra("Controls"); + gdi.popX(); +} + +void PrewarningMachine::process(gdioutput &gdi, oEvent *oe, AutoSyncType ast) +{ + oe->playPrewarningSounds(waveFolder, controlsSI); +} + +void PrewarningMachine::status(gdioutput &gdi) +{ + gdi.addString("", 1, name); + + string info="Förvarning på (SI-kod): "; + bool first=true; + + if (controls.empty()) + info+="alla stämplingar"; + else { + for (set::iterator it=controlsSI.begin();it!=controlsSI.end();++it) { + char bf[32]; + _itoa_s(*it, bf, 10); + + if (!first) info+=", "; + else first=false; + + info+=bf; + } + } + gdi.addString("", 0, info); + gdi.fillRight(); + gdi.pushX(); + + gdi.popX(); + gdi.dropLine(0.3); + gdi.addButton("Stop", "Stoppa automaten", AutomaticCB).setExtra(getId()); + gdi.addButton("TestVoice", "Testa rösten", AutomaticCB).setExtra(getId()); + gdi.fillDown(); + gdi.addButton("Prewarning", "Inställningar...", AutomaticCB).setExtra(getId()); + gdi.popX(); +} + +void PunchMachine::settings(gdioutput &gdi, oEvent &oe, bool created) { + settingsTitle(gdi, "Test av stämplingsinläsningar"); + string time=created ? "10" : itos(interval); + startCancelInterval(gdi, "StartPunch", created, IntervalSecond, time); + + gdi.addString("", 10, "help:simulate"); + + gdi.pushX(); + gdi.fillRight(); + gdi.dropLine(); + + gdi.addString("", 0, "Radiotider, kontroll:"); + gdi.dropLine(-0.2); + gdi.addInput("Radio", "", 6, 0); + + gdi.fillDown(); + gdi.popX(); + gdi.dropLine(5); + gdi.addString("", 1, "Generera testtävling"); + gdi.fillRight(); + gdi.addInput("nRunner", "100", 10, 0, "Antal löpare"); + gdi.addInput("nClass", "10", 10, 0, "Antal klasser"); + gdi.dropLine(); + gdi.addCheckbox("UseRelay", "Med stafettklasser"); + gdi.addButton("GenerateCMP", "Generera testtävling", AutomaticCB); +} + +void PunchMachine::status(gdioutput &gdi) +{ + gdi.addString("", 1, name); + gdi.fillRight(); + gdi.pushX(); + if (interval>0){ + gdi.addString("", 0, "Stämplar om: "); + gdi.addTimer(gdi.getCY(), gdi.getCX(), timerIgnoreSign|timeSeconds, (GetTickCount()-timeout)/1000); + gdi.addString("", 0, "(sekunder)"); + } + else { + + } + gdi.popX(); + gdi.dropLine(2); + gdi.addButton("Stop", "Stoppa automaten", AutomaticCB).setExtra(getId()); + gdi.fillDown(); + gdi.addButton("Punches", "Inställningar...", AutomaticCB).setExtra(getId()); + gdi.popX(); +} + +void PunchMachine::process(gdioutput &gdi, oEvent *oe, AutoSyncType ast) +{ +#ifndef MEOSDB + SICard sic; + oe->generateTestCard(sic); + SportIdent &si = TabSI::getSI(gdi); + if (!sic.empty()) { + if (!radio) si.addCard(sic); + } + else gdi.addInfoBox("", "Failed to generate card.", interval*2); + + if (radio && !sic.empty()) { + pRunner r=oe->getRunnerByCardNo(sic.CardNumber, 0, false); + if (r && r->getCardNo()) { + sic.CardNumber=r->getCardNo(); + sic.PunchOnly=true; + sic.nPunch=1; + sic.Punch[0].Code=radio; + si.addCard(sic); + } + } +#endif +} + +void SplitsMachine::settings(gdioutput &gdi, oEvent &oe, bool created) { + string time = ""; + if (interval>0) + time = itos(interval); + else if (created) + time = "30"; + + settingsTitle(gdi, "Sträcktider / WinSplits"); + startCancelInterval(gdi, "StartSplits", created, IntervalSecond, time); + + gdi.addString("", 0, "Intervall (sekunder). Lämna blankt för att uppdatera när " + "tävlingsdata ändras."); + gdi.dropLine(); + + gdi.addString("", 10, "help:winsplits_auto"); + + + gdi.dropLine(); + gdi.fillRight(); + gdi.addInput("FileName", file, 30, 0, "Filnamn:"); + gdi.dropLine(0.9); + gdi.addButton("BrowseSplits", "Bläddra...", AutomaticCB); + + gdi.popX(); + gdi.dropLine(2); + +} + +void SplitsMachine::status(gdioutput &gdi) +{ + gdi.addString("", 1, name); + if (!file.empty()) { + gdi.fillRight(); + gdi.pushX(); + gdi.addString("", 0, "Fil: X#" + file); + + if (interval>0){ + gdi.popX(); + gdi.dropLine(1); + gdi.addString("", 0, "Skriver sträcktider om: "); + gdi.addTimer(gdi.getCY(), gdi.getCX(), timerIgnoreSign|timeSeconds, (GetTickCount()-timeout)/1000); + gdi.addString("", 0, "(sekunder)"); + } + else { + gdi.dropLine(1); + gdi.addString("", 0, "Skriver sträcktider när tävlingsdata ändras."); + } + + gdi.popX(); + } + gdi.dropLine(2); + gdi.addButton("Stop", "Stoppa automaten", AutomaticCB).setExtra(getId()); + gdi.fillDown(); + gdi.addButton("Splits", "Inställningar...", AutomaticCB).setExtra(getId()); + gdi.popX(); +} + +void SplitsMachine::process(gdioutput &gdi, oEvent *oe, AutoSyncType ast) +{ + if ((interval>0 && ast==SyncTimer) || (interval==0 && ast==SyncDataUp)) { + if (!file.empty()) + oe->exportIOFSplits(oEvent::IOF20, file.c_str(), true, false, classes, + leg, false, true, true, false); + } +} + +void SaveMachine::status(gdioutput &gdi) { + gdi.addString("", 1, name); + if (!baseFile.empty()) { + gdi.fillRight(); + gdi.pushX(); + gdi.addString("", 0, "Destination: X#" + baseFile); + + if (interval>0){ + gdi.popX(); + gdi.dropLine(1); + gdi.addString("", 0, "Säkerhetskopierar om: "); + gdi.addTimer(gdi.getCY(), gdi.getCX(), timerIgnoreSign, (GetTickCount()-timeout)/1000); + } + + gdi.popX(); + } + gdi.dropLine(2); + gdi.addButton("Stop", "Stoppa automaten", AutomaticCB).setExtra(getId()); + gdi.fillDown(); + gdi.addButton("SaveBackup", "Inställningar...", AutomaticCB).setExtra(getId()); + gdi.popX(); +} + +void SaveMachine::process(gdioutput &gdi, oEvent *oe, AutoSyncType ast) { + if (interval>0 && ast==SyncTimer) { + if (!baseFile.empty()) { + string file = baseFile + "meos_backup_" + oe->getDate() + "_" + itos(saveIter++) + ".xml"; + oe->autoSynchronizeLists(true); + oe->save(file); + } + } +} + +void SaveMachine::settings(gdioutput &gdi, oEvent &oe, bool created) { + settingsTitle(gdi, "Säkerhetskopiering"); + string time=created ? "10:00" : getTimeMS(interval); + startCancelInterval(gdi, "StartBackup", created, IntervalMinute, time); + + int cx = gdi.getCX(); + gdi.addInput("BaseFile", baseFile, 32, 0, "Mapp:"); + gdi.dropLine(0.7); + gdi.addButton("BrowseFolder", "Bläddra...", AutomaticCB).setExtra("BaseFile"); + gdi.setCX(cx); +} + +void SaveMachine::saveSettings(gdioutput &gdi) { + + string minute=gdi.getText("Interval"); + int t=convertAbsoluteTimeMS(minute); + + if (t<2 || t>7200) { + throw meosException("Intervallet måste anges på formen MM:SS."); + } + string f = gdi.getText("BaseFile"); + if (f.empty()) { + throw meosException("Filnamnet får inte vara tomt"); + } + + if (*f.rbegin() != '\\' && *f.rbegin() != '/') + f += "\\"; + + string sample = f + "sample.txt"; + ofstream fout(sample.c_str(), ios_base::trunc|ios_base::out); + bool bad = false; + if (fout.bad()) + bad = true; + else { + fout << "foo" << endl; + fout.close(); + bad = fout.bad(); + remove(sample.c_str()); + } + if (bad) + throw meosException("Ogiltig destination X#" + f); + + baseFile = f; + interval = t; +} + +void TabAuto::clearCompetitionData() { +} diff --git a/code/TabAuto.h b/code/TabAuto.h new file mode 100644 index 0000000..bd94288 --- /dev/null +++ b/code/TabAuto.h @@ -0,0 +1,287 @@ +#pragma once +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "tabbase.h" +#include "gdioutput.h" +#include "Printer.h" +#include +#include "oListInfo.h" + +using namespace std; + +class TabAuto; +class gdioutput; +class oEvent; + +enum AutoSyncType {SyncNone, SyncTimer, SyncDataUp}; + +enum Machines { + mPunchMachine, + mPrintResultsMachine, + mSplitsMachine, + mPrewarningMachine, + mOnlineResults, + mOnlineInput, + mSaveBackup, +}; + +class AutoMachine +{ +private: + int myid; + static int uniqueId; +protected: + bool editMode; + + void settingsTitle(gdioutput &gdi, char *title); + enum IntervalType {IntervalNone, IntervalMinute, IntervalSecond}; + void startCancelInterval(gdioutput &gdi, char *startCommand, bool created, IntervalType type, const string &interval); + +public: + static AutoMachine *getMachine(int id); + static void resetGlobalId() {uniqueId = 1;} + int getId() const {return myid;} + static AutoMachine* construct(Machines); + void setEditMode(bool em) {editMode = em;} + string name; + DWORD interval; //Interval seconds + DWORD timeout; //Timeout (TickCount) + bool synchronize; + bool synchronizePunches; + virtual void settings(gdioutput &gdi, oEvent &oe, bool created) = 0; + virtual void save(oEvent &oe, gdioutput &gdi) {} + virtual void process(gdioutput &gdi, oEvent *oe, AutoSyncType ast) = 0; + virtual bool isEditMode() const {return editMode;} + virtual void status(gdioutput &gdi) = 0; + virtual bool stop() {return true;} + virtual AutoMachine *clone() const = 0; + AutoMachine(const string &s) : myid(uniqueId++), name(s), interval(0), timeout(0), + synchronize(false), synchronizePunches(false), editMode(false) {} + virtual ~AutoMachine() = 0 {} +}; + +class PrintResultMachine : + public AutoMachine +{ +protected: + string exportFile; + string exportScript; + bool doExport; + bool doPrint; + bool structuredExport; + PrinterObject po; + set classesToPrint; + bool pageBreak; + bool showInterResult; + bool splitAnalysis; + bool notShown; + oListInfo listInfo; + bool readOnly; + int htmlRefresh; + bool lock; // true while printing + bool errorLock; // true while showing error dialog +public: + PrintResultMachine *clone() const { + PrintResultMachine *prm = new PrintResultMachine(*this); + prm->lock = false; + prm->errorLock = false; + return prm; + } + void status(gdioutput &gdi); + void process(gdioutput &gdi, oEvent *oe, AutoSyncType ast); + void settings(gdioutput &gdi, oEvent &oe, bool created); + + PrintResultMachine(int v):AutoMachine("Resultatutskrift") { + interval=v; + pageBreak = true; + showInterResult = true; + notShown = true; + splitAnalysis = true; + lock = false; + errorLock = false; + readOnly = false; + doExport = false; + doPrint = true; + structuredExport = true; + htmlRefresh = v; + } + PrintResultMachine(int v, const oListInfo &li):AutoMachine("Utskrift / export"), listInfo(li) { + interval=v; + pageBreak = true; + showInterResult = true; + notShown = true; + splitAnalysis = true; + lock = false; + errorLock = false; + readOnly = true; + doExport = false; + doPrint = true; + structuredExport = false; + htmlRefresh = v; + } + friend class TabAuto; +}; + +class SaveMachine : + public AutoMachine +{ +protected: + string baseFile; + int saveIter; +public: + SaveMachine *clone() const { + SaveMachine *prm = new SaveMachine(*this); + return prm; + } + + void status(gdioutput &gdi); + void process(gdioutput &gdi, oEvent *oe, AutoSyncType ast); + void settings(gdioutput &gdi, oEvent &oe, bool created); + void saveSettings(gdioutput &gdi); + + SaveMachine():AutoMachine("Säkerhetskopiera") , saveIter(0) { + } +}; + + +class PrewarningMachine : + public AutoMachine +{ +protected: + string waveFolder; + set controls; + set controlsSI; +public: + void settings(gdioutput &gdi, oEvent &oe, bool created); + PrewarningMachine *clone() const {return new PrewarningMachine(*this);} + void status(gdioutput &gdi); + void process(gdioutput &gdi, oEvent *oe, AutoSyncType ast); + PrewarningMachine():AutoMachine("Förvarningsröst") {} + friend class TabAuto; +}; + +class MySQLReconnect : + public AutoMachine +{ +protected: + string error; + string timeError; + string timeReconnect; + HANDLE hThread; +public: + void settings(gdioutput &gdi, oEvent &oe, bool created); + MySQLReconnect *clone() const {return new MySQLReconnect(*this);} + void status(gdioutput &gdi); + void process(gdioutput &gdi, oEvent *oe, AutoSyncType ast); + bool stop(); + MySQLReconnect(const string &error); + virtual ~MySQLReconnect(); + friend class TabAuto; +}; + +bool isThreadReconnecting(); + +class PunchMachine : + public AutoMachine +{ +protected: + int radio; +public: + PunchMachine *clone() const {return new PunchMachine(*this);} + void settings(gdioutput &gdi, oEvent &oe, bool created); + void status(gdioutput &gdi); + void process(gdioutput &gdi, oEvent *oe, AutoSyncType ast); + PunchMachine():AutoMachine("Stämplingsautomat"), radio(0) {} + friend class TabAuto; +}; + +class SplitsMachine : + public AutoMachine +{ +protected: + string file; + set classes; + int leg; +public: + SplitsMachine *clone() const {return new SplitsMachine(*this);} + void settings(gdioutput &gdi, oEvent &oe, bool created); + void status(gdioutput &gdi); + void process(gdioutput &gdi, oEvent *oe, AutoSyncType ast); + SplitsMachine() : AutoMachine("Sträcktider/WinSplits"), leg(-1) {} + friend class TabAuto; +}; + + + +class TabAuto : + public TabBase +{ +private: + //DWORD printResultIntervalSec; + //DWORD printResultTimeOut; + bool editMode; + + bool synchronize; + bool synchronizePunches; + void updateSyncInfo(); + + list machines; + void setTimer(AutoMachine *am); + + void timerCallback(gdioutput &gdi); + void syncCallback(gdioutput &gdi); + + void settings(gdioutput &gdi, AutoMachine *sm, Machines type); + +protected: + void clearCompetitionData(); + +public: + + AutoMachine *getMachine(int id); + //AutoMachine *getMachine(const string &name); + bool stopMachine(AutoMachine *am); + void killMachines(); + void addMachine(const AutoMachine &am) { + machines.push_back(am.clone()); + setTimer(machines.back()); + } + + int processButton(gdioutput &gdi, const ButtonInfo &bu); + int processListBox(gdioutput &gdi, const ListBoxInfo &bu); + + bool loadPage(gdioutput &gdi); + + const char * getTypeStr() const {return "TAutoTab";} + TabType getType() const {return TAutoTab;} + + TabAuto(oEvent *poe); + ~TabAuto(void); + + friend class AutoTask; + friend void tabForceSync(gdioutput &gdi, pEvent oe); +}; + +void tabAutoKillMachines(); +void tabAutoRegister(TabAuto *ta); +void tabAutoAddMachinge(const AutoMachine &am); diff --git a/code/TabBase.cpp b/code/TabBase.cpp new file mode 100644 index 0000000..8170b83 --- /dev/null +++ b/code/TabBase.cpp @@ -0,0 +1,211 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" +#include "TabBase.h" + +#include "oEvent.h" + +#include "TabRunner.h" +#include "TabTeam.h" +#include "TabList.h" +#include "TabSpeaker.h" +#include "TabClass.h" +#include "TabCourse.h" +#include "TabControl.h" +#include "TabClub.h" +#include "TabSI.h" +#include "TabCompetition.h" +#include "TabAuto.h" + +extern oEvent *gEvent; + +FixedTabs::FixedTabs() { + runnerTab = 0; + teamTab = 0; + classTab = 0; + courseTab = 0; + controlTab = 0; + siTab = 0; + listTab = 0; + cmpTab = 0; + speakerTab = 0; + clubTab = 0; + autoTab = 0; + } + +FixedTabs::~FixedTabs() { + tabs.clear(); + + delete runnerTab; + runnerTab = 0; + + delete teamTab; + teamTab = 0; + + delete classTab; + classTab = 0; + + delete courseTab; + courseTab = 0; + + delete controlTab; + controlTab = 0; + + delete siTab; + siTab = 0; + + delete listTab; + listTab = 0; + + delete cmpTab; + cmpTab = 0; + + delete speakerTab; + speakerTab = 0; + + delete clubTab; + clubTab = 0; + + delete autoTab; + autoTab = 0; +} + +TabBase *FixedTabs::get(const TabType tab) { + switch(tab) { + case TCmpTab: + if (!cmpTab) { + cmpTab = new TabCompetition(gEvent); + tabs.push_back(cmpTab); + } + return cmpTab; + break; + case TRunnerTab: + if (!runnerTab) { + runnerTab = new TabRunner(gEvent); + tabs.push_back(runnerTab); + } + return runnerTab; + break; + case TTeamTab: + if (!teamTab) { + teamTab = new TabTeam(gEvent); + tabs.push_back(teamTab); + } + return teamTab; + break; + + case TListTab: + if (!listTab) { + listTab = new TabList(gEvent); + tabs.push_back(listTab); + } + return listTab; + break; + + case TClassTab: + if (!classTab) { + classTab = new TabClass(gEvent); + tabs.push_back(classTab); + } + return classTab; + break; + + case TCourseTab: + if (!courseTab) { + courseTab = new TabCourse(gEvent); + tabs.push_back(courseTab); + } + return courseTab; + break; + + case TControlTab: + if (!controlTab) { + controlTab = new TabControl(gEvent); + tabs.push_back(controlTab); + } + return controlTab; + break; + + case TClubTab: + if (!clubTab) { + clubTab = new TabClub(gEvent); + tabs.push_back(clubTab); + } + return clubTab; + break; + + case TSpeakerTab: + if (!speakerTab) { + speakerTab = new TabSpeaker(gEvent); + tabs.push_back(speakerTab); + } + return speakerTab; + break; + + case TSITab: + if (!siTab) { + siTab = new TabSI(gEvent); + tabs.push_back(siTab); + } + return siTab; + break; + + case TAutoTab: + if (!autoTab) { + autoTab = new TabAuto(gEvent); + tabs.push_back(autoTab); + } + return autoTab; + break; + + default: + throw new std::exception("Bad tab type"); + } + + return 0; +} + +void FixedTabs::clearCompetitionData() { + for (size_t k = 0; k < tabs.size(); k++) + tabs[k]->clearCompetitionData(); +} + + +TabObject::TabObject(TabBase *t) +{ + tab = t; + tab->tabId = id; +} + +TabObject::~TabObject() +{ + //delete tab; +} + + +bool TabObject::loadPage(gdioutput &gdi) +{ + if (tab) + return tab->loadPage(gdi); + else return false; +} \ No newline at end of file diff --git a/code/TabBase.h b/code/TabBase.h new file mode 100644 index 0000000..ff5d658 --- /dev/null +++ b/code/TabBase.h @@ -0,0 +1,156 @@ +#pragma once +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "Localizer.h" +#include +#include "gdioutput.h" + + +class oBase; +class oRunner; +typedef oRunner * pRunner; + +class oTeam; +typedef oTeam * pTeam; + +class gdioutput; +class oEvent; + +enum TabType { + TRunnerTab, + TTeamTab, + TClassTab, + TCourseTab, + TControlTab, + TSITab, + TListTab, + TCmpTab, + TSpeakerTab, + TClubTab, + TAutoTab, +}; + +class TabBase +{ +protected: + oEvent *oe; + int tabId; + virtual void clearCompetitionData() = 0; + +public: + oEvent *getEvent() const {return oe;} + int getTabId() const {return tabId;} + virtual bool loadPage(gdioutput &gdi) = 0; + + virtual TabType getType() const = 0; + virtual const char *getTypeStr() const = 0; + + TabBase(oEvent *poe) : oe(poe), tabId(0) {} + virtual ~TabBase()=0 {} + friend class TabObject; + friend class FixedTabs; +}; + + +class TabObject +{ +protected: + mutable TabBase *tab; + +public: + string name; + int id; + + TabObject(TabBase *t, string n):name(n),tab(t) {} + + void setId(int i){id=i; if (tab) tab->tabId=id;} + void setPage(TabBase *tb){delete tab; tab=tb;} + + const type_info &getType() const {return typeid(*tab);} + const TabBase &getTab() const {return *tab;} + TabObject(const TabObject &t) + { + if (&t!=this) { + name=t.name; + id=t.id; + tab=t.tab; + //t.tab=0; + } + } + + TabObject &operator=(TabObject &t) + { + if (&t!=this) { + delete tab; + name=t.name; + id=t.id; + tab=t.tab; + //t.tab=0; + } + } + + TabObject(TabBase *t); + ~TabObject(); + + bool loadPage(gdioutput &gdi); +}; + +class TabRunner; +class TabTeam; +class TabClass; +class TabCourse; +class TabControl; +class TabClub; +class TabSI; +class TabList; +class TabCompetition; +class TabSpeaker; +class TabAuto; + +class FixedTabs { + oEvent *oe; + TabRunner *runnerTab; + TabTeam *teamTab; + TabClass *classTab; + TabCourse *courseTab; + TabControl *controlTab; + TabSI *siTab; + TabList *listTab; + TabCompetition *cmpTab; + TabSpeaker *speakerTab; + TabClub *clubTab; + TabAuto *autoTab; + + vector tabs; +public: + + TabBase *get(TabType tag); + const vector &getActiveTabs() const {return tabs;} + // Clean up competition specific data from user interface + void clearCompetitionData(); + + + FixedTabs(); + ~FixedTabs(); +}; + diff --git a/code/TabClass.cpp b/code/TabClass.cpp new file mode 100644 index 0000000..48f2bcb --- /dev/null +++ b/code/TabClass.cpp @@ -0,0 +1,3930 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" +#include + +#include "resource.h" + +#include +#include +#include + +#include "oEvent.h" +#include "xmlparser.h" +#include "gdioutput.h" +#include "csvparser.h" +#include "SportIdent.h" +#include "meos_util.h" +#include "oListInfo.h" +#include "TabClass.h" +#include "ClassConfigInfo.h" +#include "meosException.h" +#include "gdifonts.h" +#include "oEventDraw.h" +#include "MeOSFeatures.h" + +extern pEvent gEvent; +const char *visualDrawWindow = "visualdraw"; + +TabClass::TabClass(oEvent *poe):TabBase(poe) +{ + handleCloseWindow.tabClass = this; + clearCompetitionData(); +} + +void TabClass::clearCompetitionData() { + pSettings.clear(); + pSavedDepth = 3600; + pFirstRestart = 3600; + pTimeScaling = 1.0; + pInterval = 120; + + currentStage = -1; + EditChanged = false; + ClassId=0; + tableMode = false; + showForkingGuide = false; + storedNStage = "3"; + storedStart = ""; + storedPredefined = oEvent::PredefinedTypes(-1); + cInfoCache.clear(); + hasWarnedDirect = false; + + lastSeedMethod = -1; + lastSeedPreventClubNb = true; + lastSeedReverse = false; + lastSeedGroups = "1"; + lastPairSize = 1; + lastFirstStart = ""; + lastInterval = "2:00"; + lastNumVac = "0"; + lastHandleBibs = false; + lastScaleFactor = "1.0"; + lastMaxAfter = "60:00"; + + gdioutput *gdi = getExtraWindow(visualDrawWindow, false); + if (gdi) { + gdi->closeWindow(); + } +} + +TabClass::~TabClass(void) +{ +} + +bool ClassInfoSortStart(ClassInfo &ci1, ClassInfo &ci2) +{ + return ci1.firstStart>ci2.firstStart; +} + +void TabClass::HandleCloseWindow::handle(gdioutput &gdi, BaseInfo &info, GuiEventType type) { + if (type == GUI_EVENT) { + EventInfo &ei = dynamic_cast(info); + if (ei.id == "CloseWindow") { + tabClass->closeWindow(gdi); + } + } +} + +void TabClass::closeWindow(gdioutput &gdi) { +} + +int ClassesCB(gdioutput *gdi, int type, void *data) +{ + TabClass &tc = dynamic_cast(*gdi->getTabs().get(TClassTab)); + return tc.classCB(*gdi, type, data); +} + +int MultiCB(gdioutput *gdi, int type, void *data) +{ + TabClass &tc = dynamic_cast(*gdi->getTabs().get(TClassTab)); + return tc.multiCB(*gdi, type, data); +} + +int DrawClassesCB(gdioutput *gdi, int type, void *data) +{ + TabClass &tc = dynamic_cast(*gdi->getTabs().get(TClassTab)); + + if (type == GUI_LISTBOX) { + tc.enableLoadSettings(*gdi); + } + else if (type == GUI_INPUT || type == GUI_INPUTCHANGE) { + InputInfo &ii = *(InputInfo *)data; + if (ii.id.length() > 1) { + int id = atoi(ii.id.substr(1).c_str()); + if (id > 0 && ii.changed()) { + string key = "C" + itos(id); + TextInfo &ti = dynamic_cast(gdi->getBaseInfo(key.c_str())); + ti.setColor(colorRed); + gdi->enableInput("DrawAdjust"); + gdi->refreshFast(); + } + } + } + return 0; +} + + +int TabClass::multiCB(gdioutput &gdi, int type, void *data) +{ + if (type==GUI_BUTTON) { + ButtonInfo bi=*(ButtonInfo *)data; + + if (bi.id=="ChangeLeg") { + gdi.dropLine(); + legSetup(gdi); + gdi.refresh(); + } + else if (bi.id == "CommonStart") { + gdi.setInputStatus("CommonStartTime", gdi.isChecked(bi.id)); + } + else if (bi.id == "CoursePool") { + string strId = "StageCourses_expl"; + gdi.setTextTranslate(strId, getCourseLabel(gdi.isChecked(bi.id)), true); + } + else if (bi.id == "DefineForking") { + if (!checkClassSelected(gdi)) + return false; + save(gdi, true); + EditChanged=true; + defineForking(gdi, true); + return true; + } + else if (bi.id == "ApplyForking") { + showForkingGuide = false; + pClass pc = oe->getClass(ClassId); + + vector allR; + oe->getRunners(ClassId, 0, allR, false); + bool doClear = false; + for (size_t k = 0; k < allR.size(); k++) { + if (allR[k]->getCourseId() != 0) { + if (!doClear) { + if (gdi.ask("Vill du nollställa alla manuellt tilldelade banor?")) + doClear = true; + else + break; + } + if (doClear) + allR[k]->setCourseId(0); + } + } + pair res = pc->autoForking(forkingSetup); + gdi.alert("Created X distinct forkings using Y courses.#" + + itos(res.first) + "#" + itos(res.second)); + loadPage(gdi); + EditChanged=true; + } + else if (bi.id == "AssignCourses") { + set selectedCourses, selectedLegs; + gdi.getSelection("AllCourses", selectedCourses); + gdi.getSelection("AllStages", selectedLegs); + for (set::iterator it = selectedLegs.begin(); it != selectedLegs.end(); ++it) { + int leg = *it; + forkingSetup[leg].clear(); + forkingSetup[leg].insert(forkingSetup[leg].begin(), selectedCourses.begin(), selectedCourses.end()); + } + + bool empty = true; + for (size_t k = 0; k < forkingSetup.size(); k++) { + if (forkingSetup[k].empty()) { + gdi.setText("leg"+ itos(k), lang.tl("Leg X: Do not modify.#" + itos(k+1))); + } + else { + empty = false; + string crs; + for (size_t j = 0; j < forkingSetup[k].size(); j++) { + if (j>0) + crs += ", "; + crs += oe->getCourse(forkingSetup[k][j])->getName(); + if (j > 3) { + crs += "..."; + break; + } + } + gdi.setText("leg"+ itos(k), lang.tl("Leg X: Use Y.#" + itos(k+1) + "#" + crs)); + } + } + gdi.setInputStatus("ApplyForking", !empty); + gdi.setSelection("AllCourses", set()); + gdi.setSelection("AllStages", set()); + gdi.refresh(); + } + else if (bi.id == "ClearCourses") { + gdi.setSelection("AllCourses", set()); + gdi.setSelection("AllStages", set()); + gdi.disableInput("AssignCourses"); + } + else if (bi.id == "ShowForking") { + if (!checkClassSelected(gdi)) + return false; + pClass pc=oe->getClass(ClassId); + if (!pc) + throw std::exception("Klassen finns ej."); + + vector< vector > forks; + set< pair > unfairLegs; + vector< vector > legOrder; + + pc->checkForking(legOrder, forks, unfairLegs); + + gdioutput *gdi_new = getExtraWindow("fork", true); + string title = lang.tl("Forkings for X#" + pc->getName()); + if (!gdi_new) + gdi_new = createExtraWindow("fork", title, + gdi.scaleLength(1024) ); + else + gdi_new->setWindowTitle(title); + + gdi_new->clearPage(false); + + gdi_new->addString("", fontMediumPlus, "Forkings"); + + for (size_t k = 0; k < forks.size(); k++) { + gdi_new->dropLine(0.7); + string ver = itos(k+1) + ": "; + for (size_t j = 0; j < legOrder[k].size(); j++) { + pCourse crs = oe->getCourse(legOrder[k][j]); + if (crs) { + if (j>0) + ver += ", "; + ver += crs->getName(); + } + } + gdi_new->addStringUT(1, ver); + gdi_new->pushX(); + gdi_new->fillRight(); + for (size_t j = 0; j < forks[k].size(); j++) { + string ctrl; + if (forks[k][j] > 0) + ctrl += itos(forks[k][j]); + else { + if (j == 0) + ctrl += lang.tl("Start"); + else if (j + 1 == forks[k].size()) + ctrl += lang.tl("Mål"); + else + ctrl += lang.tl("Växel"); + } + int next = -100; + if (j + 1 < forks[k].size()) { + ctrl += ","; + next = forks[k][j+1]; + } + int prev = j>0 ? forks[k][j-1] : -100; + + bool warn = unfairLegs.count(make_pair(prev, forks[k][j])) != 0;// || + //unfairLegs.count(make_pair(forks[k][j], next)) != 0; + + TextInfo &ti = gdi_new->addStringUT(italicText, ctrl); + if (warn) { + ti.setColor(colorRed); + ti.format = boldText; + } + gdi.setCX(gdi.getCX() - gdi.scaleLength(4)); + } + gdi_new->popX(); + gdi_new->fillDown(); + gdi_new->dropLine(); + } + + if (!unfairLegs.empty()) { + gdi_new->dropLine(); + gdi_new->addString("", fontMediumPlus, "Unfair control legs"); + gdi_new->dropLine(0.5); + for (set< pair >::const_iterator p = unfairLegs.begin(); + p != unfairLegs.end(); ++p) { + + string f = p->first > 0 ? itos(p->first) : "Växel"; + string s = p->second > 0 ? itos(p->second) : "Växel"; + gdi_new->addStringUT(0, MakeDash(f + " - " + s)); + } + } + + gdi_new->dropLine(); + gdi_new->addButton("CloseWindow", "Stäng", ClassesCB); + gdi_new->refresh(); + } + else if (bi.id == "OneCourse") { + if (!checkClassSelected(gdi)) + return false; + pClass pc=oe->getClass(ClassId); + if (!pc) + throw std::exception("Klassen finns ej."); + pc->setNumStages(0); + pc->synchronize(); + gdi.restore(); + gdi.enableInput("MultiCourse", true); + gdi.enableInput("Courses"); + } + else if (bi.id=="SetNStage") { + if (!checkClassSelected(gdi)) + return false; + + pClass pc=oe->getClass(ClassId); + + if (!pc) + throw std::exception("Klassen finns ej."); + + int total, finished, dns; + oe->getNumClassRunners(pc->getId(), 0, total, finished, dns); + + oEvent::PredefinedTypes newType = oEvent::PredefinedTypes(gdi.getSelectedItem("Predefined").first); + int nstages = gdi.getTextNo("NStage"); + + if (finished > 0) { + if (gdi.ask("warning:has_results") == false) + return false; + } + else if (total>0) { + bool ok = false; + ClassType ct = pc->getClassType(); + if (ct == oClassIndividual) { + switch (newType) { + case oEvent::PPatrolOptional: + case oEvent::PPool: + case oEvent::PPoolDrawn: + case oEvent::PNoMulti: + case oEvent::PForking: + ok = true; + break; + case oEvent::PNoSettings: + ok = (nstages == 1); + } + } + + if (!ok) { + if (gdi.ask("warning:has_entries") == false) + return false; + } + } + storedPredefined = newType; + + if (nstages > 0) + storedNStage = gdi.getText("NStage"); + else { + storedNStage = ""; + if (newType != oEvent::PNoMulti) + nstages = 1; //Fixed by type + } + + if (nstages>0 && nstages<41) { + string st=gdi.getText("StartTime"); + if (oe->convertAbsoluteTime(st)>0) + storedStart = st; + + save(gdi, false); //Clears and reloads + + gdi.selectItemByData("Courses", -2); + gdi.disableInput("Courses"); + oe->setupRelay(*pc, newType, nstages, st); + + if (gdi.hasField("MAdd")) { + gdi.enableInput("MAdd"); + gdi.enableInput("MCourses"); + gdi.enableInput("MRemove"); + } + pc->forceShowMultiDialog(true); + selectClass(gdi, pc->getId()); + } + else if (nstages==0){ + pc->setNumStages(0); + pc->synchronize(); + gdi.restore(); + gdi.enableInput("MultiCourse", true); + gdi.enableInput("Courses"); + oe->adjustTeamMultiRunners(pc); + } + else { + gdi.alert("Antalet sträckor måste vara ett heltal mellan 0 och 40."); + } + } + else if (bi.id.substr(0, 7)=="@Course") { + int cnr=atoi(bi.id.substr(7).c_str()); + selectCourses(gdi, cnr); + } + else if (bi.id=="MAdd"){ + DWORD cid=ClassId; + if (!checkClassSelected(gdi)) + return false; + + pClass pc=oe->getClass(cid); + + if (!pc) + return false; + + if (currentStage>=0){ + ListBoxInfo lbi; + if (gdi.getSelectedItem("MCourses", lbi)) { + int courseid=lbi.data; + + pc->addStageCourse(currentStage, courseid); + pc->fillStageCourses(gdi, currentStage, "StageCourses"); + + pc->synchronize(); + oe->checkOrderIdMultipleCourses(cid); + } + } + EditChanged=true; + } + else if (bi.id=="MRemove"){ + if (!checkClassSelected(gdi)) + return false; + + DWORD cid=ClassId; + + pClass pc=oe->getClass(cid); + + if (!pc) + return false; + + if (currentStage>=0){ + ListBoxInfo lbi; + if (gdi.getSelectedItem("StageCourses", lbi)) { + int courseid=lbi.data; + pc->removeStageCourse(currentStage, courseid, lbi.index); + pc->synchronize(); + pc->fillStageCourses(gdi, currentStage, "StageCourses"); + } + } + } + EditChanged=true; + } + else if (type==GUI_LISTBOX) { + ListBoxInfo bi=*(ListBoxInfo *)data; + + if (bi.id.substr(0, 7)=="LegType") { + LegTypes lt = LegTypes(bi.data); + + int i=atoi(bi.id.substr(7).c_str()); + pClass pc=oe->getClass(ClassId); + if (!pc) + return false; + if (lt == pc->getLegType(i)) + return 0; + + pc->setLegType(i, lt); + char legno[10]; + sprintf_s(legno, "%d", i); + updateStartData(gdi, pc, i, true, false); + + gdi.setInputStatus(string("Restart")+legno, !pc->restartIgnored(i), true); + gdi.setInputStatus(string("RestartRope")+legno, !pc->restartIgnored(i), true); + + EditChanged=true; + } + else if (bi.id == "AllStages") { + set t; + gdi.getSelection(bi.id, t); + gdi.setInputStatus("AssignCourses", !t.empty()); + } + else if (bi.id.substr(0, 9)=="StartType") { + StartTypes st=StartTypes(bi.data); + int i=atoi(bi.id.substr(9).c_str()); + pClass pc=oe->getClass(ClassId); + if (!pc) + return false; + pc->setStartType(i, st, true); + char legno[10]; + sprintf_s(legno, "%d", i); + updateStartData(gdi, pc, i, true, false); + + gdi.setInputStatus(string("Restart")+legno, !pc->restartIgnored(i), true); + gdi.setInputStatus(string("RestartRope")+legno, !pc->restartIgnored(i), true); + + EditChanged=true; + } + else if (bi.id == "Predefined") { + bool nleg; + bool start; + oe->setupRelayInfo(oEvent::PredefinedTypes(bi.data), nleg, start); + gdi.setInputStatus("NStage", nleg); + gdi.setInputStatus("StartTime", start); + + string nl = gdi.getText("NStage"); + if (!nleg && nl != "-") { + storedNStage = nl; + gdi.setText("NStage", "-"); + } + else if (nleg && nl == "-") { + gdi.setText("NStage", storedNStage); + } + + string st = gdi.getText("StartTime"); + if (!start && st != "-") { + storedStart = st; + gdi.setText("StartTime", "-"); + } + else if (start && st == "-") { + gdi.setText("StartTime", storedStart); + } + } + else if (bi.id=="Courses") { + EditChanged=true; + } + } + else if (type==GUI_INPUTCHANGE){ + InputInfo ii=*(InputInfo *)data; + + EditChanged=true; + if (ii.id=="NStage") + gdi.enableInput("SetNStage"); + //else if (ii.id=="") + } + return 0; +} + +int TabClass::classCB(gdioutput &gdi, int type, void *data) +{ + if (type==GUI_BUTTON) { + ButtonInfo bi=*(ButtonInfo *)data; + + if (bi.id=="Cancel") { + showForkingGuide = false; + loadPage(gdi); + return 0; + } + else if (bi.id == "UseAdvanced") { + bool checked = gdi.isChecked("UseAdvanced"); + oe->setProperty("AdvancedClassSettings", checked); + save(gdi, true); + PostMessage(gdi.getTarget(), WM_USER + 2, TClassTab, 0); + } + else if (bi.id=="SwitchMode") { + if (!tableMode) + save(gdi, true); + tableMode=!tableMode; + loadPage(gdi); + } + else if (bi.id=="Restart") { + save(gdi, true); + gdi.clearPage(true); + gdi.addString("", 2, "Omstart i stafettklasser"); + gdi.addString("", 10, "help:31661"); + gdi.addListBox("RestartClasses", 200, 250, 0, "Stafettklasser", "", true); + oe->fillClasses(gdi, "RestartClasses", oEvent::extraNone, oEvent::filterOnlyMulti); + gdi.pushX(); + gdi.fillRight(); + oe->updateComputerTime(); + int t=oe->getComputerTime()-(oe->getComputerTime()%60)+60; + gdi.addInput("Rope", oe->getAbsTime(t), 6, 0, "Repdragningstid"); + gdi.addInput("Restart", oe->getAbsTime(t+600), 6, 0, "Omstartstid"); + gdi.dropLine(0.9); + gdi.addButton("DoRestart","OK", ClassesCB); + gdi.addButton("Cancel","Stäng", ClassesCB); + gdi.fillDown(); + gdi.dropLine(3); + gdi.popX(); + } + else if (bi.id=="DoRestart") { + set cls; + gdi.getSelection("RestartClasses", cls); + gdi.fillDown(); + set::iterator it; + string ropeS=gdi.getText("Rope"); + int rope = oe->getRelativeTime(ropeS); + string restartS=gdi.getText("Restart"); + int restart = oe->getRelativeTime(restartS); + + if (rope<=0) { + gdi.alert("Ogiltig repdragningstid."); + return 0; + } + if (restart<=0) { + gdi.alert("Ogiltig omstartstid."); + return 0; + } + if (restartgetAbsTime(rope) + "#" + oe->getAbsTime(restart)); + + for (it=cls.begin(); it!=cls.end(); ++it) { + pClass pc=oe->getClass(*it); + + if (pc) { + gdi.addStringUT(0, pc->getName()); + + int ns=pc->getNumStages(); + + for (int k=0;ksetRopeTime(k, ropeS); + pc->setRestartTime(k, restartS); + } + } + } + gdi.scrollToBottom(); + gdi.refresh(); + } + else if (bi.id=="SaveDrawSettings") { + readClassSettings(gdi); + for(size_t k=0; ksynchronize(false); + ci.pc->setDrawFirstStart(drawInfo.firstStart + drawInfo.baseInterval * ci.firstStart); + ci.pc->setDrawInterval(ci.interval * drawInfo.baseInterval); + ci.pc->setDrawVacant(ci.nVacant); + ci.pc->setDrawNumReserved(ci.nExtra); + ci.pc->synchronize(true); + } + } + } + else if (bi.id=="DoDrawAll") { + readClassSettings(gdi); + int method = gdi.getSelectedItem("Method").first; + bool soft = method == DMSOFT; + int pairSize = gdi.getSelectedItem("PairSize").first; + + bool drawCoursebased = drawInfo.coursesTogether; + + map > specs; + for(size_t k=0; ksynchronize(false); + ci.pc->setDrawFirstStart(drawInfo.firstStart + drawInfo.baseInterval * ci.firstStart); + ci.pc->setDrawInterval(ci.interval * drawInfo.baseInterval); + ci.pc->setDrawVacant(ci.nVacant); + ci.pc->setDrawNumReserved(ci.nExtra); + ci.pc->synchronize(true); + } + ClassDrawSpecification cds(ci.classId, 0, drawInfo.firstStart + drawInfo.baseInterval * ci.firstStart, + drawInfo.baseInterval * ci.interval, ci.nVacant); + if (drawCoursebased) { + pCourse pCrs = oe->getClass(ci.classId)->getCourse(); + int id = pCrs ? pCrs->getId() : 101010101 + ci.classId; + specs[id].push_back(cds); + } + else + specs[ci.classId].push_back(cds); + } + + for (map >::iterator it = specs.begin(); + it != specs.end(); ++it) { + oe->drawList(it->second, soft, pairSize, oEvent::drawAll); + } + + oe->addAutoBib(); + + gdi.clearPage(false); + gdi.addButton("Cancel", "Återgå", ClassesCB); + + oListParam par; + oListInfo info; + par.listCode = EStdStartList; + for (size_t k=0; kgenerateListInfo(par, gdi.getLineHeight(), info); + oe->generateList(gdi, false, info, true); + gdi.refresh(); + } + else if (bi.id == "RemoveVacant") { + if (gdi.ask("Vill du radera alla vakanser från tävlingen?")) { + oe->removeVacanies(0); + gdi.disableInput(bi.id.c_str()); + } + } + else if (bi.id == "SelectAll") { + set lst; + oe->getAllClasses(lst); + gdi.setSelection("Classes", lst); + enableLoadSettings(gdi); + } + else if (bi.id == "SelectUndrawn") { + set lst; + oe->getNotDrawnClasses(lst, false); + gdi.setSelection("Classes", lst); + enableLoadSettings(gdi); + } + else if (bi.id == "SelectStart") { + int id = bi.getExtraInt(); + vector blocks; + vector starts; + oe->getStartBlocks(blocks, starts); + if (size_t(id) < starts.size()) { + string start = starts[id]; + set lst; + vector cls; + oe->getClasses(cls, true); + for (size_t k = 0; k < cls.size(); k++) { + if (cls[k]->getStart() == start) + lst.insert(cls[k]->getId()); + } + gdi.setSelection("Classes", lst); + } + enableLoadSettings(gdi); + } + else if (bi.id == "QuickSettings") { + save(gdi, false); + prepareForDrawing(gdi); + } + else if (bi.id == "DrawMode") { + save(gdi, false); + ClassId = 0; + + EditChanged=false; + gdi.clearPage(true); + + gdi.addString("", boldLarge, "Lotta flera klasser"); + gdi.dropLine(); + + gdi.pushX(); + gdi.fillRight(); + gdi.addInput("FirstStart", oe->getAbsTime(3600), 10, 0, "Första (ordinarie) start:"); + gdi.addInput("MinInterval", "2:00", 10, 0, "Minsta startintervall:"); + gdi.fillDown(); + gdi.addInput("Vacances", "5%", 10, 0, "Andel vakanser:"); + gdi.popX(); + + gdi.addSelection("Method", 200, 200, 0, "Metod:"); + gdi.addItem("Method", lang.tl("Lottning"), DMRandom); + gdi.addItem("Method", lang.tl("SOFT-lottning"), DMSOFT); + gdi.selectItemByData("Method", getDefaultMethod(false)); + + gdi.fillDown(); + gdi.addCheckbox("LateBefore", "Efteranmälda före ordinarie"); + gdi.dropLine(); + + gdi.popX(); + gdi.fillRight(); + gdi.addButton("AutomaticDraw", "Automatisk lottning", ClassesCB).setDefault(); + gdi.addButton("DrawAll", "Manuell lottning", ClassesCB).setExtra(1); + gdi.addButton("Simultaneous", "Gemensam start", ClassesCB); + + const bool multiDay = oe->hasPrevStage(); + + if (multiDay) + gdi.addButton("Pursuit", "Hantera jaktstart", ClassesCB); + + gdi.addButton("Cancel", "Återgå", ClassesCB).setCancel(); + + gdi.dropLine(3); + + gdi.newColumn(); + + gdi.addString("", 10, "help_autodraw"); + } + else if (bi.id == "Pursuit") { + pursuitDialog(gdi); + } + else if (bi.id == "SelectAllNoneP") { + bool select = bi.getExtraInt() != 0; + for (int k = 0; k < oe->getNumClasses(); k++) { + gdi.check("PLUse" + itos(k), select); + gdi.setInputStatus("First" + itos(k), select); + } + } + else if (bi.id == "DoPursuit" || bi.id=="CancelPursuit" || bi.id == "SavePursuit") { + bool cancel = bi.id=="CancelPursuit"; + + int maxAfter = convertAbsoluteTimeMS(gdi.getText("MaxAfter")); + int deltaRestart = convertAbsoluteTimeMS(gdi.getText("TimeRestart")); + int interval = convertAbsoluteTimeMS(gdi.getText("Interval")); + + double scale = atof(gdi.getText("ScaleFactor").c_str()); + bool reverse = bi.getExtraInt() == 2; + int pairSize = gdi.getSelectedItem("PairSize").first; + + pSavedDepth = maxAfter; + pFirstRestart = deltaRestart; + pTimeScaling = scale; + pInterval = interval; + + oListParam par; + + for (int k = 0; k < oe->getNumClasses(); k++) { + if (!gdi.hasField("PLUse" + itos(k))) + continue; + BaseInfo *bi = gdi.setText("PLUse" + itos(k), "", false); + if (bi) { + int id = bi->getExtraInt(); + bool checked = gdi.isChecked("PLUse" + itos(k)); + int first = oe->getRelativeTime(gdi.getText("First" + itos(k))); + //int max = oe->getRelativeTime(gdi.getText("Max" + itos(k))); + + map::iterator st = pSettings.find(id); + if (st != pSettings.end()) { + st->second.firstTime = first; + st->second.maxTime = maxAfter; + st->second.use = checked; + } + + if (checked) { + pClass pc = oe->getClass(id); + if (pc) + pc->setDrawFirstStart(first); + } + + if (!cancel && checked) { + oe->drawPersuitList(id, first, first + deltaRestart, maxAfter, + interval, pairSize, reverse, scale); + par.selection.insert(id); + } + } + } + + if (bi.id == "SavePursuit") { + return 0; + } + + if (cancel) { + loadPage(gdi); + return 0; + } + + gdi.restore("Pursuit", false); + + gdi.dropLine(); + gdi.fillDown(); + + oListInfo info; + par.listCode = EStdStartList; + oe->generateListInfo(par, gdi.getLineHeight(), info); + oe->generateList(gdi, false, info, true); + gdi.dropLine(); + gdi.addButton("Cancel", "Återgå", ClassesCB); + gdi.refresh(); + } + else if (bi.id.substr(0,5) == "PLUse") { + int k = atoi(bi.id.substr(5).c_str()); + gdi.setInputStatus("First" + itos(k), gdi.isChecked(bi.id)); + } + else if (bi.id == "AutomaticDraw") { + string firstStart = gdi.getText("FirstStart"); + string minInterval = gdi.getText("MinInterval"); + string vacances = gdi.getText("Vacances"); + bool lateBefore = false; + //bool pairwise = gdi.isChecked("Pairwise"); + int pairSize = 1; + if (gdi.hasField("PairSize")) { + pairSize = gdi.getSelectedItem("PairSize").first; + } + + int method = gdi.getSelectedItem("Method").first; + bool useSoft = method == DMSOFT; + gdi.clearPage(true); + oe->automaticDrawAll(gdi, firstStart, minInterval, vacances, + lateBefore, useSoft, pairSize); + oe->addAutoBib(); + gdi.scrollToBottom(); + gdi.addButton("Cancel", "Återgå", ClassesCB); + } + else if (bi.id == "SelectMisses") { + set lst; + oe->getNotDrawnClasses(lst, true); + gdi.setSelection("Classes", lst); + enableLoadSettings(gdi); + } + else if (bi.id == "SelectNone") { + gdi.setSelection("Classes", set()); + enableLoadSettings(gdi); + } + else if (bi.id == "Simultaneous") { + string firstStart;// = oe->getAbsTime(3600); + firstStart = gdi.getText("FirstStart"); + + gdi.clearPage(false); + gdi.addString("", boldLarge, "Gemensam start"); + gdi.dropLine(); + int by = 0; + int bx = gdi.getCX(); + + showClassSelection(gdi, bx, by, 0); + + gdi.pushX(); + gdi.addInput("FirstStart", firstStart, 10, 0, "Starttid:"); + + gdi.dropLine(4); + gdi.popX(); + gdi.fillRight(); + gdi.addButton("AssignStart", "Tilldela", ClassesCB).isEdit(true); + gdi.addButton("Cancel", "Avbryt", ClassesCB).setCancel(); + gdi.addButton("EraseStartAll", "Radera starttider...", ClassesCB).isEdit(true).setExtra(1); + + gdi.refresh(); + } + else if (bi.id == "AssignStart") { + set classes; + gdi.getSelection("Classes", classes); + if (classes.empty()) { + gdi.alert("Ingen klass vald."); + return 0; + } + + string time = gdi.getText("FirstStart"); + for (set::iterator it = classes.begin(); it!=classes.end();++it) { + simultaneous(*it, time); + } + + bi.id = "Simultaneous"; + classCB(gdi, type, &bi); + } + else if (bi.id == "DrawAll") { + int origin = bi.getExtraInt(); + string firstStart = oe->getAbsTime(3600); + string minInterval = "2:00"; + string vacances = "5%"; + int maxNumControl = 1; + int pairSize = 1; + + //bool pairwise = false; + int by = 0; + int bx = gdi.getCX(); + if (origin!=13) { + if (origin!=1) { + save(gdi, true); + ClassId = 0; + + EditChanged=false; + } + else { + firstStart = gdi.getText("FirstStart"); + minInterval = gdi.getText("MinInterval"); + vacances = gdi.getText("Vacances"); + //pairwise = gdi.isChecked("Pairwise"); + if (gdi.hasField("PairSize")) { + pairSize = gdi.getSelectedItem("PairSize").first; + } + } + + gdi.clearPage(false); + + gdi.addString("", boldLarge, "Lotta flera klasser"); + gdi.dropLine(0.5); + + showClassSelection(gdi, bx, by, DrawClassesCB); + vector cls; + oe->getClasses(cls, false); + set clsId; + for (size_t k = 0; k < cls.size(); k++) { + if (cls[k]->hasFreeStart()) + continue; + if (cls[k]->getStartType(0) != STDrawn) + continue; + clsId.insert(cls[k]->getId()); + } + + gdi.setSelection("Classes", clsId); + + gdi.addString("", 1, "Grundinställningar"); + + gdi.pushX(); + gdi.fillRight(); + + gdi.addInput("FirstStart", firstStart, 10, 0, "Första start:"); + gdi.addInput("nFields", "10", 10, 0, "Max parallellt startande:"); + gdi.popX(); + gdi.dropLine(3); + + gdi.addSelection("MaxCommonControl", 150, 100, 0, + "Max antal gemensamma kontroller:"); + + vector< pair > items; + items.push_back(make_pair(lang.tl("Inga"), 1)); + items.push_back(make_pair(lang.tl("Första kontrollen"), 2)); + for (int k = 2; k<10; k++) + items.push_back(make_pair(lang.tl("X kontroller#" + itos(k)), k+1)); + items.push_back(make_pair(lang.tl("Hela banan"), 1000)); + gdi.addItem("MaxCommonControl", items); + gdi.selectItemByData("MaxCommonControl", maxNumControl); + + gdi.popX(); + gdi.dropLine(4); + gdi.addCheckbox("AllowNeighbours", "Tillåt samma bana inom basintervall", 0, true); + gdi.addCheckbox("CoursesTogether", "Lotta klasser med samma bana gemensamt", 0, false); + + gdi.popX(); + gdi.dropLine(2); + gdi.addString("", 1, "Startintervall"); + gdi.dropLine(1.4); + gdi.popX(); + gdi.fillRight(); + gdi.addInput("BaseInterval", "1:00", 10, 0, "Basintervall (min):"); + gdi.addInput("MinInterval", minInterval, 10, 0, "Minsta intervall i klass:"); + gdi.addInput("MaxInterval", minInterval, 10, 0, "Största intervall i klass:"); + + gdi.popX(); + gdi.dropLine(4); + gdi.addString("", 1, "Vakanser och efteranmälda"); + gdi.dropLine(1.4); + gdi.popX(); + gdi.addInput("Vacances", vacances, 10, 0, "Andel vakanser:"); + gdi.addInput("VacancesMin", "1", 10, 0, "Min. vakanser (per klass):"); + gdi.addInput("VacancesMax", "10", 10, 0, "Max. vakanser (per klass):"); + + gdi.popX(); + gdi.dropLine(3); + + gdi.addInput("Extra", "0%", 10, 0, "Förväntad andel efteranmälda:"); + + gdi.dropLine(4); + gdi.fillDown(); + gdi.popX(); + gdi.setRestorePoint("Setup"); + + } + else { + gdi.restore("Setup"); + by = gdi.getHeight(); + gdi.enableEditControls(true); + } + + gdi.fillRight(); + gdi.pushX(); + RECT rcPrepare; + rcPrepare.left = gdi.getCX(); + rcPrepare.top = gdi.getCY(); + gdi.setCX(gdi.getCX() + gdi.getLineHeight()); + gdi.dropLine(); + gdi.addString("", fontMediumPlus, "Förbered lottning"); + gdi.dropLine(2.5); + gdi.popX(); + gdi.setCX(gdi.getCX() + gdi.getLineHeight()); + gdi.addButton("PrepareDrawAll", "Fördela starttider...", ClassesCB).isEdit(true).setDefault(); + gdi.addButton("EraseStartAll", "Radera starttider...", ClassesCB).isEdit(true).setExtra(0); + gdi.addButton("LoadSettings", "Hämta inställningar från föregående lottning", ClassesCB).isEdit(true); + enableLoadSettings(gdi); + + gdi.dropLine(3); + rcPrepare.bottom = gdi.getCY(); + rcPrepare.right = gdi.getWidth(); + gdi.addRectangle(rcPrepare, colorLightGreen); + gdi.dropLine(); + gdi.popX(); + + gdi.addString("", 1, "Efteranmälningar"); + gdi.dropLine(1.5); + gdi.popX(); + gdi.addButton("DrawAllBefore", "Efteranmälda (före ordinarie)", ClassesCB).isEdit(true); + gdi.addButton("DrawAllAfter", "Efteranmälda (efter ordinarie)", ClassesCB).isEdit(true); + + gdi.dropLine(4); + gdi.popX(); + + gdi.addButton("Cancel", "Avbryt", ClassesCB).setCancel(); + gdi.addButton("HelpDraw", "Hjälp...", ClassesCB, ""); + gdi.dropLine(3); + + by = max(by, gdi.getCY()); + + gdi.setCX(bx); + gdi.setCY(by); + gdi.fillDown(); + gdi.dropLine(); + + gdi.setRestorePoint("ReadyToDistribute"); + gdi.refresh(); + } + else if (bi.id == "HelpDraw") { + + gdioutput *gdi_new = getExtraWindow("help", true); + + if (!gdi_new) + gdi_new = createExtraWindow("help", MakeDash("MeOS - " + lang.tl("Hjälp")), gdi.scaleLength(640)); + gdi_new->clearPage(true); + gdi_new->addString("", boldLarge, "Lotta flera klasser"); + gdi_new->addString("", 10, "help_draw"); + gdi_new->dropLine(); + gdi_new->addButton("CloseWindow", "Stäng", ClassesCB); + } + else if (bi.id == "CloseWindow") { + gdi.closeWindow(); + } + else if (bi.id=="PrepareDrawAll") { + set classes; + gdi.getSelection("Classes", classes); + if (classes.empty()) { + throw meosException("Ingen klass vald."); + } + gdi.restore("ReadyToDistribute"); + drawInfo.classes.clear(); + + for (set::iterator it = classes.begin(); it!=classes.end();++it) { + map::iterator res = cInfoCache.find(*it); + if ( res != cInfoCache.end() ) { + res->second.hasFixedTime = false; + drawInfo.classes[*it] = res->second; + } + else + drawInfo.classes[*it] = ClassInfo(oe->getClass(*it)); + } + + readDrawInfo(gdi, drawInfo); + if (drawInfo.baseInterval <= 0 || drawInfo.baseInterval == NOTIME) + throw meosException("Ogiltigt basintervall."); + if (drawInfo.minClassInterval <= 0 || drawInfo.minClassInterval == NOTIME) + throw meosException("Ogiltigt minimalt intervall."); + if (drawInfo.minClassInterval > drawInfo.maxClassInterval || drawInfo.maxClassInterval == NOTIME) + throw meosException("Ogiltigt maximalt intervall. "); + + if (drawInfo.minClassInterval < drawInfo.baseInterval) { + throw meosException("Startintervallet får inte vara kortare än basintervallet."); + } + + if (drawInfo.minClassInterval % drawInfo.baseInterval != 0 || + drawInfo.maxClassInterval % drawInfo.baseInterval != 0) { + throw meosException("Ett startintervall måste vara en multipel av basintervallet."); + } + + gdi.enableEditControls(false); + + if (drawInfo.firstStart<=0) { + drawInfo.baseInterval = 0; + gdi.addString("", 0, "Raderar starttider..."); + } + + oe->optimizeStartOrder(gdi, drawInfo, cInfo); + + showClassSettings(gdi); + } + else if (bi.id == "LoadSettings") { + set classes; + gdi.getSelection("Classes", classes); + if (classes.empty()) { + throw meosException("Ingen klass vald."); + } + gdi.restore("ReadyToDistribute"); + oe->loadDrawSettings(classes, drawInfo, cInfo); + + /* + drawInfo.firstStart = 3600 * 22; + drawInfo.minClassInterval = 3600; + drawInfo.maxClassInterval = 1; + drawInfo.minVacancy = 10; + + set reducedStart; + for (set::iterator it = classes.begin(); it != classes.end(); ++it) { + pClass pc = oe->getClass(*it); + if (pc) { + int fs = pc->getDrawFirstStart(); + int iv = pc->getDrawInterval(); + if (iv > 0 && fs > 0) { + drawInfo.firstStart = min(drawInfo.firstStart, fs); + drawInfo.minClassInterval = min(drawInfo.minClassInterval, iv); + drawInfo.maxClassInterval = max(drawInfo.maxClassInterval, iv); + drawInfo.minVacancy = min(drawInfo.minVacancy, pc->getDrawVacant()); + drawInfo.maxVacancy = max(drawInfo.maxVacancy, pc->getDrawVacant()); + reducedStart.insert(fs%iv); + } + } + } + + drawInfo.baseInterval = drawInfo.minClassInterval; + int lastStart = -1; + for (set::iterator it = reducedStart.begin(); it != reducedStart.end(); ++it) { + if (lastStart == -1) + lastStart = *it; + else { + drawInfo.baseInterval = min(drawInfo.baseInterval, *it-lastStart); + lastStart = *it; + } + } + + cInfo.clear(); + cInfo.resize(classes.size()); + int i = 0; + for (set::iterator it = classes.begin(); it != classes.end(); ++it) { + pClass pc = oe->getClass(*it); + if (pc) { + int fs = pc->getDrawFirstStart(); + int iv = pc->getDrawInterval(); + cInfo[i].pc = pc; + cInfo[i].classId = *it; + cInfo[i].courseId = pc->getCourseId(); + cInfo[i].firstStart = fs; + cInfo[i].unique = pc->getCourseId(); + if (cInfo[i].unique == 0) + cInfo[i].unique = pc->getId() * 10000; + cInfo[i].firstStart = (fs - drawInfo.firstStart) / drawInfo.baseInterval; + cInfo[i].interval = iv / drawInfo.baseInterval; + cInfo[i].nVacant = pc->getDrawVacant(); + i++; + } + } + */ + writeDrawInfo(gdi, drawInfo); + gdi.enableEditControls(false); + + showClassSettings(gdi); + } + else if (bi.id == "VisualizeDraw") { + readClassSettings(gdi); + + gdioutput *gdi_new = getExtraWindow(visualDrawWindow, true); + if (!gdi_new) + gdi_new = createExtraWindow(visualDrawWindow, MakeDash("MeOS - " + lang.tl("Visualisera startfältet")), gdi.scaleLength(1000)); + + gdi_new->clearPage(false); + gdi_new->addString("", boldLarge, "Visualisera startfältet"); + gdi_new->dropLine(); + gdi_new->addString("", 0, "För muspekaren över en markering för att få mer information."); + gdi_new->dropLine(); + visualizeField(*gdi_new); + gdi_new->dropLine(); + gdi_new->addButton("CloseWindow", "Stäng", ClassesCB); + gdi_new->registerEvent("CloseWindow", 0).setHandler(&handleCloseWindow); + gdi_new->refresh(); + } + else if (bi.id == "EraseStartAll") { + set classes; + gdi.getSelection("Classes", classes); + if (classes.empty()) { + gdi.alert("Ingen klass vald."); + return 0; + } + if (classes.size() == 1) { + pClass pc = oe->getClass(*classes.begin()); + if (!pc || !gdi.ask("Vill du verkligen radera alla starttider i X?#" + pc->getName())) + return 0; + } + else { + if (!gdi.ask("Vill du verkligen radera starttider i X klasser?#" + itos(classes.size())) ) + return 0; + } + + for (set::const_iterator it = classes.begin(); it != classes.end(); ++it) { + vector spec; + spec.push_back(ClassDrawSpecification(*it, 0, 0, 0, 0)); + oe->drawList(spec, false, 1, oEvent::drawAll); + } + + if (bi.getExtraInt() == 1) + bi.id = "Simultaneous"; + else + bi.id = "DrawAll"; + + bi.setExtra(1); + classCB(gdi, type, &bi); // Reload draw dialog + } + else if (bi.id == "DrawAdjust") { + readClassSettings(gdi); + gdi.restore("ReadyToDistribute"); + oe->optimizeStartOrder(gdi, drawInfo, cInfo); + showClassSettings(gdi); + } + else if (bi.id == "DrawAllAdjust") { + readClassSettings(gdi); + bi.id = "DrawAll"; + return classCB(gdi, type, &bi); + } + else if (bi.id == "DrawAllBefore" || bi.id == "DrawAllAfter") { + oe->drawRemaining(true, bi.id == "DrawAllAfter"); + oe->addAutoBib(); + loadPage(gdi); + } + else if (bi.id=="DoDraw" || bi.id=="DoDrawAfter" || bi.id=="DoDrawBefore"){ + if (!checkClassSelected(gdi)) + return false; + + DWORD cid=ClassId; + DrawMethod method = DrawMethod(gdi.getSelectedItem("Method").first); + + int interval = 0; + if (gdi.hasField("Interval")) + interval = convertAbsoluteTimeMS(gdi.getText("Interval")); + + int vacanses = 0; + if (gdi.hasField("Vacanses")) + vacanses = gdi.getTextNo("Vacanses"); + + int leg = 0; + if (gdi.hasField("Leg")) { + leg = gdi.getSelectedItem("Leg").first; + } + + string bib; + bool doBibs = false; + + if (gdi.hasField("Bib")) { + bib = gdi.getText("Bib"); + doBibs = gdi.isChecked("HandleBibs"); + } + + string time = gdi.getText("FirstStart"); + int t=oe->getRelativeTime(time); + + if (t<=0) + throw std::exception("Ogiltig första starttid. Måste vara efter nolltid."); + + oEvent::DrawType type(oEvent::drawAll); + if (bi.id=="DoDrawAfter") + type = oEvent::remainingAfter; + else if (bi.id=="DoDrawBefore") + type = oEvent::remainingBefore; + + //bool pairwise = false; + +// if (gdi.hasField("Pairwise")) + // pairwise = gdi.isChecked("Pairwise"); + int pairSize = 1; + if (gdi.hasField("PairSize")) { + pairSize = gdi.getSelectedItem("PairSize").first; + } + + int maxTime = 0, restartTime = 0; + double scaleFactor = 1.0; + + if (gdi.hasField("TimeRestart")) + restartTime = oe->getRelativeTime(gdi.getText("TimeRestart")); + + if (gdi.hasField("MaxAfter")) + maxTime = convertAbsoluteTimeMS(gdi.getText("MaxAfter")); + + if (gdi.hasField("ScaleFactor")) + scaleFactor = atof(gdi.getText("ScaleFactor").c_str()); + + if (method == DMRandom || method == DMSOFT) { + vector spec; + spec.push_back(ClassDrawSpecification(cid, leg, t, interval, vacanses)); + + oe->drawList(spec, method == DMSOFT, pairSize, type); + } + else if (method == DMClumped) + oe->drawListClumped(cid, t, interval, vacanses); + else if (method == DMPursuit || method == DMReversePursuit) { + oe->drawPersuitList(cid, t, restartTime, maxTime, + interval, pairSize, + method == DMReversePursuit, + scaleFactor); + } + else if (method == DMSimultaneous) { + simultaneous(cid, time); + } + else if (method == DMSeeded) { + ListBoxInfo seedMethod; + gdi.getSelectedItem("SeedMethod", seedMethod); + string seedGroups = gdi.getText("SeedGroups"); + vector out; + split(seedGroups, " ,;", out); + vector sg; + bool invalid = false; + for (size_t k = 0; k < out.size(); k++) { + if (trim(out[k]).empty()) + continue; + int val = atoi(trim(out[k]).c_str()); + if (val <= 0) + invalid = true; + + sg.push_back(val); + } + if (invalid || sg.empty()) + throw meosException("Ogiltig storlek på seedningsgrupper X.#" + seedGroups); + + bool noClubNb = gdi.isChecked("PreventClubNb"); + bool reverse = gdi.isChecked("ReverseSeedning"); + + pClass pc=oe->getClass(ClassId); + if (!pc) + throw meosException("Class not found"); + + pc->drawSeeded(ClassSeedMethod(seedMethod.data), leg, t, interval, + sg, noClubNb, reverse, pairSize); + } + else + throw std::exception("Not implemented"); + + if (doBibs) + oe->addBib(cid, leg, bib); + + // Clear input + gdi.restore("", false); + gdi.addButton("Cancel", "Återgå", ClassesCB).setCancel(); + + gdi.dropLine(); + + oListParam par; + par.selection.insert(cid); + oListInfo info; + par.listCode = EStdStartList; + par.setLegNumberCoded(leg); + oe->generateListInfo(par, gdi.getLineHeight(), info); + oe->generateList(gdi, false, info, true); + + gdi.refresh(); + return 0; + } + else if (bi.id=="HandleBibs") { + gdi.setInputStatus("Bib", gdi.isChecked("HandleBibs")); + } + else if (bi.id == "DoDeleteStart") { + pClass pc=oe->getClass(ClassId); + if (!pc) + throw meosException("Class not found"); + + if (!gdi.ask("Vill du verkligen radera alla starttider i X?#" + pc->getName())) + return 0; + + int leg = 0; + if (gdi.hasField("Leg")) { + leg = gdi.getSelectedItem("Leg").first; + } + vector spec; + spec.push_back(ClassDrawSpecification(ClassId, leg, 0, 0, 0)); + + oe->drawList(spec, false, 1, oEvent::drawAll); + loadPage(gdi); + } + else if (bi.id=="Draw") { + save(gdi, true); + if (!checkClassSelected(gdi)) + return false; + + DWORD cid=ClassId; + + if (oe->classHasResults(cid)) { + if (!gdi.ask("warning:drawresult")) + return 0; + } + + pClass pc=oe->getClass(cid); + + if (!pc) + throw std::exception("Class not found"); + if (EditChanged) + gdi.sendCtrlMessage("Save"); + + gdi.clearPage(false); + + gdi.addString("", boldLarge, "Lotta klassen X#"+pc->getName()); + gdi.dropLine(); + gdi.pushX(); + gdi.setRestorePoint(); + + gdi.fillDown(); + bool multiDay = oe->hasPrevStage(); + + if (multiDay) { + gdi.addCheckbox("HandleMultiDay", "Använd funktioner för fleretappsklass", ClassesCB, true); + } + + gdi.addSelection("Method", 200, 200, ClassesCB, "Metod:"); + gdi.dropLine(1.5); + gdi.popX(); + + gdi.setRestorePoint("MultiDayDraw"); + + lastDrawMethod = NOMethod; + drawDialog(gdi, getDefaultMethod(true), *pc); + } + else if (bi.id == "HandleMultiDay") { + ListBoxInfo lbi; + gdi.getSelectedItem("Method", lbi); + + pClass pc=oe->getClass(ClassId); + if (!pc) + throw std::exception("Class not found"); + + if (gdi.isChecked(bi.id) && (lastDrawMethod == DMReversePursuit || + lastDrawMethod == DMPursuit)) { + drawDialog(gdi, getDefaultMethod(false), *pc); + } + else + setMultiDayClass(gdi, gdi.isChecked(bi.id), lastDrawMethod); + + } + else if (bi.id=="Bibs") { + save(gdi, true); + if (!checkClassSelected(gdi)) + return false; + + DWORD cid=ClassId; + + pClass pc=oe->getClass(cid); + if (!pc) + throw std::exception("Class not found"); + + gdi.clearPage(false); + gdi.addString("", boldLarge, "Nummerlappar i X#" + pc->getName()); + gdi.dropLine(); + gdi.setRestorePoint("bib"); + + gdi.addString("", 10, "help:bibs"); + gdi.dropLine(); + + vector< pair > bibOptions; + vector< pair > bibTeamOptions; + bibOptions.push_back(make_pair(lang.tl("Manuell"), AutoBibManual)); + bibOptions.push_back(make_pair(lang.tl("Löpande"), AutoBibConsecutive)); + bibOptions.push_back(make_pair(lang.tl("Ingen"), AutoBibNone)); + bibOptions.push_back(make_pair(lang.tl("Automatisk"), AutoBibExplicit)); + + gdi.fillRight(); + gdi.pushX(); + + gdi.addSelection("BibSettings", 150, 100, ClassesCB, "Metod:"); + gdi.addItem("BibSettings", bibOptions); + + AutoBibType bt = pc->getAutoBibType(); + gdi.selectItemByData("BibSettings", bt); + string bib = pc->getDCI().getString("Bib"); + + if (pc->getNumDistinctRunners() > 1) { + bibTeamOptions.push_back(make_pair(lang.tl("Oberoende"), BibFree)); + bibTeamOptions.push_back(make_pair(lang.tl("Samma"), BibSame)); + bibTeamOptions.push_back(make_pair(lang.tl("Ökande"), BibAdd)); + bibTeamOptions.push_back(make_pair(lang.tl("Sträcka"), BibLeg)); + gdi.addSelection("BibTeam", 80, 100, 0, "Lagmedlem:", "Ange relation mellan lagets och deltagarnas nummerlappar."); + gdi.addItem("BibTeam", bibTeamOptions); + gdi.selectItemByData("BibTeam", pc->getBibMode()); + } + + gdi.dropLine(1.1); + gdi.addInput("Bib", "", 10, 0, ""); + gdi.dropLine(3); + + gdi.fillRight(); + gdi.popX(); + gdi.addString("", 0, "Antal reserverade nummerlappsnummer mellan klasser:"); + gdi.dropLine(-0.1); + gdi.addInput("BibGap", itos(oe->getBibClassGap()), 5); + gdi.dropLine(3); + gdi.popX(); + gdi.fillRight(); + gdi.addButton("DoBibs", "Tilldela", ClassesCB).setDefault(); + + gdi.setInputStatus("Bib", bt == AutoBibExplicit || bt == AutoBibManual); + gdi.setInputStatus("BibGap", bt != AutoBibManual); + + if (bt != AutoBibManual) + gdi.setTextTranslate("DoBibs", "OK"); + if (bt == AutoBibExplicit) + gdi.setText("Bib", bib); + + gdi.fillDown(); + gdi.addButton("Cancel", "Avbryt", ClassesCB).setCancel(); + gdi.popX(); + + EditChanged=false; + gdi.refresh(); + } + else if (bi.id=="DoBibs") { + if (!checkClassSelected(gdi)) + return false; + + DWORD cid=ClassId; + pClass pc = oe->getClass(cid); + + AutoBibType bt = AutoBibType(gdi.getSelectedItem("BibSettings").first); + + pair teamBib = gdi.getSelectedItem("TeamBib"); + if (teamBib.second) { + pc->setBibMode(BibMode(teamBib.first)); + } + + pc->getDI().setString("Bib", getBibCode(bt, gdi.getText("Bib"))); + pc->synchronize(); + + if (bt == AutoBibManual) { + oe->addBib(cid, 0, gdi.getText("Bib")); + } + else { + oe->setBibClassGap(gdi.getTextNo("BibGap")); + oe->addAutoBib(); + } + + gdi.restore("bib", false); + gdi.dropLine(); + gdi.addButton("Cancel", "Återgå", ClassesCB).setDefault(); + + oListParam par; + par.selection.insert(cid); + oListInfo info; + par.listCode = EStdStartList; + par.setLegNumberCoded(0); + oe->generateListInfo(par, gdi.getLineHeight(), info); + oe->generateList(gdi, false, info, true); + + gdi.refresh(); + return 0; + } + else if (bi.id=="Split") { + save(gdi, true); + if (!checkClassSelected(gdi)) + return false; + + pClass pc=oe->getClass(ClassId); + if (!pc) + throw std::exception("Class not found"); + + gdi.clearPage(true); + gdi.addString("", boldLarge, "Dela klass: X#" + pc->getName()); + gdi.dropLine(); + int tot, fin, dns; + oe->getNumClassRunners(pc->getId(), 0, tot, fin, dns); + gdi.addString("", fontMediumPlus, "Antal deltagare: X#" + itos(tot)); + gdi.dropLine(1.2); + gdi.pushX(); + gdi.fillRight(); + gdi.addSelection("Type", 200, 100, ClassesCB, "Typ av delning:"); + gdi.selectItemByData("Type", 1); + vector< pair > mt; + oClass::getSplitMethods(mt); + gdi.addItem("Type", mt); + gdi.selectFirstItem("Type"); + + gdi.addSelection("SplitInput", 100, 150, ClassesCB, "Antal klasser:").setExtra(tot); + vector< pair > sp; + for (int k = 2; k < 10; k++) + sp.push_back(make_pair(itos(k), k)); + gdi.addItem("SplitInput", sp); + gdi.selectFirstItem("SplitInput"); + + gdi.dropLine(3); + gdi.popX(); + + updateSplitDistribution(gdi, 2, tot); + } + else if (bi.id=="DoSplit") { + if (!checkClassSelected(gdi)) + return false; + + pClass pc=oe->getClass(ClassId); + if (!pc) + throw std::exception("Class not found"); + + ListBoxInfo lbi; + gdi.getSelectedItem("Type", lbi); + + int number = gdi.getSelectedItem("SplitInput").first; + vector parts(number); + for (int k = 0; k < number; k++) { + string id = "CLS" + itos(k); + parts[k] = gdi.getTextNo(id, false); + } + + vector outClass; + + pc->splitClass(ClassSplitMethod(lbi.data), parts, outClass); + + gdi.clearPage(true); + gdi.addButton("Cancel", "Återgå", ClassesCB); + + oListParam par; + par.selection.insert(outClass.begin(), outClass.end()); + oListInfo info; + par.listCode = EStdStartList; + oe->generateListInfo(par, gdi.getLineHeight(), info); + oe->generateList(gdi, false, info, true); + } + else if (bi.id=="Merge") { + save(gdi, true); + if (!checkClassSelected(gdi)) + return false; + + pClass pc=oe->getClass(ClassId); + if (!pc) + throw std::exception("Class not found"); + + vector< pair > rawClass, cls; + oe->fillClasses(rawClass, oEvent::extraNone, oEvent::filterNone); + int def = -1; + bool next = false; + for (size_t k = 0; k < rawClass.size(); k++) { + if (rawClass[k].second == ClassId) + next = true; + else { + cls.push_back(rawClass[k]); + + if (next) { + next = false; + def = rawClass[k].second; + } + } + } + if (cls.empty()) + throw std::exception("En klass kan inte slås ihop med sig själv."); + + gdi.clearPage(true); + gdi.addString("", boldLarge, "Slå ihop klass: X (denna klass behålls)#" + pc->getName()); + gdi.dropLine(); + gdi.addString("", 10, "help:12138"); + gdi.dropLine(2); + gdi.pushX(); + gdi.fillRight(); + gdi.addSelection("Class", 150, 300, 0, "Klass att slå ihop:"); + gdi.addItem("Class", cls); + if (def != -1) + gdi.selectItemByData("Class", def); + else + gdi.selectFirstItem("Class"); + + gdi.dropLine(); + gdi.addButton("DoMergeAsk", "Slå ihop", ClassesCB).setDefault(); + gdi.addButton("Cancel", "Avbryt", ClassesCB).setCancel(); + gdi.dropLine(3); + gdi.popX(); + } + else if (bi.id=="DoMergeAsk") { + if (!checkClassSelected(gdi)) + return false; + + pClass pc=oe->getClass(ClassId); + if (!pc) + throw std::exception("Class not found"); + + pClass mergeClass = oe->getClass(gdi.getSelectedItem("Class").first); + + if (!mergeClass) + throw std::exception("Ingen klass vald."); + + if (mergeClass->getId() == ClassId) + throw std::exception("En klass kan inte slås ihop med sig själv."); + + if (gdi.ask("Vill du flytta löpare från X till Y och ta bort Z?#" + + mergeClass->getName() + "#" + pc->getName() + "#" + mergeClass->getName())) { + bi.id = "DoMerge"; + return classCB(gdi, type, &bi); + } + return false; + } + else if (bi.id=="DoMerge") { + if (!checkClassSelected(gdi)) + return false; + + pClass pc=oe->getClass(ClassId); + if (!pc) + throw std::exception("Class not found"); + + ListBoxInfo lbi; + gdi.getSelectedItem("Class", lbi); + + if (signed(lbi.data)<=0) + throw std::exception("Ingen klass vald."); + + if (lbi.data==ClassId) + throw std::exception("En klass kan inte slås ihop med sig själv."); + + pc->mergeClass(lbi.data); + gdi.clearPage(true); + gdi.addButton("Cancel", "Återgå", ClassesCB); + + oListParam par; + par.selection.insert(ClassId); + oListInfo info; + par.listCode = EStdStartList; + oe->generateListInfo(par, gdi.getLineHeight(), info); + oe->generateList(gdi, false, info, true); + gdi.refresh(); + } + else if (bi.id=="MultiCourse") { + save(gdi, false); + multiCourse(gdi, 0); + gdi.refresh(); + } + else if (bi.id=="Save") + save(gdi, false); + else if (bi.id=="Add") { + string name = gdi.getText("Name"); + pClass c = oe->getClass(ClassId); + if (!name.empty() && c && c->getName() != name) { + if (gdi.ask("Vill du lägga till klassen 'X'?#" + name)) { + c = oe->addClass(name); + ClassId = c->getId(); + save(gdi, false); + return true; + } + } + + + save(gdi, true); + pClass pc = oe->addClass(oe->getAutoClassName(), 0); + if (pc) { + oe->fillClasses(gdi, "Classes", oEvent::extraDrawn, oEvent::filterNone); + selectClass(gdi, pc->getId()); + gdi.setInputFocus("Name", true); + } + } + else if (bi.id=="Remove") { + EditChanged=false; + if (!checkClassSelected(gdi)) + return false; + + DWORD cid=ClassId; + + if (oe->isClassUsed(cid)) + gdi.alert("Klassen används och kan inte tas bort."); + else + oe->removeClass(cid); + + oe->fillClasses(gdi, "Classes", oEvent::extraDrawn, oEvent::filterNone); + ClassId = 0; + selectClass(gdi, 0); + } + } + else if (type==GUI_LISTBOX) { + ListBoxInfo bi=*(ListBoxInfo *)data; + + if (bi.id=="Classes") { + if (gdi.isInputChanged("")) + save(gdi, true); + + selectClass(gdi, bi.data); + } + else if (bi.id == "SplitInput") { + int num = bi.data; + updateSplitDistribution(gdi, num, bi.getExtraInt()); + } + else if (bi.id=="Courses") + EditChanged=true; + else if (bi.id == "BibSettings") { + AutoBibType bt = (AutoBibType)bi.data; + gdi.setInputStatus("Bib", bt == AutoBibExplicit || bt == AutoBibManual); + gdi.setInputStatus("BibGap", bt != AutoBibManual); + if (bt != AutoBibManual) + gdi.setTextTranslate("DoBibs", "OK"); + else + gdi.setTextTranslate("DoBibs", "Tilldela"); + } + else if (bi.id=="Type") { + if (bi.data==1) { + gdi.setTextTranslate("TypeDesc", "Antal klasser:", true); + gdi.setText("SplitInput", "2"); + } + else { + gdi.setTextTranslate("TypeDesc", "Löpare per klass:", true); + gdi.setText("SplitInput", "100"); + } + } + else if (bi.id == "Method") { + pClass pc = oe->getClass(ClassId); + if (!pc) + throw std::exception("Nullpointer exception"); + + drawDialog(gdi, DrawMethod(bi.data), *pc); + } + } + else if (type==GUI_INPUTCHANGE) { + //InputInfo ii=*(InputInfo *)data; + + } + else if (type==GUI_CLEAR) { + if (ClassId>0) + save(gdi, true); + if (EditChanged) { + if (gdi.ask("Spara ändringar?")) + gdi.sendCtrlMessage("Save"); + } + return true; + } + return 0; +} + +void TabClass::readClassSettings(gdioutput &gdi) +{ + for (size_t k=0;kgetRelativeTime(start) - drawInfo.firstStart; + + if (drawInfo.firstStart == 0 && startPos == -1) + startPos = 0; + else if (startPos<0 || (startPos % drawInfo.baseInterval)!=0) + throw std::exception("Ogiltig tid"); + + startPos /= drawInfo.baseInterval; + + int intervalPos = convertAbsoluteTimeMS(intervall); + + if (intervalPos<0 || intervalPos == NOTIME || (intervalPos % drawInfo.baseInterval)!=0) + throw std::exception("Ogiltigt startintervall"); + + intervalPos /= drawInfo.baseInterval; + + if (ci.nVacant != vacant) { + ci.nVacantSpecified = true; + ci.nVacant = vacant; + } + + if (ci.nExtra != reserved) { + ci.nExtraSpecified = true; + ci.nExtra = reserved; + } + // If times has been changed, mark this class to be kept fixed + if (ci.firstStart != startPos || ci.interval!=intervalPos) + ci.hasFixedTime = true; + + ci.firstStart = startPos; + ci.interval = intervalPos; + + drawInfo.classes[ci.classId] = ci; + + cInfoCache[ci.classId] = ci; + cInfoCache[ci.classId].hasFixedTime = false; + } +} + +void TabClass::visualizeField(gdioutput &gdi) { + ClassInfo::sSortOrder = 3; + sort(cInfo.begin(), cInfo.end()); + ClassInfo::sSortOrder = 0; + + vector field; + vector index(cInfo.size(), -1); + + for (size_t k = 0;k < cInfo.size(); k++) { + const ClassInfo &ci = cInfo[k]; + int laststart = ci.firstStart + (ci.nRunners-1) * ci.interval; + + for (size_t j = 0; j < field.size(); j++) { + if (field[j] < ci.firstStart) { + index[k] = j; + field[j] = laststart; + break; + } + } + if (index[k] == -1) { + index[k] = field.size(); + field.push_back(laststart); + } +/* + string first=oe->getAbsTime(ci.firstStart*drawInfo.baseInterval+drawInfo.firstStart); + string last=oe->getAbsTime((laststart)*drawInfo.baseInterval+drawInfo.firstStart); + pClass pc=oe->getClass(ci.classId);*/ + } + + map groupNumber; + map groups; + int freeNumber = 1; + for (size_t k = 0;k < cInfo.size(); k++) { + const ClassInfo &ci = cInfo[k]; + if (!groupNumber.count(ci.unique)) + groupNumber[ci.unique] = freeNumber++; + + pClass pc = oe->getClass(ci.classId); + if (pc) { + if (groups[ci.unique].empty()) + groups[ci.unique] = pc->getName(); + else if (groups[ci.unique].size() < 64) + groups[ci.unique] += ", " + pc->getName(); + else + groups[ci.unique] += "..."; + } + } + + int marg = gdi.scaleLength(20); + int xp = gdi.getCX() + marg; + int yp = gdi.getCY() + marg; + int h = gdi.scaleLength(12); + int w = gdi.scaleLength(6); + int maxx = xp, maxy = yp; + + RECT rc; + for (size_t k = 0;k < cInfo.size(); k++) { + const ClassInfo &ci = cInfo[k]; + rc.top = yp + index[k] * h; + rc.bottom = rc.top + h - 1; + int g = ci.unique; + GDICOLOR color = GDICOLOR(RGB(((g * 30)&0xFF), ((g * 50)&0xFF), ((g * 70)&0xFF))); + for (int j = 0; jgetClass(ci.classId); + if (pc) { + string course = pc->getCourse() ? ", " + pc->getCourse()->getName() : ""; + string tip = "X (Y deltagare, grupp Z, W)#" + pc->getName() + course + "#" + itos(ci.nRunners) + "#" + itos(groupNumber[ci.unique]) + + "#" + groups[ci.unique]; + rc.left = xp + ci.firstStart * w; + int laststart = ci.firstStart + (ci.nRunners-1) * ci.interval; + rc.right = xp + (laststart + 1) * w; + gdi.addToolTip("", tip, 0, &rc); + maxx = max(maxx, rc.right); + maxy = max(maxy, rc.bottom); + } + } + rc.left = xp - marg; + rc.top = yp - marg; + rc.bottom = maxy + marg; + rc.right = maxx + marg; + gdi.addRectangle(rc, colorLightYellow, true, true); + +} + +void TabClass::showClassSettings(gdioutput &gdi) +{ + ClassInfo::sSortOrder = 2; + sort(cInfo.begin(), cInfo.end()); + ClassInfo::sSortOrder=0; + + int laststart=0; + for (size_t k=0;kgetAbsTime(ci.firstStart*drawInfo.baseInterval+drawInfo.firstStart); + string last=oe->getAbsTime((laststart)*drawInfo.baseInterval+drawInfo.firstStart); + pClass pc=oe->getClass(ci.classId); + sprintf_s(bf1, "%s, %d", pc ? pc->getName().c_str(): "-", ci.nRunners); + sprintf_s(bf2, "%d-[%d]-%d (%s-%s)", ci.firstStart, ci.interval, laststart, first.c_str(), last.c_str()); + + gdi.fillRight(); + + int id = ci.classId; + gdi.addString("C" + itos(id), 0, "X platser. Startar Y#" + string(bf1) + "#" + bf2); + y = gdi.getCY(); + gdi.addInput(xp+300, y, "S"+itos(id), first, 7, DrawClassesCB); + gdi.addInput(xp+300+width, y, "I"+itos(id), formatTime(ci.interval*drawInfo.baseInterval), 7, DrawClassesCB); + gdi.addInput(xp+300+width*2, y, "V"+itos(id), itos(ci.nVacant), 7, DrawClassesCB); + gdi.addInput(xp+300+width*3, y, "R"+itos(id), itos(ci.nExtra), 7, DrawClassesCB); + + if (k%5 == 4) + gdi.dropLine(1); + + gdi.dropLine(1.6); + gdi.fillDown(); + gdi.popX(); + } + + gdi.dropLine(); + gdi.pushX(); + + gdi.fillRight(); + + gdi.addButton("VisualizeDraw", "Visualisera startfältet...", ClassesCB); + + gdi.addButton("SaveDrawSettings", "Spara starttider", ClassesCB, + "Spara inmatade tider i tävlingen utan att tilldela starttider."); + + gdi.addButton("DrawAllAdjust", "Ändra inställningar", ClassesCB, + "Ändra grundläggande inställningar och gör en ny fördelning").setExtra(13); + + if (!cInfo.empty()) { + gdi.addButton("DrawAdjust", "Uppdatera fördelning", ClassesCB, + "Uppdatera fördelningen av starttider med hänsyn till manuella ändringar ovan"); + gdi.disableInput("DrawAdjust"); + } + gdi.popX(); + gdi.dropLine(3); + + gdi.fillRight(); + + if (!cInfo.empty()) { + gdi.pushX(); + + RECT rc; + rc.left = gdi.getCX(); + rc.top = gdi.getCY(); + rc.bottom = rc.top + gdi.getButtonHeight() + gdi.scaleLength(22) + gdi.getLineHeight(); + gdi.setCX(rc.left + gdi.scaleLength(10)); + gdi.setCY(rc.top + gdi.scaleLength(10)); + + gdi.addSelection("Method", 200, 200, 0, "Metod:"); + gdi.addItem("Method", lang.tl("Lottning"), DMRandom); + gdi.addItem("Method", lang.tl("SOFT-lottning"), DMSOFT); + + gdi.selectItemByData("Method", getDefaultMethod(false)); + + gdi.addSelection("PairSize", 150, 200, 0, "Tillämpa parstart:"); + gdi.addItem("PairSize", getPairOptions()); + gdi.selectItemByData("PairSize", 1); + + gdi.dropLine(0.9); + + gdi.addButton("DoDrawAll", "Utför lottning", ClassesCB); + + rc.right = gdi.getCX() + gdi.scaleLength(5); + gdi.addRectangle(rc, colorLightGreen); + gdi.setCX(rc.right + gdi.scaleLength(10)); + } + + gdi.addButton("Cancel", "Avbryt", ClassesCB); + + gdi.fillDown(); + gdi.dropLine(2); + gdi.popX(); + + + gdi.fillDown(); + gdi.popX(); + gdi.scrollToBottom(); + gdi.updateScrollbars(); + gdi.refresh(); +} + +void TabClass::selectClass(gdioutput &gdi, int cid) +{ + oe->fillCourses(gdi, "Courses", true); + gdi.addItem("Courses", lang.tl("Ingen bana"), -2); + + if (cid==0) { + gdi.restore("", true); + gdi.disableInput("MultiCourse", true); + gdi.enableInput("Courses"); + gdi.enableEditControls(false); + gdi.setText("Name", ""); + gdi.selectItemByData("Courses", -2); + gdi.check("AllowQuickEntry", true); + + if (gdi.hasField("FreeStart")) + gdi.check("FreeStart", false); + if (gdi.hasField("IgnoreStart")) + gdi.check("IgnoreStart", false); + + if (gdi.hasField("DirectResult")) + gdi.check("DirectResult", false); + + gdi.check("NoTiming", false); + + ClassId=cid; + EditChanged=false; + + gdi.disableInput("Remove"); + gdi.disableInput("Save"); + return; + } + + pClass pc = oe->getClass(cid); + + if (!pc) { + selectClass(gdi, 0); + return; + } + + gdi.enableEditControls(true); + gdi.enableInput("Remove"); + gdi.enableInput("Save"); + + pc->synchronize(); + gdi.setText("Name", pc->getName()); + + gdi.setText("ClassType", pc->getType()); + gdi.setText("StartName", pc->getStart()); + if (pc->getBlock()>0) + gdi.selectItemByData("StartBlock", pc->getBlock()); + else + gdi.selectItemByData("StartBlock", -1); + + if (gdi.hasField("Status")) { + vector< pair > out; + size_t selected = 0; + pc->getDCI().fillInput("Status", out, selected); + gdi.addItem("Status", out); + gdi.selectItemByData("Status", selected); + } + + gdi.check("AllowQuickEntry", pc->getAllowQuickEntry()); + gdi.check("NoTiming", pc->getNoTiming()); + + if (gdi.hasField("FreeStart")) + gdi.check("FreeStart", pc->hasFreeStart()); + + if (gdi.hasField("IgnoreStart")) + gdi.check("IgnoreStart", pc->ignoreStartPunch()); + + if (gdi.hasField("DirectResult")) + gdi.check("DirectResult", pc->hasDirectResult()); + + ClassId=cid; + + if (pc->hasTrueMultiCourse()) { + gdi.restore("", false); + + multiCourse(gdi, pc->getNumStages()); + gdi.refresh(); + + gdi.addItem("Courses", lang.tl("Flera banor"), -3); + gdi.selectItemByData("Courses", -3); + gdi.disableInput("Courses"); + gdi.check("CoursePool", pc->hasCoursePool()); + + if (gdi.hasField("Unordered")) + gdi.check("Unordered", pc->hasUnorderedLegs()); + + if (gdi.hasField("MCourses")) { + oe->fillCourses(gdi, "MCourses", true); + string strId = "StageCourses_expl"; + gdi.setTextTranslate(strId, getCourseLabel(pc->hasCoursePool()), true); + } + + if (gdi.hasData("SimpleMulti")) { + bool hasStart = pc->getStartType(0) == STTime; + + gdi.setInputStatus("CommonStartTime", hasStart); + gdi.check("CommonStart", hasStart); + if (hasStart) + gdi.setText("CommonStartTime", pc->getStartDataS(0)); + else + gdi.setText("CommonStartTime", MakeDash("-")); + + } + else { + updateFairForking(gdi, pc); + + int nstage=pc->getNumStages(); + gdi.setText("NStage", nstage); + + for (int k=0;kgetLegType(k)); + gdi.selectItemByData((string("StartType")+legno).c_str(), pc->getStartType(k)); + updateStartData(gdi, pc, k, false, true); + gdi.setInputStatus(string("Restart")+legno, !pc->restartIgnored(k), true); + gdi.setInputStatus(string("RestartRope")+legno, !pc->restartIgnored(k), true); + + if (gdi.hasField(string("Restart")+legno)) + gdi.setText(string("Restart")+legno, pc->getRestartTimeS(k)); + if (gdi.hasField(string("RestartRope")+legno)) + gdi.setText(string("RestartRope")+legno, pc->getRopeTimeS(k)); + if (gdi.hasField(string("MultiR")+legno)) + gdi.selectItemByData((string("MultiR")+legno).c_str(), pc->getLegRunner(k)); + } + } + } + else { + gdi.restore("", true); + gdi.enableInput("MultiCourse", true); + gdi.enableInput("Courses"); + pCourse pcourse = pc->getCourse(); + gdi.selectItemByData("Courses", pcourse ? pcourse->getId():-2); + } + + gdi.selectItemByData("Classes", cid); + + ClassId=cid; + EditChanged=false; +} + +void TabClass::legSetup(gdioutput &gdi) +{ + gdi.restore("RelaySetup"); + gdi.pushX(); + gdi.fillDown(); + + gdi.addString("", 10, "help:relaysetup"); + gdi.dropLine(); + gdi.addSelection("Predefined", 150, 200, MultiCB, "Fördefinierade tävlingsformer:").ignore(true); + oe->fillPredefinedCmp(gdi, "Predefined"); + if (storedPredefined == oEvent::PredefinedTypes(-1)) { + bool hasPatrol = oe->getMeOSFeatures().hasFeature(MeOSFeatures::Patrol); + bool hasRelay = oe->getMeOSFeatures().hasFeature(MeOSFeatures::Relay); + if (hasRelay) + storedPredefined = oEvent::PRelay; + else if (hasPatrol) + storedPredefined = oEvent::PPatrol; + else + storedPredefined = oEvent::PNoSettings; + } + + gdi.selectItemByData("Predefined", storedPredefined); + + gdi.fillRight(); + gdi.addInput("NStage", storedNStage, 4, MultiCB, "Antal sträckor:").ignore(true); + gdi.addInput("StartTime", storedStart, 6, MultiCB, "Starttid (HH:MM:SS):"); + gdi.popX(); + + bool nleg; + bool start; + oe->setupRelayInfo(storedPredefined, nleg, start); + gdi.setInputStatus("NStage", nleg); + gdi.setInputStatus("StartTime", start); + + gdi.fillRight(); + gdi.dropLine(3); + gdi.addButton("SetNStage", "Verkställ", MultiCB); + gdi.fillDown(); + gdi.addButton("Cancel", "Avbryt", ClassesCB); + + gdi.popX(); +} + + +void TabClass::multiCourse(gdioutput &gdi, int nLeg) { + currentStage=-1; + + bool simpleView = nLeg==1; + + bool showGuide = (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Relay) || + oe->getMeOSFeatures().hasFeature(MeOSFeatures::Patrol)) && nLeg==0; + + if (nLeg == 0 && !showGuide) { + pClass pc = oe->getClass(ClassId); + if (pc) { + pc->setNumStages(1); + pc->setStartType(0, STDrawn, false); + pc->forceShowMultiDialog(true); + selectClass(gdi, ClassId); + return; + } + } + + gdi.disableInput("MultiCourse", true); + gdi.setRestorePoint(); + gdi.fillDown(); + gdi.newColumn(); + + + int cx=gdi.getCX(), cy=gdi.getCY(); + gdi.setCX(cx+10); + gdi.setCY(cy+10); + + if (simpleView) { + gdi.addString("", fontMediumPlus, "Gafflade banor"); + } + else { + gdi.addString("", 2, "Flera banor / stafett / patrull / banpool"); + gdi.addString("", 0, "Låt klassen ha mer än en bana eller sträcka"); + gdi.dropLine(); + } + gdi.setRestorePoint("RelaySetup"); + + if (showGuide) { + legSetup(gdi); + RECT rc; + rc.left = cx; + rc.right = gdi.getWidth()+10; + rc.bottom = gdi.getCY()+10; + rc.top = cy; + gdi.addRectangle(rc, colorLightGreen, true, false).set3D(true).setColor2(colorLightCyan); + } + else if (simpleView) { + gdi.fillRight(); + gdi.pushX(); + gdi.setData("SimpleMulti", 1); + gdi.dropLine(); + gdi.addCheckbox("CommonStart", "Gemensam start", MultiCB, false); + //gdi.dropLine(-1); + gdi.addInput("CommonStartTime", "", 10, 0, ""); + + gdi.fillDown(); + gdi.popX(); + gdi.dropLine(2); + gdi.addCheckbox("CoursePool", "Använd banpool", MultiCB, false, + "Knyt löparna till banor från en pool vid målgång."); + + gdi.addButton("OneCourse", "Endast en bana", MultiCB, "Använd endast en bana i klassen"); + gdi.setRestorePoint("Courses"); + selectCourses(gdi, 0); + + RECT rc; + rc.left = cx; + rc.right = gdi.getWidth()+10; + rc.bottom = gdi.getCY()+10; + rc.top = cy; + gdi.addRectangle(rc, colorLightBlue, true, false).set3D(true); + } + else { + gdi.pushX(); + gdi.fillRight(); + gdi.addButton("ChangeLeg", "Ändra klassinställningar...", MultiCB, "Starta en guide som hjälper dig göra klassinställningar"); + + gdi.fillDown(); + gdi.popX(); + gdi.dropLine(2); + + gdi.dropLine(0.5); + int headYPos=gdi.getCY(); + gdi.dropLine(1.2); + + vector< pair > legs; + legs.reserve(nLeg); + for (int j=0;jgetMeOSFeatures().hasFeature(MeOSFeatures::MultipleRaces); + bool hasRelay = oe->getMeOSFeatures().hasFeature(MeOSFeatures::Relay); + + for (int k=0;k0) + pc=oe->getClass(cid); + else { + pc=oe->addClass(name); + create=true; + } + + if (!pc) + throw std::exception("Class not found."); + + ClassId=pc->getId(); + + pc->setName(name); + if (gdi.hasField("StartName")) + pc->setStart(gdi.getText("StartName")); + + if (gdi.hasField("ClassType")) + pc->setType(gdi.getText("ClassType")); + + if (gdi.hasField("StartBlock")) + pc->setBlock(gdi.getTextNo("StartBlock")); + + if (gdi.hasField("Status")) { + pc->getDI().setEnum("Status", gdi.getSelectedItem("Status").first); + } + + if (gdi.hasField("CoursePool")) + pc->setCoursePool(gdi.isChecked("CoursePool")); + + if (gdi.hasField("Unordered")) + pc->setUnorderedLegs(gdi.isChecked("Unordered")); + + pc->setAllowQuickEntry(gdi.isChecked("AllowQuickEntry")); + pc->setNoTiming(gdi.isChecked("NoTiming")); + + if (gdi.hasField("FreeStart")) + pc->setFreeStart(gdi.isChecked("FreeStart")); + + if (gdi.hasField("IgnoreStart")) + pc->setIgnoreStartPunch(gdi.isChecked("IgnoreStart")); + + if (gdi.hasField("DirectResult")) { + bool withDirect = gdi.isChecked("DirectResult"); + + if (withDirect && !pc->hasDirectResult() && !hasWarnedDirect) { + if (gdi.ask("warning:direct_result")) + hasWarnedDirect = true; + else + withDirect = false; + } + + pc->setDirectResult(withDirect); + } + + int crs = gdi.getSelectedItem("Courses").first; + + if (crs==0) { + //Skapa ny bana... + pCourse pcourse=oe->addCourse("Bana "+name); + pc->setCourse(pcourse); + pc->synchronize(); + return; + } + else if (crs==-2) + pc->setCourse(0); + else if (crs > 0) + pc->setCourse(oe->getCourse(crs)); + + if (pc->hasMultiCourse()) { + + if (gdi.hasData("SimpleMulti")) { + bool sim = gdi.isChecked("CommonStart"); + if (sim) { + pc->setStartType(0, STTime, true); + pc->setStartData(0, gdi.getText("CommonStartTime")); + } + else { + pc->setStartType(0, STDrawn, true); + } + } + else { + int nstage=pc->getNumStages(); + bool needAdjust = false; + for (int k=0;ksetLegType(k, LegTypes(gdi.getSelectedItem(string("LegType")+legno).first)); + + pc->setStartType(k, StartTypes(gdi.getSelectedItem(string("StartType")+legno).first), true); + + if (pc->getStartType(k) == STChange) { + int val = gdi.getSelectedItem(string("StartData")+legno).first; + if (val <= -10) + pc->setStartData(k, val + 10); + else + pc->setStartData(k, 0); + } + else { + pc->setStartData(k, gdi.getText(string("StartData")+legno)); + } + string key; + + key = string("Restart")+legno; + if (gdi.hasField(key)) + pc->setRestartTime(k, gdi.getText(key)); + + key = string("RestartRope")+legno; + + if (gdi.hasField(key)) + pc->setRopeTime(k, gdi.getText(key)); + + key = string("MultiR")+legno; + if (gdi.hasField(key)) { + int mr = gdi.getSelectedItem(key).first; + + if (pc->getLegRunner(k) != mr) + needAdjust = true; + + pc->setLegRunner(k, mr); + } + } + + if (needAdjust) + oe->adjustTeamMultiRunners(pc); + } + } + + pc->addClassDefaultFee(false); + pc->updateChangedCoursePool(); + pc->synchronize(); + oe->reCalculateLeaderTimes(pc->getId()); + set cls; + cls.insert(pc->getId()); + oe->reEvaluateAll(cls, true); + + oe->fillClasses(gdi, "Classes", oEvent::extraDrawn, oEvent::filterNone); + EditChanged=false; + if (!skipReload) { + ClassId = 0; + selectClass(gdi, pc->getId()); + } + + if (checkValid) { + // Check/warn that starts blocks are set up correctly + vector b; + vector s; + oe->getStartBlocks(b, s); + oe->sanityCheck(gdi, false, pc->getId()); + } +} + +struct ButtonData { + ButtonData(const char *idIn, + const char *labelIn, + bool glob) : id(idIn), label(labelIn), global(glob) {} + string id; + string label; + bool global; +}; + +bool TabClass::loadPage(gdioutput &gdi) +{ + oe->checkDB(); + oe->checkNecessaryFeatures(); + gdi.selectTab(tabId); + gdi.clearPage(false); + int xp=gdi.getCX(); + + const int button_w=gdi.scaleLength(90); + string switchMode; + switchMode=tableMode ? "Formulärläge" : "Tabelläge"; + gdi.addButton(2, 2, button_w, "SwitchMode", switchMode, + ClassesCB, "Välj vy", false, false).fixedCorner(); + + if (tableMode) { + Table *tbl=oe->getClassTB(); + gdi.addTable(tbl, xp, 30); + return true; + } + + if (showForkingGuide) { + try { + defineForking(gdi, false); + } + catch(...) { + showForkingGuide = false; + throw; + } + return true; + } + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + + bool showAdvanced = oe->getPropertyInt("AdvancedClassSettings", 0) != 0; + gdi.addString("", boldLarge, "Klasser"); + + gdi.fillDown(); + gdi.addListBox("Classes", 200, showAdvanced ? 512 : 420, ClassesCB, "").isEdit(false).ignore(true); + gdi.setTabStops("Classes", 185); + oe->fillClasses(gdi, "Classes", oEvent::extraDrawn, oEvent::filterNone); + + gdi.newColumn(); + gdi.dropLine(2); + + gdi.fillRight(); + gdi.pushX(); + gdi.addInput("Name", "", 14, ClassesCB, "Klassnamn:"); + bool sameLineNameCourse = true; + if (showAdvanced) { + gdi.addCombo("ClassType", 100, 300, 0, "Typ:"); + oe->fillClassTypes(gdi, "ClassType"); + sameLineNameCourse = false; + } + + if (showMulti(false) || !sameLineNameCourse) { + gdi.dropLine(3); + gdi.popX(); + } + + gdi.addSelection("Courses", 120, 400, ClassesCB, "Bana:"); + oe->fillCourses(gdi, "Courses", true); + gdi.addItem("Courses", lang.tl("Ingen bana"), -2); + + if (showMulti(false)) { + gdi.dropLine(0.9); + if (showMulti(true)) { + gdi.addButton("MultiCourse", "Flera banor/stafett...", ClassesCB); + } + else { + gdi.addButton("MultiCourse", "Gafflade banor...", ClassesCB); + } + gdi.disableInput("MultiCourse"); + } + + gdi.popX(); + if (showAdvanced) { + gdi.dropLine(3); + + gdi.addCombo("StartName", 120, 300, 0, "Startnamn:"); + oe->fillStarts(gdi, "StartName"); + + gdi.addSelection("StartBlock", 80, 300, 0, "Startblock:"); + + for (int k=1;k<=100;k++) { + char bf[16]; + sprintf_s(bf, "%d", k); + gdi.addItem("StartBlock", bf, k); + } + + gdi.popX(); + gdi.dropLine(3); + gdi.addSelection("Status", 200, 300, 0, "Status:"); + } + + gdi.popX(); + gdi.dropLine(3.5); + gdi.addCheckbox("AllowQuickEntry", "Tillåt direktanmälan", 0); + gdi.addCheckbox("NoTiming", "Utan tidtagning", 0); + + if (showAdvanced) { + gdi.dropLine(2); + gdi.popX(); + gdi.addCheckbox("FreeStart", "Fri starttid", 0, false, "Klassen lottas inte, startstämpling"); + gdi.addCheckbox("IgnoreStart", "Ignorera startstämpling", 0, false, "Uppdatera inte starttiden vid startstämpling"); + + gdi.dropLine(2); + gdi.popX(); + + gdi.addCheckbox("DirectResult", "Resultat vid målstämpling", 0, false, + "help:DirectResult"); + + } + gdi.dropLine(2); + gdi.popX(); + + gdi.fillDown(); + gdi.addString("", 1, "Funktioner"); + + vector func; + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::DrawStartList)) + func.push_back(ButtonData("Draw", "Lotta / starttider...", false)); + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Bib)) + func.push_back(ButtonData("Bibs", "Nummerlappar...", false)); + if (cnf.hasTeamClass()) + func.push_back(ButtonData("Restart", "Omstart...", true)); + if (showAdvanced) { + func.push_back(ButtonData("Merge", "Slå ihop klasser...", false)); + func.push_back(ButtonData("Split", "Dela klassen...", false)); + } + + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::DrawStartList)) + func.push_back(ButtonData("DrawMode", "Lotta flera klasser", true)); + func.push_back(ButtonData("QuickSettings", "Snabbinställningar", true)); + + if (showAdvanced && oe->getMeOSFeatures().hasFeature(MeOSFeatures::Vacancy)) { + vector rr; + oe->getRunners(0, 0, rr, false); + bool hasVac = false; + for (size_t k = 0; k < rr.size(); k++) { + if (rr[k]->isVacant()) { + hasVac = true; + break; + } + } + if (hasVac) + func.push_back(ButtonData("RemoveVacant", "Radera vakanser", true)); + } + + gdi.dropLine(0.3); + gdi.pushX(); + gdi.fillRight(); + + for (size_t k = 0; k < func.size(); k++) { + ButtonInfo &bi = gdi.addButton(func[k].id, func[k].label, ClassesCB); + if (!func[k].global) + bi.isEdit(true); + if ( k % 2 == 1) { + gdi.popX(); + gdi.dropLine(2.5); + } + } + + gdi.popX(); + gdi.dropLine(3); + gdi.fillRight(); + gdi.addButton("Save", "Spara", ClassesCB).setDefault(); + gdi.disableInput("Save"); + gdi.addButton("Remove", "Radera", ClassesCB); + gdi.disableInput("Remove"); + gdi.addButton("Add", "Ny klass", ClassesCB); + + gdi.popX(); + gdi.fillDown(); + gdi.dropLine(3); + gdi.addCheckbox("UseAdvanced", "Visa avancerade funktioner", ClassesCB, showAdvanced).isEdit(false); + + gdi.setOnClearCb(ClassesCB); + gdi.setRestorePoint(); + + gdi.setCX(xp); + gdi.setCY(gdi.getHeight()); + + gdi.addString("", 10, "help:26963"); + + selectClass(gdi, ClassId); + + EditChanged=false; + gdi.refresh(); + + return true; +} + +bool TabClass::showMulti(bool singleOnly) const { + const MeOSFeatures &mf = oe->getMeOSFeatures(); + if (!singleOnly) + return mf.hasFeature(MeOSFeatures::Relay) || mf.hasFeature(MeOSFeatures::Patrol) || mf.hasFeature(MeOSFeatures::ForkedIndividual); + else + return mf.hasFeature(MeOSFeatures::Relay) || mf.hasFeature(MeOSFeatures::Patrol) || mf.hasFeature(MeOSFeatures::MultipleRaces); +} + +static int classSettingsCB(gdioutput *gdi, int type, void *data) +{ + TabClass &tc = dynamic_cast(*gdi->getTabs().get(TClassTab)); + + static string lastStart = "Start 1"; + if (type==GUI_INPUT) { + InputInfo ii=*(InputInfo *)data; + + if (ii.id.substr(0,4) == "Strt") { + lastStart = ii.text; + } + } + else if (type == GUI_FOCUS) { + InputInfo ii=*(InputInfo *)data; + if (ii.id.substr(0,4) == "Strt") { + if (ii.text.empty()) { + gdi->setText(ii.id, lastStart); + gdi->setInputFocus(ii.id, true); + } + } + } + else if (type == GUI_BUTTON) { + ButtonInfo bi = *(ButtonInfo*)data; + if (bi.id == "SaveCS") { + tc.saveClassSettingsTable(*gdi); + } + } + else if (type == GUI_CLEAR) { + tc.saveClassSettingsTable(*gdi); + return 1; + } + return 0; +} + +void TabClass::saveClassSettingsTable(gdioutput &gdi) { + set modifiedFee; + bool modifiedBib = false; + + saveClassSettingsTable(gdi, modifiedFee, modifiedBib); + + oe->synchronize(true); + if (gdi.hasField("BibGap")) { + int gap = gdi.getTextNo("BibGap"); + if (oe->getBibClassGap() != gap) { + oe->setBibClassGap(gap); + modifiedBib = true; + } + } + + if (!modifiedFee.empty() && oe->getNumRunners() > 0) { + bool updateFee = gdi.ask("ask:changedclassfee"); + + if (updateFee) + oe->applyEventFees(false, true, false, modifiedFee); + } + + if (modifiedBib && gdi.ask("Vill du uppdatera alla nummerlappar?")) { + oe->addAutoBib(); + } + oe->synchronize(true); + gdi.sendCtrlMessage("Cancel"); +} + +void TabClass::prepareForDrawing(gdioutput &gdi) { + gdi.clearPage(false); + gdi.addString("", 2, "Klassinställningar"); + int baseLine = gdi.getCY(); + gdi.addString("", 10, "help:59395"); + gdi.pushX(); + + int by = gdi.getCY(); + gdi.setCX(gdi.getWidth()); + gdi.setCY(baseLine); + gdi.addString("", 10, "help:59395_more"); + + gdi.setCY(max(gdi.getCY(), by)); + gdi.popX(); + gdi.dropLine(); + + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Bib)) { + gdi.fillRight(); + gdi.addString("", 0, "Antal reserverade nummerlappsnummer mellan klasser:"); + gdi.dropLine(-0.1); + gdi.addInput("BibGap", itos(oe->getBibClassGap()), 5); + gdi.popX(); + gdi.dropLine(1.5); + gdi.fillDown(); + } + + getClassSettingsTable(gdi, classSettingsCB); + + gdi.dropLine(); + gdi.fillRight(); + gdi.addButton("SaveCS", "Spara", classSettingsCB); + gdi.addButton("Cancel", "Avbryt", ClassesCB); + + gdi.refresh(); +} + +void TabClass::drawDialog(gdioutput &gdi, DrawMethod method, const oClass &pc) { + oe->setProperty("DefaultDrawMethod", method); + + if (lastDrawMethod == method) + return; + + if (lastDrawMethod == DMPursuit && method == DMReversePursuit) + return; + if (lastDrawMethod == DMReversePursuit && method == DMPursuit) + return; + + if (lastDrawMethod == DMRandom && method == DMSOFT) + return; + if (lastDrawMethod == DMSOFT && method == DMRandom) + return; + + int firstStart = 3600, + interval = 120, + vac = atoi(lastNumVac.c_str()); + + int pairSize = lastPairSize; + + if (gdi.hasField("FirstStart")) + firstStart = oe->getRelativeTime(gdi.getText("FirstStart")); + else if (!lastFirstStart.empty()) + firstStart = oe->getRelativeTime(lastFirstStart); + + if (gdi.hasField("Interval")) + interval = convertAbsoluteTimeMS(gdi.getText("Interval")); + else if (!lastInterval.empty()) + interval = convertAbsoluteTimeMS(lastInterval); + + if (gdi.hasField("PairSize")) { + pairSize = gdi.getSelectedItem("PairSize").first; + } + gdi.restore("MultiDayDraw", false); + + const bool multiDay = oe->hasPrevStage(); + + if (method == DMSeeded) { + gdi.addString("", 10, "help:seeding_info"); + gdi.dropLine(1); + gdi.pushX(); + gdi.fillRight(); + ListBoxInfo &seedmethod = gdi.addSelection("SeedMethod", 120, 100, 0, "Seedningskälla:"); + vector< pair > methods; + oClass::getSeedingMethods(methods); + gdi.addItem("SeedMethod", methods); + if (lastSeedMethod == -1) + gdi.selectFirstItem("SeedMethod"); + else + gdi.selectItemByData("SeedMethod", lastSeedMethod); + seedmethod.setSynchData(&lastSeedMethod); + gdi.addInput("SeedGroups", lastSeedGroups, 32, 0, "Seedningsgrupper:", + "Ange en gruppstorlek (som repeteras) eller flera kommaseparerade gruppstorlekar"). + setSynchData(&lastSeedGroups); + gdi.fillDown(); + gdi.popX(); + gdi.dropLine(3); + gdi.addCheckbox("PreventClubNb", "Hindra att deltagare från samma klubb startar på angränsande tider", + 0, lastSeedPreventClubNb).setSynchData(&lastSeedPreventClubNb); + gdi.addCheckbox("ReverseSeedning", "Låt de bästa start först", 0, lastSeedReverse). + setSynchData(&lastSeedReverse); + } + else { + gdi.popX(); + gdi.addString("", 10, "help:41641"); + gdi.dropLine(1); + } + + if (method == DMRandom || method == DMSOFT || method == DMPursuit + || method == DMReversePursuit || method == DMSeeded) { + gdi.addSelection("PairSize", 150, 200, 0, "Tillämpa parstart:").setSynchData(&lastPairSize); + gdi.addItem("PairSize", getPairOptions()); + gdi.selectItemByData("PairSize", pairSize); + } + gdi.fillRight(); + + gdi.addInput("FirstStart", oe->getAbsTime(firstStart), 10, 0, "Första start:").setSynchData(&lastFirstStart); + + if (method == DMPursuit || method == DMReversePursuit) { + gdi.addInput("MaxAfter", lastMaxAfter, 10, 0, "Maxtid efter:", "Maximal tid efter ledaren för att delta i jaktstart").setSynchData(&lastMaxAfter); + gdi.addInput("TimeRestart", oe->getAbsTime(firstStart + 3600), 8, 0, "Första omstartstid:"); + gdi.addInput("ScaleFactor", lastScaleFactor, 8, 0, "Tidsskalning:").setSynchData(&lastScaleFactor); + } + + if (method != DMSimultaneous) + gdi.addInput("Interval", formatTime(interval), 10, 0, "Startintervall (min):").setSynchData(&lastInterval); + + if (method == DMRandom || method == DMSOFT || method == DMClumped) + gdi.addInput("Vacanses", itos(vac), 10, 0, "Antal vakanser:").setSynchData(&lastNumVac); + + if ((method == DMRandom || method == DMSOFT || method == DMSeeded) && pc.getNumStages() > 1 && pc.getClassType() != oClassPatrol) { + gdi.addSelection("Leg", 90, 100, 0, "Sträcka:", "Sträcka att lotta"); + for (unsigned k = 0; k 10) + defaultMethod = getDefaultMethod(hasMulti); + + gdi.selectItemByData("Method", defaultMethod); + + if (gdi.hasField("Vacanses")) { + gdi.setInputStatus("Vacanses", !hasMulti); + gdi.setInputStatus("HandleBibs", !hasMulti); + + if (hasMulti) { + gdi.check("HandleBibs", false); + gdi.setInputStatus("Bib", false); + } + } + + if (gdi.hasField("DoDrawBefore")) { + gdi.setInputStatus("DoDrawBefore", !hasMulti); + gdi.setInputStatus("DoDrawAfter", !hasMulti); + } +} + +void TabClass::pursuitDialog(gdioutput &gdi) { + gdi.clearPage(false); + gdi.addString("", boldLarge, "Jaktstart"); + gdi.dropLine(); + vector cls; + oe->getClasses(cls, true); + + gdi.setRestorePoint("Pursuit"); + + gdi.pushX(); + + gdi.fillRight(); + + gdi.addInput("MaxAfter", formatTime(pSavedDepth), 10, 0, "Maxtid efter:", "Maximal tid efter ledaren för att delta i jaktstart"); + gdi.addInput("TimeRestart", "+" + formatTime(pFirstRestart), 8, 0, "Första omstartstid:", "Ange tiden relativt klassens första start"); + gdi.addInput("Interval", formatTime(pInterval), 8, 0, "Startintervall:", "Ange startintervall för minutstart"); + char bf[32]; + sprintf_s(bf, "%f", pTimeScaling); + gdi.addInput("ScaleFactor", bf, 8, 0, "Tidsskalning:"); + + gdi.dropLine(4); + gdi.popX(); + gdi.fillDown(); + //xxx + //gdi.addCheckbox("Pairwise", "Tillämpa parstart", 0, false); + gdi.addSelection("PairSize", 150, 200, 0, "Tillämpa parstart:"); + gdi.addItem("PairSize", getPairOptions()); + gdi.selectItemByData("PairSize", 1); + + int cx = gdi.getCX(); + int cy = gdi.getCY(); + + const int len5 = gdi.scaleLength(5); + const int len40 = gdi.scaleLength(30); + const int len200 = gdi.scaleLength(200); + + gdi.addString("", cy, cx, 1, "Välj klasser"); + gdi.addString("", cy, cx + len200 + len40, 1, "Första starttid"); + cy += gdi.getLineHeight()*2; + + for (size_t k = 0; k::iterator st = pSettings.find(cls[k]->getId()); + + if (st == pSettings.end()) { + pSettings.insert(make_pair(cls[k]->getId(), PursuitSettings(*cls[k]))); + st = pSettings.find(cls[k]->getId()); + } + + PursuitSettings &ps = st->second; + int fs = cls[k]->getDrawFirstStart(); + if (fs > 0) + ps.firstTime = fs; + + ButtonInfo &bi = gdi.addCheckbox(cx, cy + len5, "PLUse" + itos(k), "", ClassesCB, ps.use); + bi.setExtra(cls[k]->getId()); + gdi.addStringUT(cy, cx + len40, 0, cls[k]->getName(), len200); + + gdi.addInput(cx + len200 + len40, cy, "First" + itos(k), oe->getAbsTime(ps.firstTime), 8); + + if (!ps.use) + gdi.disableInput(("First" + itos(k)).c_str()); + + cy += int(gdi.getLineHeight()*1.8); + } + + gdi.dropLine(); + gdi.fillRight(); + gdi.addButton("SelectAllNoneP", "Välj alla", ClassesCB).setExtra(1); + gdi.addButton("SelectAllNoneP", "Välj ingen", ClassesCB).setExtra(0); + gdi.popX(); + gdi.dropLine(3); + RECT rc; + rc.left = gdi.getCX(); + rc.top = gdi.getCY(); + rc.bottom = rc.top + gdi.getButtonHeight() + gdi.scaleLength(17); + gdi.setCX(rc.left + gdi.scaleLength(10)); + gdi.setCY(rc.top + gdi.scaleLength(10)); + gdi.addButton("DoPursuit", "Jaktstart", ClassesCB).setDefault().setExtra(1); + gdi.addButton("DoPursuit", "Omvänd jaktstart", ClassesCB).setExtra(2); + + rc.right = gdi.getCX() + gdi.scaleLength(5); + gdi.addRectangle(rc, colorLightGreen); + gdi.setCX(rc.right + gdi.scaleLength(10)); + + gdi.addButton("SavePursuit", "Spara starttider", ClassesCB, "Spara inmatade tider i tävlingen utan att tilldela starttider."); + + gdi.addButton("CancelPursuit", "Återgå", ClassesCB).setCancel(); + gdi.refresh(); +} + + +void TabClass::showClassSelection(gdioutput &gdi, int &bx, int &by, GUICALLBACK classesCB) const { + gdi.pushY(); + int cx = gdi.getCX(); + int width = gdi.scaleLength(230); + gdi.addListBox("Classes", 200, 400, classesCB, "Klasser:", "", true); + gdi.setTabStops("Classes", 185); + gdi.fillRight(); + gdi.pushX(); + + gdi.addButton("SelectAll", "Välj allt", ClassesCB, + "Välj alla klasser").isEdit(true); + + gdi.addButton("SelectMisses", "Saknad starttid", ClassesCB, + "Välj klasser där någon löpare saknar starttid").isEdit(true); + + gdi.dropLine(2.3); + gdi.popX(); + + gdi.addButton("SelectUndrawn", "Ej lottade", ClassesCB, + "Välj klasser där alla löpare saknar starttid").isEdit(true); + + gdi.fillDown(); + gdi.addButton("SelectNone", "Välj inget", ClassesCB, + "Avmarkera allt").isEdit(true); + gdi.popX(); + + vector blocks; + vector starts; + oe->getStartBlocks(blocks, starts); + map sstart; + for (size_t k = 0; k < starts.size(); k++) { + sstart.insert(make_pair(starts[k], k)); + } + if (sstart.size() > 1) { + gdi.fillRight(); + int cnt = 0; + for (map::reverse_iterator it = sstart.rbegin(); it != sstart.rend(); ++it) { + if ((cnt & 1)==0 && cnt>0) { + gdi.dropLine(2); + gdi.popX(); + } + string name = it->first; + if (name.empty()) + name = lang.tl("övriga"); + gdi.addButton("SelectStart", "Välj X#" + name, ClassesCB, "").isEdit(true).setExtra(it->second); + cnt++; + } + gdi.dropLine(2.5); + gdi.popX(); + gdi.fillDown(); + } + + oe->fillClasses(gdi, "Classes", oEvent::extraDrawn, oEvent::filterNone); + + by = gdi.getCY()+gdi.getLineHeight(); + bx = gdi.getCX(); + //gdi.newColumn(); + gdi.setCX(cx+width); + gdi.popY(); +} + +void TabClass::enableLoadSettings(gdioutput &gdi) { + if (!gdi.hasField("LoadSettings")) + return; + set sel; + gdi.getSelection("Classes", sel); + bool ok = !sel.empty(); + + gdi.setInputStatus("PrepareDrawAll", ok); + gdi.setInputStatus("EraseStartAll", ok); + ok = false; + for (set::iterator it = sel.begin(); it != sel.end(); ++it) { + pClass pc = oe->getClass(*it); + + if (pc) { + if (pc->getDrawFirstStart() > 0 && pc->getDrawInterval() > 0) { + ok = true; + break; + } + } + } + + gdi.setInputStatus("LoadSettings", ok); +} + + +void TabClass::simultaneous(int classId, string time) { + pClass pc = oe->getClass(classId); + + if (!pc) + throw exception(); + + pc->getNumStages(); + if (pc->getNumStages() == 0) { + pCourse crs = pc->getCourse(); + pc->setNumStages(1); + if (crs) + pc->addStageCourse(0, crs->getId()); + } + + pc->setStartType(0, STTime, false); + pc->setStartData(0, time); + pc->synchronize(true); + pc->forceShowMultiDialog(false); + oe->reCalculateLeaderTimes(pc->getId()); + set cls; + cls.insert(pc->getId()); + oe->reEvaluateAll(cls, true); +} + +const char *TabClass::getCourseLabel(bool pool) { + if (pool) + return "Banpool:"; + else + return "Sträckans banor:"; +} + +void TabClass::selectCourses(gdioutput &gdi, int legNo) { + gdi.restore("Courses", false); + gdi.setRestorePoint("Courses"); + char bf[128]; + pClass pc=oe->getClass(ClassId); + + if (!pc) { + gdi.refresh(); + return; + } + currentStage = legNo; + gdi.dropLine(); + gdi.pushX(); + gdi.fillRight(); + + bool simpleView = pc->getNumStages() == 1; + + if (!simpleView) { + sprintf_s(bf, lang.tl("Banor för %s, sträcka %d").c_str(), pc->getName().c_str(), legNo+1); + gdi.addStringUT(1, bf); + ButtonInfo &bi1 = gdi.addButton("@Course" + itos(legNo-1), "<< Föregående", MultiCB); + if (legNo<=0) + gdi.disableInput(bi1.id.c_str()); + ButtonInfo &bi2 = gdi.addButton("@Course" + itos(legNo+1), "Nästa >>", MultiCB); + if (unsigned(legNo + 1) >= pc->getNumStages()) + gdi.disableInput(bi2.id.c_str()); + gdi.popX(); + gdi.dropLine(2.5); + } + gdi.fillRight(); + int x1=gdi.getCX(); + gdi.addListBox("StageCourses", 180, 200, MultiCB, getCourseLabel(pc->hasCoursePool())).ignore(true); + pc->fillStageCourses(gdi, currentStage, "StageCourses"); + int x2=gdi.getCX(); + gdi.fillDown(); + gdi.addListBox("MCourses", 180, 200, MultiCB, "Banor:").ignore(true); + oe->fillCourses(gdi, "MCourses", true); + + gdi.setCX(x1); + gdi.fillRight(); + + gdi.addButton("MRemove", "Ta bort markerad >>", MultiCB); + gdi.setCX(x2); + gdi.fillDown(); + + gdi.addButton("MAdd", "<< Lägg till", MultiCB); + gdi.setCX(x1); + gdi.refresh(); + if (pc->getNumStages() > 1) + gdi.scrollTo(gdi.getCX(), gdi.getCY()); +} + +void TabClass::updateFairForking(gdioutput &gdi, pClass pc) const { + vector< vector > forks; + vector< vector > forksC; + set< pair > unfairLegs; + + if (pc->checkForking(forksC, forks, unfairLegs)) { + BaseInfo *bi = gdi.setText("FairForking", gdi.getText("FairForking"), false); + TextInfo &text = dynamic_cast(*bi); + text.setColor(colorGreen); + gdi.setText("FairForking", lang.tl("The forking is fair."), true); + } + else { + BaseInfo *bi = gdi.setText("FairForking", gdi.getText("FairForking"), false); + TextInfo &text = dynamic_cast(*bi); + text.setColor(colorRed); + gdi.setText("FairForking", lang.tl("The forking is not fair."), true); + } +} + +void TabClass::defineForking(gdioutput &gdi, bool clearSettings) { + pClass pc = oe->getClass(ClassId); + if (clearSettings) { + forkingSetup.clear(); + forkingSetup.resize(pc->getNumStages()); + } + else if (forkingSetup.size() != pc->getNumStages()) + throw meosException("Internal error"); + + showForkingGuide = true; + gdi.clearPage(false); + int tx = gdi.getCX(); + int ty = gdi.getCY(); + + gdi.dropLine(2); + gdi.pushY(); + gdi.addListBox("AllCourses", 180, 300, 0, "Banor:", "", true); + oe->fillCourses(gdi, "AllCourses", true); + int bxp = gdi.getCX(); + int byp = gdi.getCY(); + gdi.fillDown(); + + gdi.newColumn(); + gdi.popY(); + gdi.addListBox("AllStages", 180, 300, MultiCB, "Legs:", "", true); + int ns = pc->getNumStages(); + + gdi.newColumn(); + gdi.fillDown(); + gdi.popY(); + gdi.addButton("AssignCourses", "Assign selected courses to selected legs", MultiCB); + gdi.disableInput("AssignCourses"); + + gdi.dropLine(); + gdi.addString("", boldText, "Forking setup"); + gdi.dropLine(0.5); + for (int k = 0; k < ns; k++) { + LegTypes lt = pc->getLegType(k); + if (lt != LTIgnore) { + gdi.addString("leg"+ itos(k), 0, "Leg X: Do not modify.#" + itos(k+1)); + gdi.addItem("AllStages", lang.tl("Leg X#" + itos(k+1)), k); + } + } + + gdi.dropLine(); + gdi.fillRight(); + gdi.addButton("ApplyForking", "Calculate and apply forking", MultiCB); + gdi.addButton("Cancel", "Avbryt", ClassesCB).setCancel(); + gdi.disableInput("ApplyForking"); + + gdi.setCX(bxp); + gdi.setCY(byp); + gdi.fillDown(); + gdi.addButton("ClearCourses", "Clear selections", MultiCB); + + gdi.addString("", 10, "help:assignforking"); + gdi.addString("", ty, tx, boldLarge, "Assign courses and apply forking to X#" + pc->getName()); + + if (!clearSettings) + gdi.sendCtrlMessage("AssignCourses"); + + gdi.refresh(); +} + +void TabClass::getClassSettingsTable(gdioutput &gdi, GUICALLBACK cb) { + + vector cls; + oe->getClasses(cls, true); + + int yp = gdi.getCY(); + int a = gdi.scaleLength(160); + int b = gdi.scaleLength(250); + int c = gdi.scaleLength(300); + int d = gdi.scaleLength(350); + int e = gdi.scaleLength(510); + int et = gdi.scaleLength(605); + int f = gdi.scaleLength(510); + int g = gdi.scaleLength(535); + + int ek1 = 0, ekextra = 0; + bool useEco = oe->getMeOSFeatures().hasFeature(MeOSFeatures::Economy); + + gdi.setOnClearCb(cb); + + if (useEco) { + ek1 = gdi.scaleLength(70); + ekextra = gdi.scaleLength(35); + d += 4 * ek1 + ekextra; + e += 4 * ek1 + ekextra; + et += 4 * ek1 + ekextra; + f += 4 * ek1 + ekextra; + g += 4 * ek1 + ekextra; + + gdi.addString("", yp, c+ek1, 1, "Avgift"); + gdi.addString("", yp, c+2*ek1, 1, "Sen avgift"); + gdi.addString("", yp, c+3*ek1, 1, "Red. avgift"); + gdi.addString("", yp, c+4*ek1, 1, "Sen red. avgift"); + } + + gdi.addString("", yp, gdi.getCX(), 1, "Klass"); + gdi.addString("", yp, a, 1, "Start"); + gdi.addString("", yp, b, 1, "Block"); + gdi.addString("", yp, c, 1, "Index"); + gdi.addString("", yp, d, 1, "Bana"); + + const bool useBibs = oe->getMeOSFeatures().hasFeature(MeOSFeatures::Bib); + const bool useTeam = oe->hasTeam(); + + vector< pair > bibOptions; + vector< pair > bibTeamOptions; + + if (useBibs) { + gdi.addString("", yp, e, 1, "Nummerlapp"); + bibOptions.push_back(make_pair(lang.tl("Manuell"), 0)); + bibOptions.push_back(make_pair(lang.tl("Löpande"), 1)); + bibOptions.push_back(make_pair(lang.tl("Ingen"), 2)); + + int bibW = gdi.scaleLength(100); + + if (useTeam) { + gdi.addString("", yp, et, 1, "Lagmedlem"); + + bibTeamOptions.push_back(make_pair(lang.tl("Oberoende"), BibFree)); + bibTeamOptions.push_back(make_pair(lang.tl("Samma"), BibSame)); + bibTeamOptions.push_back(make_pair(lang.tl("Ökande"), BibAdd)); + bibTeamOptions.push_back(make_pair(lang.tl("Sträcka"), BibLeg)); + bibW += gdi.scaleLength(85); + } + + f += bibW; + g += bibW; + } + + gdi.addString("", yp, f, 1, "Direktanmälan"); + + vector< pair > arg; + oe->fillCourses(arg, true); + + for (size_t k = 0; k < cls.size(); k++) { + pClass it = cls[k]; + int yp = gdi.getCY(); + string id = itos(it->getId()); + gdi.addStringUT(0, it->getName(), 0); + gdi.addInput(a, yp, "Strt"+id, it->getStart(), 7, cb); + string blk = it->getBlock()>0 ? itos(it->getBlock()) : ""; + gdi.addInput(b, yp, "Blck"+id, blk, 4); + gdi.addInput(c, yp, "Sort"+id, itos(it->getDCI().getInt("SortIndex")), 4); + + if (useEco) { + gdi.addInput(c + ek1, yp, "Fee"+id, oe->formatCurrency(it->getDCI().getInt("ClassFee")), 5); + gdi.addInput(c + 2*ek1, yp, "LateFee"+id, oe->formatCurrency(it->getDCI().getInt("HighClassFee")), 5); + gdi.addInput(c + 3*ek1, yp, "RedFee"+id, oe->formatCurrency(it->getDCI().getInt("ClassFeeRed")), 5); + gdi.addInput(c + 4*ek1, yp, "RedLateFee"+id, oe->formatCurrency(it->getDCI().getInt("HighClassFeeRed")), 5); + } + + string crs = "Cors"+id; + gdi.addSelection(d, yp, crs, 150, 400); + + if (it->hasTrueMultiCourse()) { + gdi.addItem(crs, lang.tl("Flera banor"), -5); + gdi.selectItemByData(crs.c_str(), -5); + gdi.disableInput(crs.c_str()); + } + else { + gdi.addItem(crs, arg); + gdi.selectItemByData(crs.c_str(), it->getCourseId()); + } + + if (useBibs) { + gdi.addCombo(e, yp, "Bib" + id, 90, 100, 0, "", "Ange löpande numrering eller första nummer i klassen."); + gdi.addItem("Bib" + id, bibOptions); + + string bib = it->getDCI().getString("Bib"); + AutoBibType bt = it->getAutoBibType(); + if (bt != AutoBibExplicit) + gdi.selectItemByData("Bib"+ id, bt); + else + gdi.setText("Bib"+ id, bib); + + if (useTeam && it->getNumDistinctRunners() > 1) { + gdi.addSelection(et, yp, "BibTeam" + id, 80, 100, 0, "", "Ange relation mellan lagets och deltagarnas nummerlappar."); + gdi.addItem("BibTeam" + id, bibTeamOptions); + gdi.selectItemByData("BibTeam" + id, it->getBibMode()); + } + } + + gdi.addCheckbox(g, yp, "Dirc"+id, " ", 0, it->getAllowQuickEntry()); + + gdi.dropLine(-0.3); + + } +} + +void TabClass::saveClassSettingsTable(gdioutput &gdi, set &classModifiedFee, bool &modifiedBib) { + vector cls; + oe->getClasses(cls, true); + classModifiedFee.clear(); + modifiedBib = false; + + for (size_t k = 0; k < cls.size(); k++) { + pClass it = cls[k]; + + string id = itos(it->getId()); + string start = gdi.getText("Strt"+id); + int block = gdi.getTextNo("Blck"+id); + int sort = gdi.getTextNo("Sort"+id); + + if (gdi.hasField("Fee" + id)) { + int fee = oe->interpretCurrency(gdi.getText("Fee"+id)); + int latefee = oe->interpretCurrency(gdi.getText("LateFee"+id)); + int feered = oe->interpretCurrency(gdi.getText("RedFee"+id)); + int latefeered = oe->interpretCurrency(gdi.getText("RedLateFee"+id)); + + int oFee = it->getDCI().getInt("ClassFee"); + int oLateFee = it->getDCI().getInt("HighClassFee"); + int oFeeRed = it->getDCI().getInt("ClassFeeRed"); + int oLateFeeRed = it->getDCI().getInt("HighClassFeeRed"); + + if (oFee != fee || oLateFee != latefee || + oFeeRed != feered || oLateFeeRed != latefeered) + classModifiedFee.insert(it->getId()); + + it->getDI().setInt("ClassFee", fee); + it->getDI().setInt("HighClassFee", latefee); + it->getDI().setInt("ClassFeeRed", feered); + it->getDI().setInt("HighClassFeeRed", latefeered); + } + + if (gdi.hasField("Bib" + id)) { + ListBoxInfo lbi; + bool mod = false; + if (gdi.getSelectedItem("Bib" + id, lbi)) { + mod = it->getDI().setString("Bib", getBibCode(AutoBibType(lbi.data), "1")); + } + else { + const string &v = gdi.getText("Bib" + id); + mod = it->getDI().setString("Bib", v); + } + modifiedBib |= mod; + + if (gdi.hasField("BibTeam" + id)) { + ListBoxInfo lbi; + if (gdi.getSelectedItem("BibTeam" + id, lbi)) { + if (it->getBibMode() != lbi.data) + modifiedBib = true; + it->setBibMode(BibMode(lbi.data)); + } + } + } + + int courseId = 0; + ListBoxInfo lbi; + if (gdi.getSelectedItem("Cors"+id, lbi)) + courseId = lbi.data; + bool direct = gdi.isChecked("Dirc"+id); + + it->setStart(start); + it->setBlock(block); + if (courseId != -5) + it->setCourse(oe->getCourse(courseId)); + it->getDI().setInt("SortIndex", sort); + it->setAllowQuickEntry(direct); + } +} + +string TabClass::getBibCode(AutoBibType bt, const string &key) { + if (bt == AutoBibManual) + return ""; + else if (bt == AutoBibConsecutive) + return "*"; + else if (bt == AutoBibNone) + return "-"; + else + return key; +} + +void TabClass::updateStartData(gdioutput &gdi, pClass pc, int leg, bool updateDependent, bool forceWrite) { + string sdKey = "StartData"+itos(leg); + + BaseInfo &sdataBase = gdi.getBaseInfo(sdKey.c_str()); + StartTypes st = pc->getStartType(leg); + + if (st == STChange) { + if (typeid(sdataBase) != typeid(ListBoxInfo)) { + InputInfo sdII = dynamic_cast(sdataBase); + gdi.removeControl(sdKey); + gdi.addSelection(sdII.getX(), sdII.getY(), sdKey, sdII.getWidth(), 200, MultiCB); + setParallelOptions(sdKey, gdi, pc, leg); + } + else if (forceWrite) { + setParallelOptions(sdKey, gdi, pc, leg); + } + } + else { + if (typeid(sdataBase) != typeid(InputInfo)) { + ListBoxInfo sdLBI = dynamic_cast(sdataBase); + gdi.removeControl(sdKey); + string val = "-"; + gdi.addInput(sdLBI.getX(), sdLBI.getY(), sdKey, pc->getStartDataS(leg), 8, MultiCB); + } + else if (forceWrite) { + gdi.setText(sdKey, pc->getStartDataS(leg), true); + } + gdi.setInputStatus(sdKey, !pc->startdataIgnored(leg)); + } + + if (updateDependent) { + for (size_t j = 0; j < pc->getNumStages(); j++) { + if (j != leg && pc->getStartType(leg) == STChange) { + setParallelOptions("StartData"+itos(j), gdi, pc, j); + } + } + } +} + +void TabClass::setParallelOptions(const string &sdKey, gdioutput &gdi, pClass pc, int legno) { + int baseLeg = legno; + while (baseLeg > 0 && pc->isParallel(baseLeg)) + baseLeg--; + baseLeg--; + int sd = pc->getStartData(legno); + + vector< pair > opt; + int defKey = 0; + opt.push_back(make_pair(lang.tl("Ordnat"), 0)); + for (int k = 0; k <= baseLeg; k++) { + if (!pc->isOptional(k)) { + opt.push_back(make_pair(lang.tl("Str. X#" + itos(k+1)), (k-legno) - 10)); + if (sd == k-legno) + defKey = sd - 10; + } + } + if (defKey == 0) { + pc->setStartData(legno, 0); + } + + gdi.addItem(sdKey, opt); + gdi.selectItemByData(sdKey, defKey); +} + +void TabClass::updateSplitDistribution(gdioutput &gdi, int num, int tot) const { + gdi.restore("SplitDistr", false); + gdi.setRestorePoint("SplitDistr"); + + vector distr; + + for (int k = 0; k < num; k++) { + int frac = tot / (num-k); + + distr.push_back(frac); + tot -= frac; + } + sort(distr.rbegin(), distr.rend()); + + gdi.dropLine(); + gdi.fillDown(); + gdi.pushX(); + for (size_t k = 0; k < distr.size(); k++) { + int yp = gdi.getCY(); + int xp = gdi.getCX(); + gdi.addString("", yp, xp, 0, "Klass X:#" + itos(k+1)); + gdi.addInput(xp + gdi.scaleLength(100), yp, "CLS" + itos(k), itos(distr[k]), 4); + gdi.popX(); + } + + gdi.dropLine(1.5); + gdi.fillRight(); + gdi.popX(); + gdi.addButton("DoSplit", "Dela", ClassesCB).setDefault(); + gdi.addButton("Cancel", "Avbryt", ClassesCB).setCancel(); + gdi.popX(); + + gdi.refresh(); +} + +DrawMethod TabClass::getDefaultMethod(bool allowPursuit) const { + int dm = oe->getPropertyInt("DefaultDrawMethod", DMSOFT); + if (!allowPursuit) { + if (dm == DMRandom) + return DMRandom; + else + return DMSOFT; + } + else { + switch (dm) { + case DMRandom: + return DMRandom; + case DMPursuit: + return DMPursuit; + case DMReversePursuit: + return DMReversePursuit; + case DMSeeded: + return DMSeeded; + default: + return DMSOFT; + } + } +} + +vector< pair > TabClass::getPairOptions() { + vector< pair > res; + + res.push_back(make_pair(lang.tl("Ingen parstart"), 1)); + res.push_back(make_pair(lang.tl("Parvis (två och två)"), 2)); + for (int j = 3; j <= 10; j++) { + res.push_back(make_pair(lang.tl("X och Y[N by N]#" + itos(j) + "#" + itos(j)), j)); + } + return res; +} + +void TabClass::readDrawInfo(gdioutput &gdi, DrawInfo &drawInfo) { + drawInfo.maxCommonControl = gdi.getSelectedItem("MaxCommonControl").first; + + drawInfo.maxVacancy=gdi.getTextNo("VacancesMax"); + drawInfo.minVacancy=gdi.getTextNo("VacancesMin"); + drawInfo.vacancyFactor = 0.01*atof(gdi.getText("Vacances").c_str()); + drawInfo.extraFactor = 0.01*atof(gdi.getText("Extra").c_str()); + + drawInfo.baseInterval=convertAbsoluteTimeMS(gdi.getText("BaseInterval")); + drawInfo.allowNeighbourSameCourse = gdi.isChecked("AllowNeighbours"); + drawInfo.coursesTogether = gdi.isChecked("CoursesTogether"); + drawInfo.minClassInterval = convertAbsoluteTimeMS(gdi.getText("MinInterval")); + drawInfo.maxClassInterval = convertAbsoluteTimeMS(gdi.getText("MaxInterval")); + drawInfo.nFields = gdi.getTextNo("nFields"); + drawInfo.firstStart = oe->getRelativeTime(gdi.getText("FirstStart")); +} + +void TabClass::writeDrawInfo(gdioutput &gdi, const DrawInfo &drawInfo) { + gdi.selectItemByData("MaxCommonControl", drawInfo.maxCommonControl); + + gdi.setText("VacancesMax", drawInfo.maxVacancy); + gdi.setText("VacancesMin", drawInfo.minVacancy); + gdi.setText("Vacances", itos(int(drawInfo.vacancyFactor *100.0)) + "%"); + gdi.setText("Extra", itos(int(drawInfo.extraFactor * 100.0) ) + "%"); + + gdi.setText("BaseInterval", formatTime(drawInfo.baseInterval)); + + gdi.check("AllowNeighbours", drawInfo.allowNeighbourSameCourse); + gdi.check("CoursesTogether", drawInfo.coursesTogether); + gdi.setText("MinInterval", formatTime(drawInfo.minClassInterval)); + gdi.setText("MaxInterval", formatTime(drawInfo.maxClassInterval)); + gdi.setText("nFields", drawInfo.nFields); + gdi.setText("FirstStart", oe->getAbsTime(drawInfo.firstStart)); +} diff --git a/code/TabClass.h b/code/TabClass.h new file mode 100644 index 0000000..704f93d --- /dev/null +++ b/code/TabClass.h @@ -0,0 +1,161 @@ +#pragma once +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "tabbase.h" +#include "oEventDraw.h" + +class TabClass : + public TabBase +{ + struct PursuitSettings { + bool use; + int firstTime; + int maxTime; + + PursuitSettings(oClass &c) { + firstTime = 3600; + use = c.interpretClassType() != ctOpen; + maxTime = 3600; + } + }; + + map pSettings; + int pSavedDepth; + int pFirstRestart; + double pTimeScaling; + int pInterval; + + + class HandleCloseWindow : public GuiHandler { + TabClass *tabClass; + HandleCloseWindow(const HandleCloseWindow&); + HandleCloseWindow &operator=(const HandleCloseWindow&); + public: + HandleCloseWindow() : tabClass(0) {} + void handle(gdioutput &gdi, BaseInfo &info, GuiEventType type); + friend class TabClass; + }; + HandleCloseWindow handleCloseWindow; + + + bool EditChanged; + int ClassId; + int currentStage; + string storedNStage; + string storedStart; + oEvent::PredefinedTypes storedPredefined; + bool showForkingGuide; + + bool checkClassSelected(const gdioutput &gdi) const; + void save(gdioutput &gdi, bool skipReload); + void legSetup(gdioutput &gdi); + vector cInfo; + + map cInfoCache; + + DrawInfo drawInfo; + void setMultiDayClass(gdioutput &gdi, bool hasMulti, DrawMethod defaultMethod); + void drawDialog(gdioutput &gdi, DrawMethod method, const oClass &cls); + + void pursuitDialog(gdioutput &gdi); + + bool hasWarnedDirect; + bool tableMode; + DrawMethod lastDrawMethod; + int lastSeedMethod; + bool lastSeedPreventClubNb; + bool lastSeedReverse; + string lastSeedGroups; + int lastPairSize; + string lastFirstStart; + string lastInterval; + string lastNumVac; + string lastScaleFactor; + string lastMaxAfter; + + bool lastHandleBibs; + // Generate a table with class settings + void showClassSettings(gdioutput &gdi); + + void visualizeField(gdioutput &gdi); + + // Read input from the table with class settings + void readClassSettings(gdioutput &gdi); + + // Prepare for drawing by declaring starts and blocks + void prepareForDrawing(gdioutput &gdi); + + void showClassSelection(gdioutput &gdi, int &bx, int &by, GUICALLBACK classesCB) const; + + // Set simultaneous start in a class + void simultaneous(int classId, string time); + + void updateFairForking(gdioutput &gdi, pClass pc) const; + void selectCourses(gdioutput &gdi, int legNo); + bool showMulti(bool singleOnly) const; + + void defineForking(gdioutput &gdi, bool clearSettings); + vector< vector > forkingSetup; + static const char *getCourseLabel(bool pool); + + void getClassSettingsTable(gdioutput &gdi, GUICALLBACK cb); + void saveClassSettingsTable(gdioutput &gdi, set &classModifiedFee, bool &modifiedBib); + + static string getBibCode(AutoBibType bt, const string &key); + + void setParallelOptions(const string &sdKey, gdioutput &gdi, pClass pc, int legno); + + void updateStartData(gdioutput &gdi, pClass pc, int leg, bool updateDependent, bool forceWrite); + + void updateSplitDistribution(gdioutput &gdi, int numInClass, int tot) const; + + DrawMethod getDefaultMethod(bool allowPursuit) const; + + void enableLoadSettings(gdioutput &gdi); + + void readDrawInfo(gdioutput &gdi, DrawInfo &drawInfo); + void writeDrawInfo(gdioutput &gdi, const DrawInfo &drawInfo); + + static vector< pair > getPairOptions(); +public: + + void clearCompetitionData(); + + void closeWindow(gdioutput &gdi); + + void saveClassSettingsTable(gdioutput &gdi); + void multiCourse(gdioutput &gdi, int nLeg); + bool loadPage(gdioutput &gdi); + void selectClass(gdioutput &gdi, int cid); + + int classCB(gdioutput &gdi, int type, void *data); + int multiCB(gdioutput &gdi, int type, void *data); + + const char * getTypeStr() const {return "TClassTab";} + TabType getType() const {return TClassTab;} + + friend int DrawClassesCB(gdioutput *gdi, int type, void *data); + + TabClass(oEvent *oe); + ~TabClass(void); +}; diff --git a/code/TabClub.cpp b/code/TabClub.cpp new file mode 100644 index 0000000..0b3bc5e --- /dev/null +++ b/code/TabClub.cpp @@ -0,0 +1,786 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Stigbergsvägen 11, SE-75242 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" + +#include "resource.h" + +#include +#include + +#include "oEvent.h" +#include "xmlparser.h" +#include "gdioutput.h" +#include "csvparser.h" +#include "SportIdent.h" +#include +#include "meos_util.h" +#include "Table.h" +#include "gdifonts.h" +#include "meosexception.h" +#include "MeOSFeatures.h" + +#include "TabCompetition.h" +#include "TabClub.h" +#include "TabList.h" + +#include "csvparser.h" +#include "pdfwriter.h" + + +TabClub::TabClub(oEvent *poe):TabBase(poe) +{ + baseFee = 0; + lowAge = 0; + highAge = 0; + filterAge = false; + onlyNoFee = false; + useManualFee = false; +} + +TabClub::~TabClub(void) +{ +} + +void TabClub::readFeeFilter(gdioutput &gdi) { + baseFee = oe->interpretCurrency(gdi.getText("BaseFee")); + firstDate = gdi.getText("FirstDate"); + lastDate = gdi.getText("LastDate"); + filterAge = gdi.isChecked("FilterAge"); + useManualFee = gdi.isChecked("DefaultFees"); + if (filterAge) { + highAge = gdi.getTextNo("HighLimit"); + lowAge = gdi.getTextNo("LowLimit"); + } + + onlyNoFee = gdi.isChecked("OnlyNoFee"); + + ListBoxInfo lbi; + gdi.getSelectedItem("ClassType", lbi); + + if (lbi.data == -5) + typeS = "*"; + else if (lbi.data > 0) + typeS = "::" + itos(lbi.data); + else + typeS = lbi.text; + +} + +void TabClub::selectClub(gdioutput &gdi, pClub pc) +{ + if (pc) { + pc->synchronize(); + ClubId = pc->getId(); + } + else{ + ClubId = 0; + } +} + +void manualFees(gdioutput &gdi, bool on) { + gdi.setInputStatus("BaseFee", on); + gdi.setInputStatus("FirstDate", on); + gdi.setInputStatus("LastDate", on); +} + +void ageFilter(gdioutput &gdi, bool on, bool use) { + gdi.setInputStatus("HighLimit", on & use); + gdi.setInputStatus("LowLimit", on & use); + gdi.setInputStatus("FilterAge", use); +} + +int ClubsCB(gdioutput *gdi, int type, void *data) +{ + TabClub &tc = dynamic_cast(*gdi->getTabs().get(TClubTab)); + return tc.clubCB(*gdi, type, data); +} + +int TabClub::clubCB(gdioutput &gdi, int type, void *data) +{ + if (type==GUI_BUTTON) { + ButtonInfo bi=*(ButtonInfo *)data; + + if (bi.id=="Save") { + } + else if (bi.id == "EraseClubs") { + if (gdi.ask("Vill du ta bort alla klubbar från tävlingen? Alla deltagare blir klubblösa.")) { + oClub::clearClubs(*oe); + } + } + else if (bi.id=="Invoice") { + ListBoxInfo lbi; + gdi.getSelectedItem("Clubs", lbi); + pClub pc=oe->getClub(lbi.data); + if (pc) { + gdi.clearPage(true); + oe->calculateTeamResults(false); + oe->sortTeams(ClassStartTime, 0, true); + oe->calculateResults(oEvent::RTClassResult); + oe->sortRunners(ClassStartTime); + int pay, paid; + { + map ppm; + map dpm; + oClub::definedPayModes(*oe, dpm); + pc->generateInvoice(gdi, pay, paid, dpm, ppm); + } + gdi.addButton(gdi.getWidth()+20, 15, gdi.scaleLength(120), + "Cancel", "Återgå", ClubsCB, "", true, false); + gdi.addButton(gdi.getWidth()+20, 45, gdi.scaleLength(120), + "Print", "Skriv ut...", ClubsCB, + "Skriv ut fakturan", true, false); + gdi.addButton(gdi.getWidth()+20, 75, gdi.scaleLength(120), + "PDF", "PDF...", ClubsCB, + "Spara som PDF.", true, false); + gdi.refresh(); + } + } + else if (bi.id=="AllInvoice") { + gdi.clearPage(false); + gdi.addString("", boldLarge, "Skapa fakturor"); + + gdi.addSelection("Type", 300, 100, 0, "Val av export:"); + + gdi.addItem("Type", lang.tl("Skriv ut alla"), oEvent::IPTAllPrint); + gdi.addItem("Type", lang.tl("Exportera alla till HTML"), oEvent::IPTAllHTML); + gdi.addItem("Type", lang.tl("Exportera alla till PDF"), oEvent::IPTAllPDF); + +#ifdef _DEBUG + gdi.addItem("Type", lang.tl("Skriv ut dem utan e-post"), oEvent::IPTNoMailPrint); + gdi.addItem("Type", lang.tl("Skriv ut ej accepterade elektroniska"), oEvent::IPTNonAcceptedPrint); + gdi.addItem("Type", lang.tl("Exportera elektroniska fakturor"), oEvent::IPTElectronincHTML); +#endif + gdi.selectFirstItem("Type"); + gdi.fillRight(); + gdi.pushX(); + gdi.addButton("DoAllInvoice", "Skapa fakturor", ClubsCB); +#ifdef _DEBUG + gdi.addButton("ImportAnswer", "Hämta svar om elektroniska fakturor", ClubsCB); +#endif + gdi.addButton("Cancel", "Avbryt", ClubsCB); + gdi.refresh(); + } + else if (bi.id=="DoAllInvoice") { + ListBoxInfo lbi; + gdi.getSelectedItem("Type", lbi); + string path; + if (lbi.data > 10) + path = gdi.browseForFolder(path, 0); + gdi.clearPage(false); + + oe->printInvoices(gdi, oEvent::InvoicePrintType(lbi.data), path, false); + + gdi.addButton(gdi.getWidth()+20, 15, gdi.scaleLength(120), + "Cancel", "Återgå", ClubsCB, "", true, false); + + if (lbi.data>10) { // To file + gdi.addButton(gdi.getWidth()+20, 45, gdi.scaleLength(120), + "Print", "Skriv ut...", ClubsCB, + "", true, false); + gdi.addButton(gdi.getWidth()+20, 75, gdi.scaleLength(120), + "PDF", "PDF...", ClubsCB, + "Spara som PDF.", true, false); + gdi.refresh(); + } + else { + gdi.refresh(); + gdi.print(oe, 0, false, false); + } + } + else if (bi.id=="ImportAnswer") { + vector< pair > ft; + ft.push_back(make_pair("Textfiler", "*.txt")); + string file = gdi.browseForOpen(ft, "txt"); + if (!file.empty()) { + gdi.clearPage(true); + try { + importAcceptedInvoice(gdi, file); + } + catch (std::exception &ex) { + gdi.addString("", 0, ex.what()).setColor(colorRed); + } + gdi.addButton("Cancel", "OK", ClubsCB); + } + } + else if (bi.id=="UpdateAll") { + oe->updateClubsFromDB(); + gdi.getTable().update(); + gdi.refresh(); + } + else if (bi.id=="UpdateAllRunners") { + oe->updateClubsFromDB(); + oe->updateRunnersFromDB(); + gdi.getTable().update(); + gdi.refresh(); + } + else if (bi.id=="Update") { + pClub pc=oe->getClub(gdi.getSelectedItem("Clubs").first); + if (pc) { + pc->updateFromDB(); + pc->synchronize(); + gdi.getTable().update(); + gdi.refresh(); + } + } + else if (bi.id=="Summary") { + gdi.clearPage(false); + string nn; + oe->printInvoices(gdi, oEvent::IPTAllPrint, nn, true); + gdi.addButton(gdi.getWidth()+20, 15, gdi.scaleLength(120), "Cancel", + "Återgå", ClubsCB, "", true, false); + gdi.addButton(gdi.getWidth()+20, 45, gdi.scaleLength(120), "Print", + "Skriv ut...", ClubsCB, "Skriv ut fakturan", true, false); + + gdi.refresh(); + } + else if (bi.id=="Merge") { + ClubId = gdi.getSelectedItem("Clubs").first; + pClub pc = oe->getClub(ClubId); + if (pc) { + gdi.clearPage(false); + gdi.addString("", boldText, "Slå ihop klubb"); + + char bf[256]; + sprintf_s(bf, lang.tl("help:12352").c_str(), pc->getName().c_str(), pc->getId()); + + gdi.addStringUT(10, bf); + + gdi.addSelection("NewClub", 200, 300, 0, "Ny klubb:"); + oe->fillClubs(gdi, "NewClub"); + gdi.selectItemByData("NewClub", pc->getId()); + gdi.removeSelected("NewClub"); + + gdi.pushX(); + gdi.fillRight(); + gdi.addButton("DoMerge", "Slå ihop", ClubsCB); + gdi.addButton("Cancel", "Avbryt", ClubsCB); + gdi.fillDown(); + gdi.popX(); + gdi.dropLine(2); + gdi.addStringUT(boldText, lang.tl("Klubb att ta bort: ") + pc->getName()); + oe->viewClubMembers(gdi, pc->getId()); + + gdi.refresh(); + } + } + else if (bi.id=="DoMerge") { + pClub pc1 = oe->getClub(ClubId); + pClub pc2 = oe->getClub(gdi.getSelectedItem("NewClub").first); + + if (pc1==pc2) + throw std::exception("En klubb kan inte slås ihop med sig själv."); + + if (pc1 && pc2) + oe->mergeClub(pc2->getId(), pc1->getId()); + loadPage(gdi); + } + else if (bi.id == "InvoiceSettings") { + gdi.clearPage(true); + gdi.addString("", boldLarge, "Fakturainställningar"); + gdi.dropLine(); + firstInvoice = oClub::getFirstInvoiceNumber(*oe); + if (firstInvoice == 0) + firstInvoice = oe->getPropertyInt("FirstInvoice", 1000); + + gdi.addInput("FirstInvoice", itos(firstInvoice), 5, 0, "Första fakturanummer:"); + + gdi.dropLine(); + gdi.addString("", boldText, "Organisatör"); + + vector fields; + gdi.pushY(); + fields.push_back("Organizer"); + fields.push_back("CareOf"); + fields.push_back("Street"); + fields.push_back("Address"); + fields.push_back("EMail"); + oe->getDI().buildDataFields(gdi, fields); + + gdi.dropLine(); + gdi.addString("", boldText, "Betalningsinformation"); + fields.clear(); + fields.push_back("Account"); + fields.push_back("PaymentDue"); + oe->getDI().buildDataFields(gdi, fields); + + gdi.pushX(); + gdi.fillRight(); + gdi.addString("", normalText, "Avgifter och valuta ställer du in under"); + gdi.addString("CmpSettings", normalText, "Tävlingsinställningar.", ClubsCB); + gdi.fillDown(); + gdi.dropLine(2); + gdi.popX(); + + gdi.addString("", boldText, "Formatering"); + + gdi.fillRight(); + gdi.addString("", 0, "Koordinater (mm) för adressfält:"); + string xc = oe->getPropertyString("addressxpos", "125"); + string yc = oe->getPropertyString("addressypos", "50"); + gdi.addStringUT(0, "x:"); + gdi.addInput("XC", xc + " [mm]", 6); + gdi.addStringUT(0, "y:"); + gdi.addInput("YC", yc + " [mm]", 6); + + gdi.fillDown(); + gdi.popX(); + + TabList::customTextLines(*oe, "IVExtra", gdi); + + gdi.dropLine(1); + + gdi.fillRight(); + gdi.addButton("SaveSettings", "Spara", ClubsCB); + gdi.addButton("Cancel", "Avbryt", ClubsCB); + gdi.dropLine(2); + gdi.setOnClearCb(ClubsCB); + oe->getDI().fillDataFields(gdi); + + } + else if (bi.id == "SaveSettings") { + oe->getDI().saveDataFields(gdi); + + TabList::saveExtraLines(*oe, "IVExtra", gdi); + + int fn = gdi.getTextNo("FirstInvoice"); + + if (fn != firstInvoice && oClub::getFirstInvoiceNumber(*oe) > 0) { + if (gdi.ask("Tilldela nya fakturanummer till alla klubbar?")) { + oe->setProperty("FirstInvoice", fn); + oClub::assignInvoiceNumber(*oe, true); + } + } + else + oe->setProperty("FirstInvoice", fn); + + int xc = gdi.getTextNo("XC"); + int yc = gdi.getTextNo("YC"); + + if (xc<=0 || yc<=0) + throw meosException("Invalid coordinate (x,y)"); + + oe->setProperty("addressxpos", xc); + oe->setProperty("addressypos", yc); + loadPage(gdi); + } + else if (bi.id == "Fees") { + gdi.clearPage(true); + + gdi.addString("", boldLarge, "Tilldela avgifter"); + + gdi.dropLine(); + gdi.addString("", 10, "help:assignfee"); + gdi.dropLine(); + gdi.pushX(); + + gdi.addSelection("ClassType", 150, 300, 0, "Klass / klasstyp:"); + vector< pair > types; + vector< pair > classes; + + oe->fillClassTypes(types); + oe->fillClasses(classes, oEvent::extraNone, oEvent::filterNone); + types.insert(types.end(), classes.begin(), classes.end()); + gdi.addItem("ClassType", types); + gdi.addItem("ClassType", lang.tl("Alla typer"), -5); + + gdi.selectItemByData("ClassType", -5); + + gdi.fillRight(); + gdi.dropLine(2); + gdi.addCheckbox("DefaultFees", "Manuella avgifter:", ClubsCB, useManualFee); + + gdi.dropLine(-1); + + int px = gdi.getCX(); + gdi.addInput("BaseFee", oe->formatCurrency(baseFee), 8, 0, "Avgift:"); + gdi.addInput("FirstDate", firstDate, 10, 0, "Undre datumgräns:", "ÅÅÅÅ-MM-DD"); + gdi.addInput("LastDate", lastDate, 10, 0, "Övre datumgräns:", "ÅÅÅÅ-MM-DD"); + + manualFees(gdi, useManualFee); + + gdi.setCX(px); + gdi.dropLine(4); + gdi.fillRight(); + gdi.addCheckbox("FilterAge", "Åldersfilter:", ClubsCB, filterAge); + + gdi.dropLine(-1); + gdi.addInput("LowLimit", lowAge > 0 ? itos(lowAge) : "", 5, 0, "Undre gräns (år):"); + gdi.addInput("HighLimit", highAge > 0 ? itos(highAge) : "", 5, 0, "Övre gräns (år):"); + ageFilter(gdi, filterAge, useManualFee); + + gdi.popX(); + gdi.fillDown(); + gdi.dropLine(3); + + gdi.addCheckbox("OnlyNoFee", "Tilldela endast avgift till deltagare utan avgift", ClubsCB, onlyNoFee); + + gdi.pushX(); + gdi.fillRight(); + gdi.addButton("ShowFiltered", "Visa valda deltagare", ClubsCB); + + gdi.addButton("DoFees", "Tilldela avgifter", ClubsCB); + gdi.addButton("ClearFees", "Nollställ avgifter", ClubsCB); + + gdi.addButton("Cancel", "Återgå", ClubsCB); + gdi.popX(); + gdi.fillDown(); + gdi.dropLine(2); + gdi.refresh(); + } + else if (bi.id == "FilterAge") { + ageFilter(gdi, gdi.isChecked(bi.id), gdi.isChecked("DefaultFees")); + } + else if (bi.id == "DefaultFees") { + manualFees(gdi, gdi.isChecked(bi.id)); + ageFilter(gdi, gdi.isChecked("FilterAge"), gdi.isChecked(bi.id)); + } + else if (bi.id == "DoFees" || bi.id == "ClearFees" || + bi.id == "ShowFiltered" || bi.id == "ResetFees") { + + readFeeFilter(gdi); + int op; + + if (bi.id == "DoFees") { + if (useManualFee) + op = 0; + else + op = 2; + } + else if (bi.id == "ClearFees") + op = 1; + else if (bi.id == "ResetFees") + op = 2; + else + op = 3; + + gdi.restore("FeeList", false); + gdi.setRestorePoint("FeeList"); + gdi.fillDown(); + + vector filtered; + + oe->sortRunners(ClassStartTimeClub); + string fdate, ldate; + int lage = 0, hage = 0; + + if (useManualFee) { + fdate = firstDate; + ldate = lastDate; + + if (filterAge) { + lage = lowAge; + hage = highAge; + } + } + + oe->selectRunners(typeS, lage, hage, fdate, ldate, !onlyNoFee, filtered); + + gdi.dropLine(2); + int modified = 0; + int count = 0; + for (size_t k = 0; kisVacant()) + continue; + count++; + + oDataInterface di = filtered[k]->getDI(); + int fee = 0; + + if (op == 0 || op == 1) { + if (op == 0) + fee = baseFee; + + if (di.getInt("Fee") != fee) { + di.setInt("Fee", fee); + modified++; + filtered[k]->synchronize(true); + } + } + else if (op == 2) { + filtered[k]->addClassDefaultFee(true); + if (filtered[k]->isChanged()) + modified++; + filtered[k]->synchronize(true); + fee = di.getInt("Fee"); + } + else + fee = di.getInt("Fee"); + + string info = filtered[k]->getClass() + ", " + filtered[k]->getCompleteIdentification(); + + gdi.addStringUT(0, info + " (" + oe->formatCurrency(fee) + ")"); + if (count % 5 == 0) + gdi.dropLine(); + } + + gdi.dropLine(); + + if (count == 0) + gdi.addString("", 1, "Ingen deltagare matchar sökkriteriet").setColor(colorRed); + else if (op == 0 || op == 2) + gdi.addString("", 1, "Ändrade avgift för X deltagare#" + itos(modified)).setColor(colorGreen); + else if (op == 1) + gdi.addString("", 1, "Nollställde avgift för X deltagare#" + itos(modified)).setColor(colorGreen); + + gdi.refresh(); + } + else if (bi.id=="Cancel") { + loadPage(gdi); + } + else if (bi.id=="Print") { + gdi.print(oe); + } + else if (bi.id=="PDF") { + vector< pair > ext; + ext.push_back(make_pair("Portable Document Format (PDF)", "*.pdf")); + + int index; + string file=gdi.browseForSave(ext, "pdf", index); + + if (!file.empty()) { + pdfwriter pdf; + pdf.generatePDF(gdi, gdi.toWide(file), lang.tl("Faktura"), oe->getDCI().getString("Organizer"), gdi.getTL()); + gdi.openDoc(file.c_str()); + } + } + + } + else if (type==GUI_LISTBOX){ + ListBoxInfo bi=*(ListBoxInfo *)data; + + if (bi.id=="Clubs"){ + pClub pc=oe->getClub(bi.data); + if (!pc) + throw std::exception("Internal error"); + + selectClub(gdi, pc); + } + } + else if (type == GUI_LINK) { + TextInfo *ti = static_cast(data); + if (ti->id == "CmpSettings") { + if (gdi.hasField("SaveSettings")) + gdi.sendCtrlMessage("SaveSettings"); + TabCompetition &tc = dynamic_cast(*gdi.getTabs().get(TCmpTab)); + tc.loadPage(gdi); + gdi.selectTab(tc.getTabId()); + gdi.sendCtrlMessage("Settings"); + return 0; + } + } + else if (type == GUI_CLEAR) { + if (gdi.isInputChanged("")) { + if (gdi.hasField("SaveSettings")) { + gdi.sendCtrlMessage("SaveSettings"); + } + } + return 1; + } + + return 0; +} + + +bool TabClub::loadPage(gdioutput &gdi) +{ + oe->checkDB(); + gdi.selectTab(tabId); + + if (baseFee == 0) { + if (oe->getDCI().getInt("OrdinaryEntry") > 0) + lastDate = oe->getDCI().getDate("OrdinaryEntry"); + baseFee = oe->getDCI().getInt("EntryFee"); + + lowAge = 0; + highAge = oe->getDCI().getInt("YouthAge"); + } + + gdi.clearPage(false); + gdi.fillDown(); + gdi.addString("", boldLarge, "Klubbar"); + gdi.dropLine(0.5); + gdi.pushX(); + gdi.fillRight(); + gdi.addSelection("Clubs", 200, 300, ClubsCB); + oe->fillClubs(gdi, "Clubs"); + gdi.selectItemByData("Clubs", ClubId); + gdi.addButton("Merge", "Ta bort / slå ihop...", ClubsCB); + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Economy)) + gdi.addButton("Invoice", "Faktura", ClubsCB); + if (oe->useRunnerDb()) + gdi.addButton("Update", "Uppdatera", ClubsCB, "Uppdatera klubbens uppgifter med data från löpardatabasen/distriktsregistret"); + + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Economy)) { + gdi.popX(); + gdi.dropLine(3); + + gdi.addString("", boldText, "Ekonomi"); + gdi.popX(); + gdi.dropLine(1.5); + gdi.addButton("Fees", "Avgifter...", ClubsCB); + gdi.addButton("InvoiceSettings", "Fakturainställningar...", ClubsCB); + + gdi.addButton("AllInvoice", "Skapa fakturor...", ClubsCB); + gdi.addButton("Summary", "Sammanställning", ClubsCB); + } + + gdi.popX(); + gdi.dropLine(3); + + gdi.addString("", boldText, "Hantera klubbar"); + + gdi.popX(); + gdi.dropLine(1.5); + if (oe->useRunnerDb()) { + gdi.addButton("UpdateAll", "Uppdatera alla klubbar", ClubsCB, "Uppdatera klubbarnas uppgifter med data från löpardatabasen/distriktsregistret"); + gdi.addButton("UpdateAllRunners", "Uppdatera klubbar && löpare", ClubsCB, "Uppdatera klubbarnas och löparnas uppgifter med data från löpardatabasen/distriktsregistret"); + } + gdi.addButton("EraseClubs", "Radera alla klubbar", ClubsCB, "Radera alla klubbar och ta bort klubbtillhörighet"); + + gdi.popX(); + gdi.fillDown(); + gdi.dropLine(2); + gdi.addString("", 10, "help:29758"); + gdi.dropLine(1); + Table *tbl=oe->getClubsTB(); + gdi.addTable(tbl, gdi.getCX(), gdi.getCY()); + gdi.refresh(); + return true; +} + +void TabClub::importAcceptedInvoice(gdioutput &gdi, const string &file) { + + gdi.addString("", boldLarge, "Hämta svar om elektroniska fakturor"); + + gdi.fillDown(); + gdi.dropLine(2); + csvparser csv; + list< vector > data; + csv.parse(file, data); + list< vector >::iterator it; + map > hasAccepted; + for (it = data.begin(); it != data.end(); ++it) { + if (it->size() == 3) { + int id = atoi((*it)[0].c_str()); + bool accepted = trim((*it)[1]) == "OK"; + pClub pc = oe->getClub(id); + if (pc) { + hasAccepted[id].first = accepted; + if ( hasAccepted[id].second.empty()) + hasAccepted[id].second = (*it)[2]; + else + hasAccepted[id].second += ", " + (*it)[2]; + } + else + gdi.addString("", 0, "Okänd klubb med id X#" + itos(id)).setColor(colorRed); + } + else + throw meosException("Bad file format."); + } + + gdi.pushX(); + gdi.fillNone(); + + int margin = gdi.getCX() + gdi.scaleLength(30); + vector clubs; + oe->getClubs(clubs, true); + bool anyAccepted = false; + int count = 0; + for (size_t k = 0; k < clubs.size(); k++) { + map >::iterator res = hasAccepted.find(clubs[k]->getId()); + + if (res != hasAccepted.end() && res->second.first) { + if (!anyAccepted) { + gdi.dropLine(); + gdi.addString("", 1, "Accepterade elektroniska fakturor"); + gdi.dropLine(); + gdi.popX(); + anyAccepted = true; + } + clubs[k]->getDI().setString("Invoice", "A"); + gdi.addStringUT(0, itos(++count) + "."); + gdi.setCX(margin); + gdi.addStringUT(0, clubs[k]->getName() + ", " + res->second.second); + gdi.dropLine(); + gdi.popX(); + } + } + + bool anyNotAccepted = false; + count = 0; + for (size_t k = 0; k < clubs.size(); k++) { + map >::iterator res = hasAccepted.find(clubs[k]->getId()); + + if (res != hasAccepted.end() && !res->second.first) { + if (!anyNotAccepted) { + gdi.dropLine(); + gdi.addString("", 1, "Ej accepterade elektroniska fakturor"); + gdi.dropLine(); + gdi.popX(); + anyNotAccepted = true; + } + clubs[k]->getDI().setString("Invoice", "P"); + gdi.addStringUT(0, itos(++count) + "."); + gdi.setCX(margin); + gdi.addStringUT(0, clubs[k]->getName() + ", " + res->second.second); + gdi.dropLine(); + gdi.popX(); + + } + } + + bool anyNoAnswer = false; + count = 0; + for (size_t k = 0; k < clubs.size(); k++) { + string email = clubs[k]->getDCI().getString("EMail"); + bool hasMail = !email.empty() && email.find_first_of('@') != email.npos; + + map >::iterator res = hasAccepted.find(clubs[k]->getId()); + + if (res == hasAccepted.end() ) { + if (!anyNoAnswer) { + gdi.dropLine(); + gdi.addString("", 1, "Klubbar som inte svarat"); + gdi.dropLine(); + gdi.popX(); + + anyNoAnswer = true; + } + gdi.addStringUT(0, itos(++count) + "."); + gdi.setCX(margin); + + if (hasMail) + gdi.addStringUT(0, clubs[k]->getName()); + else + gdi.addString("", 0, "X (Saknar e-post)#" + clubs[k]->getName()); + + gdi.dropLine(); + gdi.popX(); + } + } + gdi.fillDown(); + gdi.dropLine(); +} + +void TabClub::clearCompetitionData() { +} diff --git a/code/TabClub.h b/code/TabClub.h new file mode 100644 index 0000000..f18e596 --- /dev/null +++ b/code/TabClub.h @@ -0,0 +1,63 @@ +#pragma once +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "tabbase.h" + +class TabClub : + public TabBase +{ + int clubCB(gdioutput &gdi, int type, void *data); + + string firstDate; + string lastDate; + bool filterAge; + bool onlyNoFee; + bool useManualFee; + int highAge; + int lowAge; + int baseFee; + string typeS; + + int firstInvoice; + + int ClubId; + + void readFeeFilter(gdioutput &gdi); + +protected: + void clearCompetitionData(); + +public: + void selectClub(gdioutput &gdi, pClub pc); + + void importAcceptedInvoice(gdioutput &gdi, const string &file); + + const char * getTypeStr() const {return "TClubTab";} + TabType getType() const {return TClubTab;} + + bool loadPage(gdioutput &gdi); + TabClub(oEvent *oe); + ~TabClub(void); + + friend int ClubsCB(gdioutput *gdi, int type, void *data); +}; diff --git a/code/TabCompetition.cpp b/code/TabCompetition.cpp new file mode 100644 index 0000000..3dc199d --- /dev/null +++ b/code/TabCompetition.cpp @@ -0,0 +1,3853 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" + +#include "resource.h" + +#include +#include + +#include "oEvent.h" +#include "xmlparser.h" +#include "gdioutput.h" +#include "csvparser.h" +#include "SportIdent.h" +#include "meos_util.h" +#include "TabCompetition.h" +#include "TabCourse.h" +#include "oFreeImport.h" +#include "localizer.h" +#include "oListInfo.h" +#include "download.h" +#include "progress.h" +#include "classconfiginfo.h" +#include "RunnerDB.h" +#include "gdifonts.h" +#include "meosException.h" +#include "meosdb/sqltypes.h" +#include "socket.h" +#include "iof30interface.h" +#include "MeOSFeatures.h" +#include "prefseditor.h" +#include "recorder.h" +#include "testmeos.h" +#include "importformats.h" + +#include +#include +#include +#include +#include + +void Setup(bool overwrite, bool overWriteall); +void exportSetup(); +void resetSaveTimer(); +extern bool enableTests; + +int ListsCB(gdioutput *gdi, int type, void *data); + +TabCompetition::TabCompetition(oEvent *poe):TabBase(poe) +{ + eventorBase = poe->getPropertyString("EventorBase", "https://eventor.orientering.se/api/"); + iofExportVersion = "&version=3.0"; + defaultServer="localhost"; + defaultName="meos"; + organizorId = 0; + lastSelectedClass = -1; + allTransfer.insert(-1); + lastChangeClassType = oEvent::ChangeClassVacant; +} + +TabCompetition::~TabCompetition(void) +{ +} + +extern SportIdent *gSI; +extern HINSTANCE hInst; +extern HWND hWndMain; + +bool TabCompetition::save(gdioutput &gdi, bool write) +{ + string name=gdi.getText("Name"); + + if (name.empty()) { + gdi.alert("Tävlingen måste ha ett namn"); + return 0; + } + + string zt = gdi.getText("ZeroTime"); + bool longTimes = gdi.isChecked("LongTimes"); + string date = gdi.getText("Date"); + + if (longTimes) + zt = "00:00:00"; + + int newZT = convertAbsoluteTimeHMS(zt, -1); + if (newZT < 0) + throw meosException("Felaktigt tidsformat 'X' (Använd TT:MM:SS)#" + zt); + + int oldZT = convertAbsoluteTimeHMS(oe->getZeroTime(), -1); + bool oldLT = oe->useLongTimes(); + string oldDate = oe->getDate(); + + if ((newZT != oldZT || + longTimes != oldLT || + (longTimes && date != oldDate)) && oe->classHasResults(0)) { + if (!gdi.ask("warn:changedtimezero")) { + gdi.setText("ZeroTime", oe->getZeroTime()); + gdi.check("LongTimes", oe->useLongTimes()); + gdi.setText("Date", oe->getDate()); + return 0; + } + } + oe->setDate(date); + oe->useLongTimes(longTimes); + oe->setName(gdi.getText("Name")); + oe->setAnnotation(gdi.getText("Annotation")); + oe->setZeroTime(zt); + + oe->synchronize(); + if (gSI) gSI->SetZeroTime(oe->getZeroTimeNum()); + + gdi.setWindowTitle(oe->getTitleName()); + gdi.setText("Date", oe->getDate()); + gdi.setText("ZeroTime", oe->getZeroTime()); + + if (write) { + gdi.setWaitCursor(true); + resetSaveTimer(); + return oe->save(); + } + else + return true; +} + +bool TabCompetition::importFile(HWND hWnd, gdioutput &gdi) +{ + vector< pair > ext; + ext.push_back(make_pair("xml-data", "*.xml;*.bu?")); + string fileName = gdi.browseForOpen(ext, "xml"); + if (fileName.empty()) + return false; + + gdi.setWaitCursor(true); + if (oe->open(fileName, true)) { + if (gSI) gSI->SetZeroTime(oe->getZeroTimeNum()); + gdi.setWindowTitle(oe->getTitleName()); + resetSaveTimer(); + return true; + } + + return false; +} + +bool TabCompetition::exportFileAs(HWND hWnd, gdioutput &gdi) +{ + int ix = 0; + vector< pair > ext; + ext.push_back(make_pair("xml-data", "*.xml")); + string fileName = gdi.browseForSave(ext, "xml", ix); + if (fileName.empty()) + return false; + + gdi.setWaitCursor(true); + if (!oe->save(fileName.c_str())) { + gdi.alert("Fel: Filen " + fileName+ " kunde inte skrivas."); + return false; + } + + return true; +} + +int CompetitionCB(gdioutput *gdi, int type, void *data) +{ + TabCompetition &tc = dynamic_cast(*gdi->getTabs().get(TCmpTab)); + + return tc.competitionCB(*gdi, type, data); +} + + +int restoreCB(gdioutput *gdi, int type, void *data) +{ + TabCompetition &tc = dynamic_cast(*gdi->getTabs().get(TCmpTab)); + + return tc.restoreCB(*gdi, type, data); +} + +void TabCompetition::loadConnectionPage(gdioutput &gdi) +{ + gdi.clearPage(false); + showConnectionPage=true; + gdi.addString("", boldLarge, "Anslutningar"); + + if (oe->getServerName().empty()) { + gdi.addString("", 10, "help:52726"); + gdi.pushX(); + gdi.dropLine(); + defaultServer = oe->getPropertyString("Server", defaultServer); + defaultName = oe->getPropertyString("UserName", defaultName); + defaultPort = oe->getPropertyString("Port", defaultPort); + string client = oe->getPropertyString("Client", oe->getClientName()); + + gdi.fillRight(); + gdi.addInput("Server", defaultServer, 16, 0, "MySQL Server / IP-adress:", "IP-adress eller namn på en MySQL-server"); + gdi.addInput("UserName", defaultName, 7, 0, "Användarnamn:"); + gdi.addInput("PassWord", defaultPwd, 9, 0, "Lösenord:").setPassword(true); + gdi.addInput("Port", defaultPort, 4, 0, "Port:"); + + if (defaultServer.empty()) + gdi.setInputFocus("Server"); + else if (defaultName.empty()) + gdi.setInputFocus("UserName"); + else + gdi.setInputFocus("PassWord"); + + gdi.fillDown(); + gdi.popX(); + gdi.dropLine(2.5); + gdi.addInput("ClientName", client, 16, 0, "Klientnamn:"); + gdi.dropLine(); + gdi.fillRight(); + gdi.addButton("ConnectToMySQL", "Anslut", CompetitionCB).setDefault(); + } + else { + gdi.addString("", 10, "help:50431"); + gdi.dropLine(1); + gdi.pushX(); + gdi.fillRight(); + gdi.addString("", 1, "Ansluten till:"); + gdi.addStringUT(1, oe->getServerName()).setColor(colorGreen); + gdi.popX(); + gdi.dropLine(2); + gdi.addInput("ClientName", oe->getClientName(), 16, 0, "Klientnamn:"); + gdi.dropLine(); + gdi.addButton("SaveClient", "Ändra", CompetitionCB); + gdi.dropLine(2.5); + + gdi.popX(); + gdi.addString("", 1, "Öppnad tävling:"); + + if (oe->empty()) + gdi.addString("", 1, "Ingen").setColor(colorRed); + else { + gdi.addStringUT(1, oe->getName()).setColor(colorGreen); + + if (oe->isClient()) + gdi.addString("", 1, "(på server)"); + else + gdi.addString("", 1, "(lokalt)"); + + } + gdi.dropLine(2); + gdi.popX(); + gdi.fillRight(); + + if (!oe->isClient()) + gdi.addButton("UploadCmp", "Ladda upp öppnad tävling på server",CompetitionCB); + + if (oe->empty()) { + gdi.disableInput("UploadCmp"); + } + else { + gdi.addButton("CloseCmp", "Stäng tävlingen", CompetitionCB); + gdi.addButton("Delete", "Radera tävlingen", CompetitionCB); + } + gdi.dropLine(2); + gdi.popX(); + if (oe->empty()) { + char bf[260]; + getUserFile(bf, ""); + oe->enumerateCompetitions(bf, "*.meos"); + + gdi.dropLine(1); + gdi.fillRight(); + gdi.addListBox("ServerCmp", 320, 210, CompetitionCB, "Server"); + oe->fillCompetitions(gdi, "ServerCmp", 2); + gdi.selectItemByData("ServerCmp", oe->getPropertyInt("LastCompetition", 0)); + + gdi.fillDown(); + gdi.addListBox("LocalCmp", 320, 210, CompetitionCB, "Lokalt"); + gdi.popX(); + oe->fillCompetitions(gdi, "LocalCmp", 1); + gdi.selectItemByData("LocalCmp", oe->getPropertyInt("LastCompetition", 0)); + + gdi.addCheckbox("UseDirectSocket", "Skicka och ta emot snabb förhandsinformation om stämplingar och resultat", + 0, oe->getPropertyInt("UseDirectSocket", true) != 0); + + gdi.dropLine(); + gdi.fillRight(); + gdi.addButton("OpenCmp", "Öppna tävling", CompetitionCB).setDefault(); + gdi.addButton("Repair", "Reparera vald tävling", CompetitionCB); + + gdi.setInputStatus("Repair", gdi.getSelectedItem("ServerCmp").second, true); + } + else if (oe->isClient()) { + gdi.fillDown(); + gdi.popX(); + oe->listConnectedClients(gdi); + gdi.registerEvent("Connections", CompetitionCB); + gdi.fillRight(); + } + + gdi.addButton("DisconnectMySQL", "Koppla ner databas", CompetitionCB); + } + gdi.addButton("Cancel", "Till huvudsidan", CompetitionCB).setCancel(); + gdi.fillDown(); + gdi.refresh(); +} + +bool TabCompetition::checkEventor(gdioutput &gdi, ButtonInfo &bi) { + eventorOrigin = bi.id; + + if (organizorId == 0) { + int clubId = getOrganizer(true); + if (clubId == 0) { + bi.id = "EventorAPI"; + competitionCB(gdi, GUI_BUTTON, &bi); + return true; + } + else if (clubId == -1) + throw std::exception("Kunde inte ansluta till Eventor"); + + organizorId = clubId; + } + return false; +} + +int eventorServer(gdioutput *gdi, int type, void *data) { + TabCompetition &tc = dynamic_cast(*gdi->getTabs().get(TCmpTab)); + if (type == GUI_COMBO) { + const ListBoxInfo &lbi = *((ListBoxInfo *)data); + tc.setEventorServer(lbi.text); + } + else if (type == GUI_BUTTON) { + const ButtonInfo &bi = *((ButtonInfo *)data); + + if (bi.id == "EventorUTC") + tc.setEventorUTC(gdi->isChecked(bi.id)); + } + return 0; +} + +void TabCompetition::setEventorServer(const string &server) { + eventorBase = server; + oe->setProperty("EventorBase", server); +} + +void TabCompetition::setEventorUTC(bool useUTC) { + oe->setProperty("UseEventorUTC", useUTC); +} + +bool TabCompetition::useEventorUTC() const { + bool eventorUTC = oe->getPropertyInt("UseEventorUTC", 0) != 0; + return eventorUTC; +} + +enum StartMethod {SMCommon = 1, SMDrawn, SMFree, SMCustom}; + +int TabCompetition::competitionCB(gdioutput &gdi, int type, void *data) +{ + if (type == GUI_LINK) { + TextInfo ti = *(TextInfo *)data; + if (ti.id == "link") { + string url = ti.text; + ShellExecute(NULL, "open", url.c_str(), NULL, NULL, SW_SHOWNORMAL); + } + } + else if (type==GUI_BUTTON) { + ButtonInfo bi=*(ButtonInfo *)data; + + if (bi.id == "CopyLink") { + string url = gdi.getText("link"); + + if (OpenClipboard(gdi.getHWND())) { + EmptyClipboard(); + HGLOBAL hClipboardData; + hClipboardData = GlobalAlloc(GMEM_DDESHARE, + url.length()+1); + + char * pchData; + pchData = (char*)GlobalLock(hClipboardData); + + strcpy_s(pchData, url.length()+1, LPCSTR(url.c_str())); + + GlobalUnlock(hClipboardData); + + SetClipboardData(CF_TEXT,hClipboardData); + CloseClipboard(); + } + } + else if (bi.id == "LongTimes") { + if (gdi.isChecked(bi.id)) { + gdi.setTextTranslate("ZeroTimeHelp", "help:long_times", true); + gdi.disableInput("ZeroTime"); + } + else { + gdi.setTextTranslate("ZeroTimeHelp", "help:zero_time", true); + gdi.enableInput("ZeroTime"); + } + } + else if (bi.id=="Print") { + gdi.print(oe); + } + else if (bi.id=="Setup") { + gdi.clearPage(false); + + gdi.addString("", boldLarge, "Inställningar MeOS"); + gdi.dropLine(); + gdi.addString("", 10, "help:29191"); + gdi.dropLine(); + char FileNamePath[260]; + getUserFile(FileNamePath, ""); + gdi.addStringUT(0, lang.tl("MeOS lokala datakatalog är") + ": " + FileNamePath); + gdi.dropLine(); + + gdi.addCombo("EventorServer", 320, 100, eventorServer, "Eventor server:"); + + vector eventorCand; + eventorCand.push_back("https://eventor.orientering.se/api/"); + + gdi.addItem("EventorServer", eventorBase); + for (size_t k = 0; k < eventorCand.size(); k++) { + if (eventorBase != eventorCand[k]) + gdi.addItem("EventorServer", eventorCand[k]); + } + + gdi.selectFirstItem("EventorServer"); + + bool eventorUTC = oe->getPropertyInt("UseEventorUTC", 0) != 0; + gdi.addCheckbox("EventorUTC", "Eventors tider i UTC (koordinerad universell tid)", eventorServer, eventorUTC); + + char bf[260]; + GetCurrentDirectory(260, bf); + gdi.fillRight(); + gdi.pushX(); + gdi.dropLine(); + gdi.addInput("Source", bf, 40, 0, "Källkatalog:"); + gdi.dropLine(0.8); + gdi.addButton("SourceBrowse", "Bläddra...", CompetitionCB); + gdi.dropLine(4); + gdi.popX(); + gdi.fillRight(); + gdi.addButton("DoSetup", "Installera", CompetitionCB); + gdi.addButton("ExportSetup", "Exportera", CompetitionCB); + gdi.addButton("Cancel", "Stäng", CompetitionCB); + gdi.dropLine(2); + gdi.refresh(); + } + else if (bi.id=="SourceBrowse") { + string s = gdi.browseForFolder(gdi.getText("Source"), 0); + if (!s.empty()) + gdi.setText("Source", s); + } + else if (bi.id=="DoSetup") { + string source = gdi.getText("Source"); + if (SetCurrentDirectory(source.c_str())) { + Setup(true, true); + gdi.alert("Tillgängliga filer installerades. Starta om MeOS."); + exit(0); + } + else + throw std::exception("Operationen misslyckades"); + } + else if (bi.id == "RunnerDatabase") { + loadRunnerDB(gdi, 0, false); + return 0; + } + else if (bi.id=="ExportSetup") { + + gdi.clearPage(false); + gdi.addString("", boldLarge, "Exportera inställningar och löpardatabaser"); + gdi.dropLine(); + gdi.addString("", 10, "help:15491"); + gdi.dropLine(); + char FileNamePath[260]; + getUserFile(FileNamePath, ""); + gdi.addStringUT(0, lang.tl("MeOS lokala datakatalog är: ") + FileNamePath); + + gdi.dropLine(); + + char bf[260]; + GetCurrentDirectory(260, bf); + gdi.fillRight(); + gdi.pushX(); + gdi.dropLine(); + gdi.addInput("Source", bf, 40, 0, "Destinationskatalog:"); + gdi.dropLine(0.8); + gdi.addButton("SourceBrowse", "Bläddra...", CompetitionCB); + gdi.dropLine(4); + gdi.popX(); + gdi.fillRight(); + gdi.addButton("DoExportSetup", "Exportera", CompetitionCB).setDefault(); + gdi.addButton("CancelRunnerDatabase", "Avbryt", CompetitionCB).setCancel(); + gdi.dropLine(2); + gdi.refresh(); + } + else if (bi.id=="DoExportSetup") { + string source = gdi.getText("Source"); + if (SetCurrentDirectory(source.c_str())) { + exportSetup(); + gdi.alert("Inställningarna har exporterats."); + } + } + else if (bi.id == "SaveTest") { + vector< pair > cpp; + cpp.push_back(make_pair("Source", "*.cpp")); + int ix = 0; + string fn = gdi.browseForSave(cpp, ".cpp", ix); + if (!fn.empty()) + gdi.getRecorder().saveRecordings(fn); + } + else if (bi.id == "RunTest") { + TestMeOS tm(oe, "base"); + tm.runAll(); + oe->clear(); + gdi.selectTab(tabId); + tm.publish(gdi); + gdi.addButton("Cancel", "Återgå", CompetitionCB); + gdi.refresh(); + } + else if (bi.id == "RunSpecificTest") { + int test = gdi.getSelectedItem("Tests").first; + TestMeOS tm(oe, "base"); + tm.runSpecific(test); + } + else if (bi.id == "LocalSettings") { + gdi.clearPage(false); + gdi.addString("", boldLarge, "Ändra MeOS lokala systemegenskaper"); + gdi.dropLine(0.5); + gdi.addString("", 0, "Vissa inställningar kräver omstart av MeOS för att ha effekt."); + gdi.dropLine(0.5); + gdi.addButton("Cancel", "Återgå", CompetitionCB); + gdi.dropLine(); + + if (prefsEditor.empty()) + prefsEditor.push_back(PrefsEditor(oe)); + + prefsEditor.back().showPrefs(gdi); + gdi.refresh(); + } + else if (bi.id=="Test") { + vector< pair > cpp; + cpp.push_back(make_pair("Source", "*.cpp")); + int ix = 0; + string fn = gdi.browseForSave(cpp, ".cpp", ix); + if (!fn.empty()) + gdi.getRecorder().saveRecordings(fn); + else { + TestMeOS tm(oe, "base"); + tm.runAll(); + tm.publish(gdi); + } + /*gdi.clearPage(false); + gdi.addString("", boldLarge, "Ändra MeOS lokala systemegenskaper"); + gdi.dropLine(0.5); + gdi.addString("", 0, "Vissa inställningar kräver omstart av MeOS för att ha effekt."); + gdi.dropLine(0.5); + gdi.addButton("Cancel", "Återgå", CompetitionCB); + gdi.dropLine(); + + if (prefsEditor.empty()) + prefsEditor.push_back(PrefsEditor(oe)); + + prefsEditor.back().showPrefs(gdi); + gdi.refresh();*/ + } + else if (bi.id=="Report") { + gdi.clearPage(true); + oe->generateCompetitionReport(gdi); + + gdi.addButton(gdi.getWidth()+20, 15, gdi.scaleLength(120), "Cancel", + "Återgå", CompetitionCB, "", true, false); + gdi.addButton(gdi.getWidth()+20, 18+gdi.getButtonHeight(), gdi.scaleLength(120), "Print", + "Skriv ut...", CompetitionCB, "Skriv ut rapporten", true, false); + gdi.refresh(); + + //gdi.addButton("Cancel", "Avbryt", CompetitionCB); + } + else if (bi.id=="Features") { + save(gdi, false); + meosFeatures(gdi, false); + } + else if (bi.id == "SaveFeaures") { + saveMeosFeatures(gdi, true); + loadPage(gdi); + } + else if (bi.id=="Settings") { + loadSettings(gdi); + } + else if (bi.id == "UseFraction") { + gdi.setInputStatus("CurrencySeparator_odc", gdi.isChecked(bi.id)); + } + else if (bi.id == "AddPayMode") { + saveSettings(gdi); + vector< pair > modes; + oe->getPayModes(modes); + oe->setPayMode(modes.size(), lang.tl("Betalsätt")); + loadSettings(gdi); + } + else if (bi.id == "RemovePayMode") { + saveSettings(gdi); + oe->setPayMode(bi.getExtraInt(), ""); + loadSettings(gdi); + } + else if (bi.id=="SaveSettings") { + saveSettings(gdi); + loadPage(gdi); + } + else if (bi.id == "Exit") { + PostMessage(gdi.getMain(), WM_CLOSE, 0, 0); + } + else if (bi.id == "Help") { + char fn[MAX_PATH]; + getMeOSFile(fn, lang.tl("documentation").c_str()); + if (_access(fn, 0)==-1) { + gdi.alert(string("Hittar inte hjälpfilen, X#") + fn); + return 0; + } + + gdi.openDoc(fn); + } + else if (bi.id=="Browse") { + vector< pair > ext; + ext.push_back(make_pair(lang.tl("Databaskälla"), "*.xml;*.csv")); + + string f = gdi.browseForOpen(ext, "xml"); + string id; + if (!f.empty()) { + InputInfo &ii = dynamic_cast(gdi.getBaseInfo(bi.getExtra())); + gdi.setText(ii.id, f); + } + } + else if (bi.id=="DBaseIn") { + gdi.clearPage(true); + gdi.addString("", boldLarge, "Importera löpare och klubbar / distriktsregister"); + gdi.dropLine(); + gdi.addString("", 10, "help:runnerdatabase"); + gdi.dropLine(2); + gdi.pushX(); + gdi.fillRight(); + gdi.addInput("ClubFile", "", 40, 0, "Filnamn IOF (xml) med klubbar"); + gdi.dropLine(); + gdi.addButton("Browse", "Bläddra...", CompetitionCB).setExtra("ClubFile"); + gdi.popX(); + gdi.dropLine(3); + gdi.addInput("CmpFile", "", 40, 0, "Filnamn IOF (xml) eller OE (csv) med löpare"); + gdi.dropLine(); + gdi.addButton("Browse", "Bläddra...", CompetitionCB).setExtra("CmpFile"); + gdi.popX(); + + gdi.dropLine(3); + gdi.popX(); + gdi.addCheckbox("Clear", "Nollställ databaser", 0, true); + gdi.dropLine(3); + + gdi.popX(); + gdi.addButton("DoDBaseIn", "Importera", CompetitionCB).setDefault(); + gdi.addButton("CancelRunnerDatabase", "Avbryt", CompetitionCB).setCancel(); + gdi.dropLine(3); + gdi.fillDown(); + gdi.popX(); + } + else if (bi.id=="DoDBaseIn") { + gdi.enableEditControls(false); + gdi.disableInput("DoDBaseIn"); + gdi.disableInput("CancelRunnerDatabase"); + + gdi.setWaitCursor(true); + gdi.addString("", 0, "Importerar..."); + bool clear = gdi.isChecked("Clear"); + string club = gdi.getText("ClubFile"); + string cmp = gdi.getText("CmpFile"); + if (club == cmp) + club = ""; + + csvparser csv; + bool clubCsv = !club.empty() && csv.iscsv(club.c_str()) != 0; + bool cmpCsv = !cmp.empty() && csv.iscsv(cmp.c_str()) != 0; + + if (cmpCsv) { + if (!club.empty()) + throw meosException("Klubbfil får inte anges vid CSV import."); + + oe->importOECSV_Data(cmp.c_str(), clear); + } + else { + if (clubCsv) + throw meosException("Klubbfil får inte anges vid CSV import."); + + oe->importXML_IOF_Data(club.c_str(), cmp.c_str(), clear); + } + + gdi.dropLine(); + gdi.addButton("CancelRunnerDatabase", "Återgå", CompetitionCB); + gdi.refresh(); + gdi.setWaitCursor(false); + } + else if (bi.id=="Reset") { + if (gdi.ask("Vill då återställa inställningar och skriva över egna databaser?")) + Setup(true, true); + } + else if (bi.id=="ConnectMySQL") + loadConnectionPage(gdi); + else if (bi.id=="SaveClient") { + oe->setClientName(gdi.getText("ClientName")); + if (gdi.getText("ClientName").length()>0) + oe->setProperty("Client", gdi.getText("ClientName")); + } + else if (bi.id=="ConnectToMySQL") { + bool s=oe->connectToMySQL(gdi.getText("Server"), + gdi.getText("UserName"), + gdi.getText("PassWord"), + gdi.getTextNo("Port")); + + if (s) { + defaultServer=gdi.getText("Server"); + defaultName=gdi.getText("UserName"); + defaultPwd=gdi.getText("PassWord"); + defaultPort=gdi.getText("Port"); + + oe->setClientName(gdi.getText("ClientName")); + oe->setProperty("Server", defaultServer); + oe->setProperty("UserName", defaultName); + oe->setProperty("Port", defaultPort); + if (gdi.getText("ClientName").length()>0) + oe->setProperty("Client", gdi.getText("ClientName")); + + + loadConnectionPage(gdi); + } + } + else if (bi.id == "Repair") { + if (!gdi.ask("ask:repair")) + return 0; + ListBoxInfo lbi; + int id=0; + if ( gdi.getSelectedItem("ServerCmp", lbi) ) + id=lbi.data; + else + throw meosException("Ingen tävling vald."); + + string nameId = oe->getNameId(id); + vector output; + repairTables(nameId, output); + gdi.clearPage(true); + gdi.addString("", boldLarge, "Reparerar tävlingsdatabasen"); + gdi.dropLine(); + for (size_t k = 0; k < output.size(); k++) { + gdi.addStringUT(0, output[k]); + } + gdi.dropLine(); + gdi.addButton("Cancel", "Klart", CompetitionCB); + + } + else if (bi.id=="DisconnectMySQL") { + oe->closeDBConnection(); + loadConnectionPage(gdi); + } + else if (bi.id=="UploadCmp") { + if (oe->uploadSynchronize()) + gdi.setWindowTitle(oe->getTitleName()); + + if (oe->isClient() && oe->getPropertyInt("UseDirectSocket", true) != 0) { + oe->getDirectSocket().startUDPSocketThread(gdi.getMain()); + } + + loadConnectionPage(gdi); + } + else if (bi.id == "MultiEvent") { + loadMultiEvent(gdi); + } + else if (bi.id == "CloneEvent") { + string ne = oe->cloneCompetition(true, false, false, false, false); + oe->updateTabs(true); + } + else if (bi.id == "CloneCmp") { + gdi.restore("MultiHeader"); + gdi.dropLine(3); + gdi.fillDown(); + gdi.addString("", 1, "Skapar ny etapp").setColor(colorGreen); + gdi.addString("", 0, "Överför anmälda"); + gdi.refreshFast(); + string ne = oe->cloneCompetition(true, false, false, false, true); + + + gdi.addString("", 0, "Klart"); + gdi.dropLine(); + + char bf[260]; + getUserFile(bf, ""); + oe->enumerateCompetitions(bf, "*.meos"); + oe->updateTabs(true); + gdi.addButton("MultiEvent", "Återgå", CompetitionCB); + gdi.refresh(); + } + else if (bi.id == "SaveMulti") { + saveMultiEvent(gdi); + } + else if (bi.id == "OpenPost" || bi.id == "OpenPre") { + + saveMultiEvent(gdi); + + string nameId = oe->getNameId(0); + ListBoxInfo lbi; + bool openPost = false; + + int theNumber = oe->getStageNumber(); + + if (bi.id == "OpenPost") { + gdi.getSelectedItem("PostEvent", lbi); + openPost = true; + if (theNumber == 0) { + oe->setStageNumber(1); + theNumber = 1; + } + theNumber++; + } + else { + gdi.getSelectedItem("PreEvent", lbi); + if (theNumber == 0) { + oe->setStageNumber(2); + theNumber = 2; + } + theNumber--; + } + + int id = lbi.data; + + if (id>0) { + oe->save(); + openCompetition(gdi, id); + oe->getMeOSFeatures().useFeature(MeOSFeatures::SeveralStages, true, *oe); + if (openPost) { + oe->getDI().setString("PreEvent", nameId); + if (theNumber > 1) { + oe->setStageNumber(theNumber); + } + } + else { + oe->getDI().setString("PostEvent", nameId); + if (theNumber >= 0) { + oe->setStageNumber(theNumber); + } + } + loadMultiEvent(gdi); + } + } + else if (bi.id == "TransferData") { + saveMultiEvent(gdi); + + ListBoxInfo lbi; + gdi.getSelectedItem("PostEvent", lbi); + if (int(lbi.data) == -2) + throw std::exception("Nästa etapp är odefinierad."); + + gdi.clearPage(true); + gdi.addString("", boldLarge, "Överför resultat till nästa etapp"); + gdi.setData("PostEvent", lbi.data); + gdi.dropLine(); + selectTransferClasses(gdi, false); + } + else if (bi.id == "SelectAll" || bi.id=="SelectNone") { + set s; + if (bi.id=="SelectAll") + s.insert(-1); + gdi.setSelection("ClassNewEntries", s); + } + else if (bi.id == "ExpandTResults") { + selectTransferClasses(gdi, true); + } + else if (bi.id == "DoTransferData") { + bool transferNoCompet = true; + gdi.disableInput("DoTransferData"); + gdi.disableInput("MultiEvent"); + gdi.disableInput("ExpandTResults", true); + gdi.disableInput("SelectAll", true); + gdi.disableInput("SelectNone", true); + if (gdi.hasField("ClassNewEntries")) { + gdi.getSelection("ClassNewEntries", allTransfer); + transferNoCompet = gdi.isChecked("TransferEconomy"); + } + else { + //oe->getAllClasses(allTransfer); + allTransfer.clear(); + transferNoCompet = false; + } + int id = (int)gdi.getData("PostEvent"); + oEvent::ChangedClassMethod method = oEvent::ChangedClassMethod(gdi.getSelectedItem("ChangeClassType").first); + lastChangeClassType = method; + + string file = oe->getFileNameFromId(id); + + bool success = false; + oEvent nextStage(gdi); + + if (!file.empty()) + success = nextStage.open(file.c_str(), false); + + if (success) + success = nextStage.getNameId(0) == oe->getDCI().getString("PostEvent"); + + if (success) { + gdi.enableEditControls(false); + gdi.dropLine(3); + gdi.fillDown(); + gdi.addString("", 1, "Överför resultat till X#" + nextStage.getName()); + gdi.refreshFast(); + + vector changedClass, changedClassNoResult, assignedVacant,newEntries,notTransfered, failedTarget; + + oe->transferResult(nextStage, allTransfer, method, transferNoCompet, + changedClass, changedClassNoResult, assignedVacant, + newEntries, notTransfered, failedTarget); + bool fixedProblem = false; + + if (!changedClass.empty()) { + fixedProblem = true; + gdi.dropLine(); + gdi.addString("", 1, "Följande deltagare har bytt klass:"); + displayRunners(gdi, changedClass); + } + + if (!changedClassNoResult.empty()) { + fixedProblem = true; + gdi.dropLine(); + gdi.addString("", 1, "Följande deltagare har bytt klass (inget totalresultat):"); + displayRunners(gdi, changedClassNoResult); + } + + + if (!assignedVacant.empty()) { + fixedProblem = true; + gdi.dropLine(); + gdi.addString("", 1, "Följande deltagare har tilldelats en vakant plats:"); + displayRunners(gdi, assignedVacant); + } + + if (!newEntries.empty()) { + fixedProblem = true; + gdi.dropLine(); + gdi.addString("", 1, "Följande deltagare är nyanmälda:"); + displayRunners(gdi, newEntries); + } + + if (!notTransfered.empty() && transferNoCompet) { + fixedProblem = true; + gdi.dropLine(); + gdi.addString("", 1, "Följande deltagare deltar ej:"); + displayRunners(gdi, notTransfered); + } + else if (!notTransfered.empty()) { + fixedProblem = true; + gdi.dropLine(); + gdi.addString("", 1, "Följande deltagare överfördes ej:"); + displayRunners(gdi, notTransfered); + } + + if (!failedTarget.empty()) { + fixedProblem = true; + gdi.dropLine(); + gdi.addString("", 1, "Följande deltagare är anmälda till nästa etapp men inte denna:"); + displayRunners(gdi, failedTarget); + } + + vector newEntriesT, notTransferedT, failedTargetT; + oe->transferResult(nextStage, method, newEntriesT, notTransferedT, failedTargetT); + + nextStage.save(); + oe->updateTabs(true); + gdi.dropLine(); + + if (!fixedProblem) { + gdi.addString("", 1, "Samtliga deltagare tilldelades resultat.").setColor(colorGreen); + } + else { + gdi.addString("", 1, "Klart.").setColor(colorGreen); + } + + gdi.dropLine(); + gdi.fillRight(); + gdi.addButton("MultiEvent", "Återgå", CompetitionCB); + gdi.scrollToBottom(); + gdi.refresh(); + + } + else + throw std::exception("Kunde inte lokalisera nästa etapp"); + } + else if (bi.id == "UseEventor") { + if (gdi.isChecked("UseEventor")) + oe->setProperty("UseEventor", 1); + else + oe->setProperty("UseEventor", 2); + PostMessage(gdi.getTarget(), WM_USER + 2, TCmpTab, 0); + } + else if (bi.id == "EventorAPI") { + assert(!eventorOrigin.empty()); + //DWORD d; + //if (gdi.getData("ClearPage", d)) + gdi.clearPage(true); + gdi.addString("", boldLarge, "Nyckel för Eventor"); + gdi.dropLine(); + gdi.addString("", 10, "help:eventorkey"); + gdi.dropLine(); + gdi.addInput("apikey", "", 40, 0, "API-nyckel:"); + gdi.dropLine(); + gdi.fillRight(); + gdi.pushX(); + gdi.setRestorePoint("APIKey"); + gdi.addButton("Cancel", "Avbryt", CompetitionCB).setCancel(); + gdi.addButton("EventorAPISave", "Spara", CompetitionCB).setDefault(); + gdi.dropLine(3); + gdi.popX(); + } + else if (bi.id == "EventorAPISave") { + string key = gdi.getText("apikey"); + oe->setPropertyEncrypt("apikey", key); + + int clubId = getOrganizer(false); + + if (clubId > 0) { + gdi.restore("APIKey", false); + gdi.fillDown(); + gdi.addString("", 1, "Godkänd API-nyckel").setColor(colorGreen); + gdi.addString("", 0, "Klubb: X#" + eventor.name); + gdi.addStringUT(0, eventor.city); + gdi.dropLine(); + gdi.addButton("APIKeyOK", "Fortsätt", CompetitionCB); + gdi.refresh(); + } + else { + gdi.fillDown(); + gdi.dropLine(); + oe->setPropertyEncrypt("apikey", ""); + organizorId = 0; + gdi.addString("", boldText, "Felaktig nyckel").setColor(colorRed); + gdi.refresh(); + } + } + else if (bi.id == "APIKeyOK") { + oe->setProperty("Organizer", eventor.name); + string adr = eventor.careOf.empty() ? eventor.street : + eventor.careOf + ", " + eventor.street; + oe->setProperty("Street", adr); + oe->setProperty("Address", eventor.zipCode + " " + eventor.city); + if (eventor.account.size() > 0) + oe->setProperty("Account", eventor.account); + if (eventor.email.size() > 0) + oe->setProperty("EMail", eventor.email); + assert(!eventorOrigin.empty()); + bi.id = eventorOrigin; + eventorOrigin.clear(); + return competitionCB(gdi, type, &bi); + } + else if (bi.id == "EventorUpdateDB") { + gdi.clearPage(false); + gdi.addString("", boldLarge, "Uppdatera löpardatabasen"); + gdi.setData("UpdateDB", 1); + bi.id = "EventorImport"; + return competitionCB(gdi, type, &bi); + } + else if (bi.id == "SynchEventor") { + if (checkEventor(gdi, bi)) + return 0; + + gdi.clearPage(true); + //gdi.setData("EventorId", (int)oe->getExtIdentifier()); + //gdi.setData("UpdateDB", 1); + gdi.addString("", boldLarge, "Utbyt tävlingsdata med Eventor"); + gdi.dropLine(); + + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + + gdi.fillRight(); + gdi.addButton("EventorEntries", "Hämta efteranmälningar", CompetitionCB); + gdi.addButton("EventorUpdateDB", "Uppdatera löpardatabasen", CompetitionCB); + gdi.addButton("EventorStartlist", "Publicera startlista", CompetitionCB, "Publicera startlistan på Eventor"); + + if (!cnf.hasStartTimes()) + gdi.disableInput("EventorStartlist"); + + gdi.addButton("EventorResult", "Publicera resultat", CompetitionCB, "Publicera resultat och sträcktider på Eventor och WinSplits online"); + + if (!cnf.hasResults()) + gdi.disableInput("EventorResult"); + + gdi.addButton("Cancel", "Avbryt", CompetitionCB); + gdi.popX(); + gdi.dropLine(2); + bi.id = "EventorImport"; + //competitionCB(gdi, type, &bi); + } + else if (bi.id == "EventorEntries") { + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + if (cnf.hasResults()) { + if (!gdi.ask("Tävlingen har redan resultat. Vill du verkligen hämta anmälningar?")) + return 0; + } + gdi.enableEditControls(false); + gdi.enableInput("Cancel"); + gdi.dropLine(2); + gdi.setData("EventorId", (int)oe->getExtIdentifier()); + gdi.setData("UpdateDB", DWORD(0)); + bi.id = "EventorImport"; + competitionCB(gdi, type, &bi); + } + else if (bi.id == "EventorStartlist") { + gdi.clearPage(true); + gdi.fillDown(); + gdi.dropLine(); + gdi.addString("", boldLarge, "Publicerar startlistan"); + + gdi.dropLine(); + gdi.fillDown(); + gdi.addString("", 1, "Ansluter till Internet").setColor(colorGreen); + + gdi.refreshFast(); + Download dwl; + dwl.initInternet(); + + string startlist = getTempFile(); + bool eventorUTC = oe->getPropertyInt("UseEventorUTC", 0) != 0; + oe->exportIOFStartlist(oEvent::IOF30, startlist.c_str(), eventorUTC, + set(), false, false, true); + vector fileList; + fileList.push_back(startlist); + + string zipped = getTempFile(); + zip(zipped.c_str(), 0, fileList); + ProgressWindow pw(gdi.getTarget()); + pw.init(); + vector > key; + getAPIKey(key); + + string result = getTempFile(); + try { + dwl.postFile(eventorBase + "import/startlist", zipped, result, key, pw); + } + catch (std::exception &ex) { + gdi.fillRight(); + gdi.pushX(); + gdi.addString("", 1, "Operationen misslyckades: "); + gdi.addString("", 0, ex.what()).setColor(colorRed); + gdi.dropLine(2); + gdi.popX(); + gdi.addButton("Cancel", "Avbryt", CompetitionCB); + gdi.addButton(bi.id, "Försök igen", CompetitionCB); + removeTempFile(startlist); + removeTempFile(zipped); + gdi.refresh(); + return 0; + } + + removeTempFile(startlist); + removeTempFile(zipped); + gdi.addString("", 1, "Klart"); + + xmlparser xml(0); + xml.read(result.c_str()); + xmlobject obj = xml.getObject("ImportStartListResult"); + if (obj) { + string url; + obj.getObjectString("StartListUrl", url); + if (url.length()>0) { + gdi.fillRight(); + gdi.pushX(); + gdi.dropLine(); + gdi.addString("", 0, "Länk till startlistan:"); + gdi.addString("link", 0, url, CompetitionCB).setColor(colorRed); + } + } + gdi.dropLine(3); + gdi.popX(); + + gdi.addButton("CopyLink", "Kopiera länken till urklipp", CompetitionCB); + gdi.addButton("Cancel", "Återgå", CompetitionCB); + gdi.refresh(); + } + else if (bi.id == "EventorResult") { + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + if (cnf.hasPatrol()) { + if (!gdi.ask("När denna version av MeOS släpptes kunde Eventor " + "inte hantera resultat från patrullklasser. Vill du försöka ändå?")) + return loadPage(gdi); + } + + gdi.clearPage(true); + gdi.fillDown(); + gdi.dropLine(); + gdi.addString("", boldLarge, "Publicerar resultat"); + + gdi.dropLine(); + gdi.fillDown(); + gdi.addString("", 1, "Ansluter till Internet").setColor(colorGreen); + + gdi.refreshFast(); + Download dwl; + dwl.initInternet(); + + string resultlist = getTempFile(); + set classes; + bool eventorUTC = oe->getPropertyInt("UseEventorUTC", 0) != 0; + oe->exportIOFSplits(oEvent::IOF30, resultlist.c_str(), false, + eventorUTC, classes, -1, false, true, + false, true); + vector fileList; + fileList.push_back(resultlist); + + string zipped = getTempFile(); + zip(zipped.c_str(), 0, fileList); + ProgressWindow pw(gdi.getTarget()); + pw.init(); + vector > key; + getAPIKey(key); + + string result = getTempFile(); + + try { + dwl.postFile(eventorBase + "import/resultlist", zipped, result, key, pw); + } + catch (std::exception &ex) { + gdi.fillRight(); + gdi.pushX(); + gdi.addString("", 1, "Operationen misslyckades: "); + gdi.addString("", 0, ex.what()).setColor(colorRed); + gdi.dropLine(2); + gdi.popX(); + gdi.addButton("Cancel", "Avbryt", CompetitionCB); + gdi.addButton(bi.id, "Försök igen", CompetitionCB); + removeTempFile(resultlist); + removeTempFile(zipped); + gdi.refresh(); + return 0; + } + + removeTempFile(resultlist); + removeTempFile(zipped); + gdi.addString("", 1, "Klart"); + + xmlparser xml(0); + xml.read(result.c_str()); + xmlobject obj = xml.getObject("ImportResultListResult"); + if (obj) { + string url; + obj.getObjectString("ResultListUrl", url); + if (url.length()>0) { + gdi.fillRight(); + gdi.pushX(); + gdi.dropLine(); + gdi.addString("", 0, "Länk till resultatlistan:"); + gdi.addString("link", 0, url, CompetitionCB).setColor(colorRed); + } + } + gdi.dropLine(3); + gdi.popX(); + + gdi.addButton("CopyLink", "Kopiera länken till urklipp", CompetitionCB); + gdi.addButton("Cancel", "Återgå", CompetitionCB); + gdi.refresh(); + } + else if (bi.id == "Eventor") { + if (checkEventor(gdi, bi)) + return 0; + + SYSTEMTIME st; + GetLocalTime(&st); + st.wYear--; // Include last years competitions + getEventorCompetitions(gdi, convertSystemDate(st), events); + gdi.clearPage(true); + + gdi.addString("", boldLarge, "Hämta data från Eventor"); + + gdi.dropLine(); + gdi.addButton("EventorAPI", "Anslutningsinställningar...", CompetitionCB); + gdi.dropLine(); + gdi.fillRight(); + gdi.pushX(); + gdi.addCheckbox("EventorCmp", "Hämta tävlingsdata", CompetitionCB, true); + gdi.addSelection("EventorSel", 300, 200); + sort(events.begin(), events.end()); + st.wYear++; // Restore current time + string now = convertSystemDate(st); + + int selected = 0; // Select next event by default + for (int k = events.size()-1; k>=0; k--) { + string n = events[k].Name + " (" + events[k].Date + ")"; + gdi.addItem("EventorSel", n, k); + if (now < events[k].Date || selected == 0) + selected = k; + } + gdi.selectItemByData("EventorSel", selected); + + gdi.dropLine(3); + gdi.popX(); + gdi.addCheckbox("EventorDb", "Uppdatera löpardatabasen", CompetitionCB, true); + gdi.dropLine(3); + gdi.popX(); + gdi.addButton("Cancel", "Avbryt", CompetitionCB); + gdi.addButton("EventorNext", "Nästa >>", CompetitionCB); + } + else if (bi.id == "EventorCmp") { + gdi.setInputStatus("EventorSel", gdi.isChecked(bi.id)); + gdi.setInputStatus("EventorNext", gdi.isChecked(bi.id) | gdi.isChecked("EventorDb")); + } + else if (bi.id == "EventorDb") { + gdi.setInputStatus("EventorNext", gdi.isChecked(bi.id) | gdi.isChecked("EventorCmp")); + } + else if (bi.id == "EventorNext") { + bool cmp = gdi.isChecked("EventorCmp"); + bool db = gdi.isChecked("EventorDb"); + ListBoxInfo lbi; + gdi.getSelectedItem("EventorSel", lbi); + const CompetitionInfo *ci = 0; + if (lbi.data < events.size()) + ci = &events[lbi.data]; + + gdi.clearPage(true); + gdi.setData("UpdateDB", db); + gdi.pushX(); + if (cmp && ci) { + gdi.setData("EventIndex", lbi.data); + gdi.setData("EventorId", ci->Id); + gdi.addString("", boldLarge, "Hämta tävlingsdata för X#" + ci->Name); + gdi.dropLine(0.5); + + gdi.fillRight(); + gdi.pushX(); + + int tt = convertAbsoluteTimeHMS(ci->firstStart, -1); + string ttt = tt>0 ? ci->firstStart : ""; + gdi.addInput("FirstStart", ttt, 10, 0, "Första ordinarie starttid:", "Skriv första starttid på formen HH:MM:SS"); + + gdi.addSelection("StartType", 200, 150, 0, "Startmetod", "help:startmethod"); + gdi.addItem("StartType", lang.tl("Gemensam start"), SMCommon); + gdi.addItem("StartType", lang.tl("Lottad startlista"), SMDrawn); + gdi.addItem("StartType", lang.tl("Fria starttider"), SMFree); + gdi.addItem("StartType", lang.tl("Jag sköter lottning själv"), SMCustom); + gdi.selectFirstItem("StartType"); + gdi.fillDown(); + gdi.popX(); + gdi.dropLine(3); + + gdi.addInput("LastEntryDate", ci->lastNormalEntryDate, 10, 0, "Sista ordinarie anmälningsdatum:"); + + if (oe->getNumRunners() > 0) { + gdi.addCheckbox("RemoveRemoved", "Ta bort eventuella avanmälda deltagare", 0, true); + } + + gdi.addString("", boldText, "Importera banor"); + gdi.addString("", 10, "help:ocad13091"); + gdi.fillRight(); + gdi.dropLine(); + gdi.addInput("FileName", "", 48, 0, "Filnamn (OCAD banfil):"); + gdi.dropLine(); + gdi.fillDown(); + gdi.addButton("BrowseCourse", "Bläddra...", CompetitionCB); + } + else { + gdi.addString("", boldLarge, "Hämta löpardatabasen"); + gdi.dropLine(0.5); + + bi.id = "EventorImport"; + return competitionCB(gdi, type, &bi); + } + + gdi.dropLine(1); + gdi.popX(); + gdi.setRestorePoint("DoEventor"); + gdi.fillRight(); + gdi.addButton("Cancel", "Avbryt", CompetitionCB).setCancel(); + gdi.addButton("EventorImport", "Hämta data från Eventor", CompetitionCB).setDefault(); + gdi.fillDown(); + gdi.popX(); + } + else if (bi.id == "EventorImport") { + const int diffZeroTime = 3600; + DWORD id; + DWORD db; + gdi.getData("EventorId", id); + gdi.getData("UpdateDB", db); + + DWORD eventIndex; + gdi.getData("EventIndex", eventIndex); + const CompetitionInfo *ci = 0; + if (eventIndex < events.size()) + ci = &events[eventIndex]; + + bool removeRemoved = true; + if (gdi.hasField("RemoveRemoved")) + removeRemoved = gdi.isChecked("RemoveRemoved"); + + string course = gdi.getText("FileName", true); + int startType = 0; + const bool createNew = oe->getExtIdentifier() != id && id>0; + int zeroTime = 0; + int firstStart = 0; + string lastEntry; + if (id > 0 && createNew) { + string fs = gdi.getText("FirstStart"); + int t = oEvent::convertAbsoluteTime(fs); + if (t<0) { + string msg = "Ogiltig starttid: X#" + fs; + throw std::exception(msg.c_str()); + } + firstStart = t; + zeroTime = t - diffZeroTime; + if (zeroTime<0) + zeroTime += 3600*24; + + startType = gdi.getSelectedItem("StartType").first; + lastEntry = gdi.getText("LastEntryDate"); + } + + if (gdi.hasField("EventorImport")) { + gdi.disableInput("EventorImport"); + gdi.disableInput("FileName"); + gdi.disableInput("FirstStart"); + } + + string tEvent = getTempFile(); + string tClubs = getTempFile(); + string tClass = getTempFile(); + string tEntry = getTempFile(); + string tRunnerDB = db!= 0 ? getTempFile() : ""; + gdi.dropLine(3); + try { + getEventorCmpData(gdi, id, tEvent, tClubs, tClass, tEntry, tRunnerDB); + } + catch (std::exception &ex) { + gdi.popX(); + gdi.dropLine(); + gdi.fillDown(); + gdi.addString("", 0, string("Fel: X#") + ex.what()).setColor(colorRed); + gdi.addButton("Cancel", "Återgå", CompetitionCB); + gdi.refresh(); + return 0; + } + + gdi.fillDown(); + gdi.dropLine(); + + if (db != 0) { + gdi.addString("", 1, "Behandlar löpardatabasen").setColor(colorGreen); + vector extractedFiles; + gdi.fillRight(); + gdi.addString("", 0 , "Packar upp löpardatabas..."); + gdi.refreshFast(); + unzip(tRunnerDB.c_str(), 0, extractedFiles); + gdi.addString("", 0 , "OK"); + gdi.refreshFast(); + gdi.dropLine(); + gdi.popX(); + gdi.fillDown(); + removeTempFile(tRunnerDB); + if (extractedFiles.size() != 1) { + gdi.addString("", 0, "Unexpected file contents: X#" + tRunnerDB).setColor(colorRed); + } + if (extractedFiles.empty()) + tRunnerDB.clear(); + else + tRunnerDB = extractedFiles[0]; + } + + oe->importXML_IOF_Data(tClubs.c_str(), tRunnerDB.c_str(), true); + removeTempFile(tClubs); + + if (id > 0) { + gdi.dropLine(); + gdi.addString("", 1, "Behandlar tävlingsdata").setColor(colorGreen); + + if (createNew && id>0) { + gdi.addString("", 1, "Skapar ny tävling"); + oe->newCompetition("New"); + + oe->importXML_EntryData(gdi, tEvent.c_str(), false, false); + oe->setZeroTime(formatTimeHMS(zeroTime)); + oe->getDI().setDate("OrdinaryEntry", lastEntry); + if (ci) { + if (!ci->account.empty()) + oe->getDI().setString("Account", ci->account); + + if (!ci->url.empty()) + oe->getDI().setString("Homepage", ci->url); + } + } + removeTempFile(tEvent); + + oe->importXML_EntryData(gdi, tClass.c_str(), false, false); + removeTempFile(tClass); + + oe->importXML_EntryData(gdi, tEntry.c_str(), false, removeRemoved); + removeTempFile(tEntry); + + if (!course.empty()) { + gdi.dropLine(); + TabCourse::runCourseImport(gdi, course, oe, true); + } + + bool drawn = false; + if (createNew && startType>0) { + gdi.scrollToBottom(); + gdi.dropLine(); + + switch (startType) { + case SMCommon: + oe->automaticDrawAll(gdi, formatTimeHMS(firstStart), "0", "0", false, false, 1); + drawn = true; + break; + + case SMDrawn: + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + bool skip = false; + if (!cnf.classWithoutCourse.empty()) { + string cls = ""; + for (size_t k = 0; k < cnf.classWithoutCourse.size(); k++) { + if (k>=5) { + cls += "..."; + break; + } + if (k>0) + cls += ", "; + cls += cnf.classWithoutCourse[k]; + } + if (!gdi.ask("ask:missingcourse#" + cls)) { + gdi.addString("", 0, "Skipper lottning"); + skip = true; + } + } + if (!skip) + oe->automaticDrawAll(gdi, formatTimeHMS(firstStart), "2:00", "2", true, true, 1); + drawn = true; + break; + } + } + } + + gdi.dropLine(); + gdi.addString("", 1, "Klart").setColor(colorGreen); + + if (id > 0) { + oe->getMeOSFeatures().useFeature(MeOSFeatures::Speaker, true, *oe); + oe->getMeOSFeatures().useFeature(MeOSFeatures::Economy, true, *oe); + oe->getMeOSFeatures().useFeature(MeOSFeatures::EditClub, true, *oe); + oe->getMeOSFeatures().useFeature(MeOSFeatures::Network, true, *oe); + oe->getMeOSFeatures().useFeature(MeOSFeatures::Vacancy, true, *oe); + oe->getMeOSFeatures().useFeature(MeOSFeatures::InForest, true, *oe); + oe->getMeOSFeatures().useFeature(MeOSFeatures::DrawStartList, true, *oe); + oe->getMeOSFeatures().useFeature(MeOSFeatures::Bib, true, *oe); + oe->getMeOSFeatures().useFeature(MeOSFeatures::RunnerDb, true, *oe); + oe->getMeOSFeatures().useFeature(MeOSFeatures::ForkedIndividual, true, *oe); + + if (oe->hasTeam()) { + oe->getMeOSFeatures().useFeature(MeOSFeatures::Relay, true, *oe); + } + } + gdi.scrollToBottom(); + gdi.dropLine(); + if (gdi.hasField("Cancel")) + gdi.disableInput("Cancel"); // Disable "cancel" above + gdi.fillRight(); + if (id > 0) + gdi.addButton("StartIndividual", "Visa startlistan", ListsCB); + gdi.addButton("Cancel", "Återgå", CompetitionCB); + gdi.refreshFast(); + + } + else if (bi.id == "Cancel"){ + loadPage(gdi); + } + else if (bi.id == "WelcomeOK") { + gdi.scaleSize(1.0/gdi.getScale()); + oe->setProperty("FirstTime", 0); + loadPage(gdi); + } + else if (bi.id == "dbtest") { + + } + else if (bi.id=="FreeImport") { + gdi.clearPage(true); + gdi.addString("", 2, "Fri anmälningsimport"); + gdi.addString("", 10, "help:33940"); + gdi.dropLine(0.5); + gdi.addInputBox("EntryText", 550, 280, entryText, 0, ""); + gdi.dropLine(0.5); + gdi.fillRight(); + gdi.addButton("PreviewImport", "Granska inmatning", CompetitionCB, "tooltip:analyze"); + gdi.addButton("Cancel", "Avbryt", CompetitionCB); + gdi.addButton("Paste", "Klistra in", CompetitionCB, "tooltip:paste"); + gdi.addButton("ImportFile", "Importera fil...", CompetitionCB, "tooltip:import"); + gdi.addButton("ImportDB", "Bygg databaser...", CompetitionCB, "tooltip:builddata"); + gdi.fillDown(); + } + else if (bi.id=="ImportDB") { + if (!gdi.ask("help:146122")) + return 0; + vector< pair > ext; + ext.push_back(make_pair("xml-data", "*.xml;*.meos")); + string file = gdi.browseForOpen(ext, "xml"); + + if (file.empty()) + return 0; + gdi.setWaitCursor(true); + oe->getFreeImporter(fi); + string info; + + oe->importXMLNames(file.c_str(), fi, info); + fi.save(); + gdi.alert(info); + gdi.setWaitCursor(false); + } + else if (bi.id=="Paste") { + gdi.pasteText("EntryText"); + } + else if (bi.id=="ImportFile") { + vector< pair > ext; + ext.push_back(make_pair("Textfiler", "*.txt")); + + string file=gdi.browseForOpen(ext, "txt"); + ifstream fin(file.c_str()); + char bf[1024]; + bf[0]='\r'; + bf[1]='\n'; + entryText.clear(); + while (fin.good() && !fin.eof()) { + fin.getline(bf+2, 1024-2); + entryText+=bf; + } + entryText+="\r\n"; + fin.close(); + + gdi.setText("EntryText", entryText); + } + else if (bi.id=="PreviewImport") { + oe->getFreeImporter(fi); + entryText=gdi.getText("EntryText"); + gdi.clearPage(false); + gdi.addString("", 2, "Förhandsgranskning, import"); + gdi.dropLine(0.5); + char *bf=new char[entryText.length()+1]; + strcpy_s(bf, entryText.length()+1, entryText.c_str()); + fi.extractEntries(bf, entries); + delete[] bf; + vector cls; + oe->getClasses(cls, true); + for (size_t k = 0; k < entries.size(); k++) { + if (entries[k].eClass.empty()) { + if (!cls.empty()) { + entries[k].eClass = cls.back()->getName(); // Fallback + } + else { + entries[k].eClass = lang.tl("Klass"); + } + } + } + + fi.showEntries(gdi, entries); + gdi.fillRight(); + gdi.dropLine(1); + gdi.addButton("DoFreeImport", "Spara anmälningar", CompetitionCB); + gdi.addButton("FreeImport", "Ändra", CompetitionCB); + + gdi.addButton("Cancel", "Avbryt", CompetitionCB); + gdi.scrollToBottom(); + } + else if (bi.id=="DoFreeImport") { + fi.addEntries(oe, entries); + entryText.clear(); + loadPage(gdi); + } + else if (bi.id=="Startlist") { + save(gdi, false); + oe->sanityCheck(gdi, false); + selectStartlistOptions(gdi); + } + else if (bi.id=="BrowseExport" || bi.id=="BrowseExportResult") { + int filterIndex = gdi.getSelectedItem("Type").first; + vector< pair > ext; + ImportFormats::getExportFilters(bi.id=="BrowseExport", ext); + /*if (bi.id=="BrowseExport") { + ext.push_back(make_pair("IOF Startlista (xml)", "*.xml")); + ext.push_back(make_pair("OE Semikolonseparerad (csv)", "*.csv")); + ext.push_back(make_pair("Webbdokument (html)", "*.html;*.htm")); + } + else { + ext.push_back(make_pair("IOF Resultat (xml)", "*.xml")); + ext.push_back(make_pair("OE Semikolonseparerad (csv)", "*.csv")); + ext.push_back(make_pair("Webbdokument (html)", "*.html")); + }*/ + string save = gdi.browseForSave(ext, "xml", filterIndex); + + if (save.length() > 0) { + gdi.setText("Filename", save); + gdi.selectItemByData("Type", filterIndex); + if (gdi.getExtra("Filename")) { + gdi.enableInput((char *)gdi.getExtra("Filename")); + } + } + } + else if (bi.id=="DoSaveStartlist") { + string save = gdi.getText("Filename"); + if (save.empty()) + throw meosException("Filnamn kan inte vara tomt"); + + bool individual = !gdi.hasField("ExportTeam") || gdi.isChecked("ExportTeam"); + + bool includeStage = true; + if (gdi.hasField("IncludeRaceNumber")) + includeStage = gdi.isChecked("IncludeRaceNumber"); + + gdi.getSelection("ClassNewEntries", allTransfer); + ImportFormats::ExportFormats filterIndex = ImportFormats::setExportFormat(*oe, gdi.getSelectedItem("Type").first); + int cSVLanguageHeaderIndex = gdi.getSelectedItem("LanguageType").first; + + gdi.setWaitCursor(true); + + if (filterIndex == ImportFormats::IOF30 || filterIndex == ImportFormats::IOF203) { + bool useUTC = oe->getDCI().getInt("UTC") != 0; + oe->exportIOFStartlist(filterIndex == ImportFormats::IOF30 ? oEvent::IOF30 : oEvent::IOF20, + save.c_str(), useUTC, allTransfer, individual, includeStage, false); + } + else if (filterIndex == ImportFormats::OE) { + oe->exportOECSV(save.c_str(), cSVLanguageHeaderIndex, false); + } + else { + oListParam par; + par.listCode = EStdStartList; + par.setLegNumberCoded(-1); + oListInfo li; + par.selection = allTransfer; + oe->generateListInfo(par, gdi.getLineHeight(), li); + gdioutput tGdi("temp", gdi.getScale(), gdi.getEncoding()); + oe->generateList(tGdi, true, li, false); + tGdi.writeTableHTML(gdi.toWide(save), oe->getName(), 0); + tGdi.openDoc(save.c_str()); + } + loadPage(gdi); + } + else if (bi.id=="Splits") { + save(gdi, false); + oe->sanityCheck(gdi, true); + selectExportSplitOptions(gdi); + } + else if (bi.id == "DoSaveSplits") { + string save = gdi.getText("Filename"); + if (save.empty()) + throw meosException("Filnamn kan inte vara tomt"); + + //bool individual = !gdi.hasField("ExportTeam") || gdi.isChecked("ExportTeam"); + gdi.getSelection("ClassNewEntries", allTransfer); + + ImportFormats::ExportFormats filterIndex = ImportFormats::setExportFormat(*oe, gdi.getSelectedItem("Type").first); + int cSVLanguageHeaderIndex = gdi.getSelectedItem("LanguageType").first; + bool includeSplits = gdi.isChecked("ExportSplitTimes"); + + bool unroll = gdi.isChecked("UnrollLoops"); // If not applicable, field does not exist. + bool includeStage = true; + if (gdi.hasField("IncludeRaceNumber")) + includeStage = gdi.isChecked("IncludeRaceNumber"); + + gdi.setWaitCursor(true); + if (filterIndex == ImportFormats::IOF30 || filterIndex == ImportFormats::IOF203) { + oEvent::IOFVersion ver = filterIndex == ImportFormats::IOF30 ? oEvent::IOF30 : oEvent::IOF20; + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + bool useUTC = oe->getDCI().getInt("UTC") != 0; + + if (!cnf.hasTeamClass()) { + oe->exportIOFSplits(ver, save.c_str(), true, useUTC, + allTransfer, -1, false, unroll, includeStage, false); + } + else { + ListBoxInfo leglbi; + gdi.getSelectedItem("LegType", leglbi); + string file = save; + if (leglbi.data == 2) { + string fileBase; + string fileEnd = file.substr(file.length()-4); + if (_stricmp(fileEnd.c_str(), ".XML") == 0) + fileBase = file.substr(0, file.length() - 4); + else { + fileEnd = ".xml"; + fileBase = file; + } + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + int legMax = cnf.getNumLegsTotal(); + for (int leg = 0; legexportIOFSplits(ver, file.c_str(), true, useUTC, + allTransfer, leg, false, unroll, includeStage, false); + } + } + else if (leglbi.data == 3) { + oe->exportIOFSplits(ver, file.c_str(), true, useUTC, allTransfer, + -1, true, unroll, includeStage, false); + } + else { + int leg = leglbi.data == 1 ? -1 : leglbi.data - 10; + oe->exportIOFSplits(ver, file.c_str(), true, useUTC, allTransfer, + leg, false, unroll, includeStage, false); + } + } + } + else if (filterIndex == ImportFormats::OE) { + oe->exportOECSV(save.c_str(), cSVLanguageHeaderIndex, includeSplits); + } + else { + oListParam par; + par.listCode = EStdResultList; + par.showSplitTimes = true; + par.setLegNumberCoded(-1); + oListInfo li; + oe->generateListInfo(par, gdi.getLineHeight(), li); + gdioutput tGdi("temp", gdi.getScale(), gdi.getEncoding()); + oe->generateList(tGdi, true, li, false); + tGdi.writeTableHTML(gdi.toWide(save), oe->getName(), 0); + tGdi.openDoc(save.c_str()); + } + + loadPage(gdi); + } + else if (bi.id=="SaveAs") { + oe->sanityCheck(gdi, false); + save(gdi, true); + exportFileAs(hWndMain, gdi); + } + else if (bi.id=="Duplicate") { + oe->duplicate(); + gdi.alert("Skapade en lokal kopia av tävlingen."); + } + else if (bi.id=="Import") { + //Import complete competition + importFile(hWndMain, gdi); + loadPage(gdi); + } + else if (bi.id=="Restore") { + listBackups(gdi); + } + else if (bi.id=="Save") { + save(gdi, true); + resetSaveTimer(); + } + else if (bi.id=="CloseCmp") { + gdi.setWaitCursor(true); + if (!showConnectionPage) + save(gdi, false); + oe->save(); + oe->newCompetition(""); + resetSaveTimer(); + gdi.setWindowTitle(""); + if (showConnectionPage) + loadConnectionPage(gdi); + else + loadPage(gdi); + gdi.setWaitCursor(false); + } + else if (bi.id=="Delete" && + gdi.ask("Vill du verkligen radera tävlingen?")) { + + if (oe->isClient()) + oe->dropDatabase(); + else if (!oe->deleteCompetition()) + gdi.alert("Operation failed. It is not possible to delete competitions on server"); + + oe->clearListedCmp(); + oe->newCompetition(""); + gdi.setWindowTitle(""); + loadPage(gdi); + } + else if (bi.id=="NewCmp") { + bool guideMode = true; + if (guideMode) { + newCompetitionGuide(gdi, 0); + return 0; + } + + oe->newCompetition(lang.tl("Ny tävling")); + gdi.setWindowTitle(""); + + if (useEventor()) { + int age = getRelativeDay() - oe->getPropertyInt("DatabaseUpdate", 0); + if (age>60 && gdi.ask("help:dbage")) { + bi.id = "EventorUpdateDB"; + if (checkEventor(gdi, bi)) + return 0; + return competitionCB(gdi, type, &bi); + } + } + + loadPage(gdi); + return 0; + } + else if (bi.id=="OpenCmp") { + ListBoxInfo lbi; + int id=0; + bool frontPage=true; + if (!gdi.getSelectedItem("CmpSel", lbi)) { + frontPage=false; + if ( gdi.getSelectedItem("ServerCmp", lbi) ) + id=lbi.data; + else if ( gdi.getSelectedItem("LocalCmp", lbi) ) + id=lbi.data; + } + else id=lbi.data; + + if (id==0) + throw meosException("Ingen tävling vald."); + + openCompetition(gdi, id); + + if (frontPage) + loadPage(gdi); + else { + oe->setProperty("UseDirectSocket", gdi.isChecked("UseDirectSocket")); + oe->verifyConnection(); + oe->validateClients(); + loadConnectionPage(gdi); + } + + if (oe->isClient() && oe->getPropertyInt("UseDirectSocket", true) != 0) { + oe->getDirectSocket().startUDPSocketThread(gdi.getMain()); + } + return 0; + } + else if (bi.id=="BrowseCourse") { + vector< pair > ext; + ext.push_back(make_pair("Banor, OCAD semikolonseparerat", "*.csv;*.txt")); + ext.push_back(make_pair("Banor, IOF (xml)", "*.xml")); + + string file = gdi.browseForOpen(ext, "csv"); + if (file.length()>0) + gdi.setText("FileName", file); + } + else if (bi.id=="BrowseEntries") { + vector< pair > ext; + ext.push_back(make_pair("Importerbara", "*.xml;*.csv")); + ext.push_back(make_pair("IOF (xml)", "*.xml")); + ext.push_back(make_pair("OE Semikolonseparerad (csv)", "*.csv")); + + string file = gdi.browseForOpen(ext, "xml"); + if (file.length()>0) { + const char *ctrl = bi.getExtra(); + if (ctrl != 0) + gdi.setText(ctrl, file); + } + } + else if (bi.id=="Entries") { + if (!save(gdi, false)) + return 0; + + gdi.clearPage(false); + + entryForm(gdi, false); + + gdi.pushX(); + gdi.fillRight(); + gdi.addButton("DoImport", "Importera", CompetitionCB); + gdi.fillDown(); + gdi.addButton("Cancel", "Avbryt", CompetitionCB); + gdi.popX(); + gdi.refresh(); + } + else if (bi.id=="DoImport") { + gdi.enableEditControls(false); + gdi.disableInput("DoImport"); + gdi.disableInput("Cancel"); + gdi.disableInput("BrowseEntries"); + bool removeRemoved = gdi.isChecked("RemoveRemoved"); + + try { + gdi.autoRefresh(true); + saveEntries(gdi, removeRemoved, false); + } + catch (std::exception &) { + gdi.enableEditControls(true); + gdi.enableInput("DoImport"); + gdi.enableInput("Cancel"); + gdi.enableInput("BrowseEntries"); + gdi.refresh(); + throw; + } + + gdi.addButton("Cancel", "OK", CompetitionCB); + gdi.refresh(); + } + else if (bi.id=="Courses") { + if (!save(gdi, false)) + return 0; + TabCourse::setupCourseImport(gdi, CompetitionCB); + } + else if (bi.id=="DoImportCourse") { + string filename = gdi.getText("FileName"); + if (filename.empty()) + return 0; + gdi.disableInput("DoImportCourse"); + gdi.disableInput("Cancel"); + gdi.disableInput("BrowseCourse"); + gdi.disableInput("AddClasses"); + + try { + TabCourse::runCourseImport(gdi, filename, oe, gdi.isChecked("AddClasses")); + } + catch (std::exception &) { + gdi.enableInput("DoImportCourse"); + gdi.enableInput("Cancel"); + gdi.enableInput("BrowseCourse"); + gdi.enableInput("AddClasses"); + throw; + } + gdi.dropLine(); + gdi.addButton("Cancel", "OK", CompetitionCB); + gdi.refresh(); + } + else if (bi.id=="About") { + loadAboutPage(gdi); + } + else if (bi.id == "DBEntry") { + int classId = gdi.getSelectedItem("Classes").first; + + DWORD data; + gdi.getData("RunnerIx", data); + RunnerDBEntry *dbr = oe->getRunnerDatabase().getRunnerByIndex(data); + + // Construct runner from database + oRunner sRunner(oe, 0); + sRunner.init(*dbr); + pRunner added = oe->addRunnerFromDB(&sRunner, classId, true); + if (added) + added->synchronize(); + loadRunnerDB(gdi, 1, false); + } + else if (bi.id == "CancelRunnerDatabase") { + if (!oe->empty()) + loadRunnerDB(gdi, 0, false); + else + loadPage(gdi); + } + else if (bi.id == "CancelEntry") { + loadRunnerDB(gdi, 1, false); + } + else if (bi.id == "RunnerDB") { + loadRunnerDB(gdi, 1, true); + } + else if (bi.id == "ClubDB") { + loadRunnerDB(gdi, 2, true); + } + else if (bi.id == "ExportRunnerDB") { + xmlparser xml(gdi.getEncoding() == ANSI ? 0 : &gdi); + vector< pair > ext; + ext.push_back(make_pair("IOF Löpardatabas, version 3.0 (xml)", "*.xml")); + int ix; + string fileName = gdi.browseForSave(ext, "xml", ix); + if (fileName.empty()) + return false; + + gdi.setWaitCursor(true); + xml.openOutput(fileName.c_str(), false); + IOF30Interface writer(oe, false); + writer.writeRunnerDB(oe->getRunnerDatabase(), xml); + gdi.setWaitCursor(false); + } + else if (bi.id == "ExportClubDB") { + xmlparser xml(gdi.getEncoding() == ANSI ? 0 : &gdi); + vector< pair > ext; + ext.push_back(make_pair("IOF Klubbdatabas, version 3.0 (xml)", "*.xml")); + int ix; + string fileName = gdi.browseForSave(ext, "xml", ix); + if (fileName.empty()) + return false; + + gdi.setWaitCursor(true); + xml.openOutput(fileName.c_str(), false); + IOF30Interface writer(oe, false); + writer.writeClubDB(oe->getRunnerDatabase(), xml); + gdi.setWaitCursor(false); + } + else if (bi.id == "ClearDB") { + if (gdi.ask("ask:cleardb")) { + oe->getRunnerDatabase().clearClubs(); + oe->saveRunnerDatabase("database", true); + if (oe->isClient()) { + msUploadRunnerDB(oe); + } + loadRunnerDB(gdi, 0, false); + } + } + } + else if (type==GUI_LISTBOXSELECT) { + ListBoxInfo lbi=*(ListBoxInfo *)data; + if (lbi.id == "LocalCmp") { + gdi.selectItemByData("ServerCmp", -1); + gdi.sendCtrlMessage("OpenCmp"); + } + else if (lbi.id == "ServerCmp") { + gdi.selectItemByData("LocalCmp", -1); + gdi.sendCtrlMessage("OpenCmp"); + } + } + else if (type==GUI_LISTBOX) { + ListBoxInfo lbi=*(ListBoxInfo *)data; + + if (lbi.id=="LocalCmp") { + gdi.selectItemByData("ServerCmp", -1); + gdi.disableInput("Repair", true); + } + else if (lbi.id=="ServerCmp") { + gdi.selectItemByData("LocalCmp", -1); + gdi.enableInput("Repair", true); + } + else if (lbi.id=="TextSize") { + int textSize = lbi.data; + oe->setProperty("TextSize", textSize); + gdi.setFont(textSize, oe->getPropertyString("TextFont", "Arial"), interpetEncoding(lang.tl("encoding"))); + PostMessage(gdi.getTarget(), WM_USER + 2, TCmpTab, 0); + } + else if (lbi.id == "Language") { + lang.get().loadLangResource(lbi.text); + oe->updateTabs(true); + oe->setProperty("Language", lbi.text); + //gdi.setEncoding(interpetEncoding(lang.tl("encoding"))); + gdi.setFont(oe->getPropertyInt("TextSize", 0), oe->getPropertyString("TextFont", "Arial"), interpetEncoding(lang.tl("encoding"))); + PostMessage(gdi.getTarget(), WM_USER + 2, TCmpTab, 0); + } + else if (lbi.id == "PreEvent") { + gdi.setInputStatus("OpenPre", int(lbi.data)>0); + } + else if (lbi.id == "PostEvent") { + bool hasPost = int(lbi.data)>0; + gdi.setInputStatus("OpenPost", hasPost); + gdi.setInputStatus("TransferData", hasPost); + gdi.setInputStatus("CloneCmp", !hasPost); + } + else if (lbi.id == "StageNumber") { + int nr = int(lbi.data); + oe->setStageNumber(nr); + oe->synchronize(true); + } + else if (lbi.id == "Type") { + setExportOptionsStatus(gdi, lbi.data); + } + } + else if (type== GUI_INPUT) { + InputInfo ii=*(InputInfo *)data; + if (ii.id == "Filename") { + if (ii.getExtra()) { + gdi.setInputStatus((char *)ii.getExtra(), !ii.text.empty()); + } + } + else if (ii.id == "NumStages") { + int ns = gdi.getTextNo("NumStages"); + oe->setNumStages(ns); + oe->synchronize(true); + } + } + else if (type == GUI_INPUTCHANGE) { + InputInfo ii=*(InputInfo *)data; + if (ii.id == "Filename") { + if (ii.getExtra()) { + gdi.setInputStatus((char *)ii.getExtra(), !ii.text.empty()); + } + } + } + else if (type==GUI_EVENT) { + EventInfo ei=*(EventInfo *)data; + + if ( ei.id=="Connections" ) { + string s=gdi.getText("ClientName"); + loadConnectionPage(gdi); + gdi.setText("ClientName", s); + } + else if (ei.id=="CellAction") { + string org = ei.getOrigin(); + if (org == "runnerdb") { + int ix = ei.getExtraInt(); + const RunnerDBEntry *pRdb = oe->getRunnerDatabase().getRunnerByIndex(ix); + if (pRdb == 0) + throw meosException("Internal error"); + + const RunnerDBEntry &rdb = *pRdb; + vector classes; + bool suggest = oe->getClassesFromBirthYear(rdb.getBirthYear(), interpretSex(rdb.getSex()), classes); + + gdi.clearPage(true, false); + if (suggest || find(classes.begin(), classes.end(), lastSelectedClass) == classes.end()) { + if (classes.empty()) + lastSelectedClass = -1; + else + lastSelectedClass = classes.back(); + } + + string name; + rdb.getName(name); + gdi.addString("", boldLarge, "Anmäl X#" + name); + gdi.setData("RunnerIx", ix); + gdi.dropLine(); + gdi.addSelection("Classes", 200, 300, 0, "Klasser:"); + oe->fillClasses(gdi, "Classes", oEvent::extraNone, oEvent::filterNone); + + if (lastSelectedClass != -1) + gdi.selectItemByData("Classes", lastSelectedClass); + else + gdi.selectFirstItem("Classes"); + + gdi.dropLine(); + gdi.fillRight(); + gdi.addButton("DBEntry", "Anmäl", CompetitionCB).setDefault(); + gdi.addButton("CancelEntry", "Avbryt", CompetitionCB).setCancel(); + gdi.refresh(); + } + } + } + else if (type==GUI_CLEAR) { + if (gdi.isInputChanged("")) { + if (gdi.hasField("SaveSettings")) { + gdi.sendCtrlMessage("SaveSettings"); + } + else { + string name=gdi.getText("Name"); + + if (!name.empty() && !oe->empty()) + save(gdi, false); + } + } + return 1; + } + return 0; +} + +void TabCompetition::openCompetition(gdioutput &gdi, int id) { + gdi.setWaitCursor(true); + string err; + try { + if (!oe->open(id)) { + gdi.alert("Kunde inte öppna tävlingen."); + return; + } + } + catch (const meosException &ex) { + err = ex.what(); + } + + if (gSI) gSI->SetZeroTime(oe->getZeroTimeNum()); + resetSaveTimer(); + oe->setProperty("LastCompetition", id); + gdi.setWindowTitle(oe->getTitleName()); + oe->updateTabs(); + + if (!err.empty()) { + gdi.alert(err); + } +} + +int TabCompetition::restoreCB(gdioutput &gdi, int type, void *data) { + TextInfo &ti = *(TextInfo *)data; + int id = ti.getExtraInt(); + const BackupInfo &bi = oe->getBackup(id); + + if (ti.id == "") { + string fi(bi.FullPath); + if (!oe->open(fi.c_str(), false)) { + gdi.alert("Kunde inte öppna tävlingen."); + } + else { + if (gSI) gSI->SetZeroTime(oe->getZeroTimeNum()); + + const string &name = oe->getName(); + if (name.find_last_of("}") != name.length()-1) + oe->setName(name + " {" + lang.tl("återställd") +"}"); + + oe->restoreBackup(); + + gdi.setWindowTitle(oe->getTitleName()); + oe->updateTabs(); + resetSaveTimer(); + loadPage(gdi); + } + } + else if (ti.id == "EraseBackup") { + if (gdi.ask("Vill du ta bort alla säkerhetskopior på X?#" + bi.Name)) { + gdi.setWaitCursor(true); + oe->deleteBackups(bi); + listBackups(gdi); + } + } + return 0; +} + +void TabCompetition::listBackups(gdioutput &gdi) { + char bf[260]; + getUserFile(bf, ""); + int yo = gdi.GetOffsetY(); + gdi.clearPage(false); + oe->enumerateBackups(bf); + + gdi.addString("", boldLarge|Capitalize, "Lagrade säkerhetskopior"); + gdi.addString("", 0, "help:restore_backup"); + gdi.dropLine(0.4); + gdi.addButton("Cancel", "Återgå", CompetitionCB); + gdi.dropLine(); + oe->listBackups(gdi, ::restoreCB); + gdi.scrollTo(0, yo); + gdi.refresh(); +} + +void TabCompetition::copyrightLine(gdioutput &gdi) const +{ + gdi.pushX(); + gdi.fillRight(); + + gdi.addButton("Help", "Hjälp", CompetitionCB, ""); + gdi.addButton("About", "Om MeOS...", CompetitionCB); + + gdi.dropLine(0.4); + gdi.fillDown(); + gdi.addString("", 0, MakeDash("#Copyright © 2007-2017 Melin Software HB")); + gdi.dropLine(1); + gdi.popX(); + + gdi.addString("", 0, getMeosFullVersion()).setColor(colorDarkRed); + gdi.dropLine(0.2); +} + +void TabCompetition::loadAboutPage(gdioutput &gdi) const +{ + gdi.clearPage(false); + gdi.addString("", 2, MakeDash("Om MeOS - ett Mycket Enkelt OrienteringsSystem")).setColor(colorDarkBlue); + gdi.dropLine(2); + gdi.addStringUT(1, MakeDash("Copyright © 2007-2017 Melin Software HB")); + gdi.dropLine(); + gdi.addStringUT(10, "The database connection used is MySQL++\nCopyright " + "(c) 1998 by Kevin Atkinson, (c) 1999, 2000 and 2001 by MySQL AB," + "\nand (c) 2004-2007 by Educational Technology Resources, Inc.\n" + "The database used is MySQL, Copyright (c) 2008-2017 Oracle, Inc." + "\n\nGerman Translation by Erik Nilsson-Simkovics" + "\n\nDanish Translation by Michael Leth Jess and Chris Bagge" + "\n\nRussian Translation by Paul A. Kazakov and Albert Salihov" + "\n\nOriginal French Translation by Jerome Monclard" + "\n\nAdaption to French conditions and extended translation by Pierre Gaufillet"); + + gdi.dropLine(); + gdi.addString("", 0, "Det här programmet levereras utan någon som helst garanti. Programmet är "); + gdi.addString("", 0, "fritt att använda och du är välkommen att distribuera det under vissa villkor,"); + gdi.addString("", 0, "se license.txt som levereras med programmet."); + + gdi.dropLine(); + gdi.addString("", 1, "Vi stöder MeOS"); + vector supp; + getSupporters(supp); + for (size_t k = 0; kgetPropertyInt("UseEventor", 0) == 1; +} + +bool TabCompetition::loadPage(gdioutput &gdi) +{ + if (oe->getPropertyInt("FirstTime", 1) == 1) { + welcomeToMeOS(gdi); + return true; + } + showConnectionPage=false; + oe->checkDB(); + gdi.clearPage(true); + gdi.fillDown(); + + if (oe->empty()) { + gdi.addString("", 2, "Välkommen till MeOS"); + gdi.addString("", 1, MakeDash("#- ")+ lang.tl("ett Mycket Enkelt OrienteringsSystem")).setColor(colorDarkBlue); + gdi.dropLine(); + + if (oe->getPropertyInt("UseEventor", 0) == 0) { + if ( gdi.ask("eventor:question#" + lang.tl("eventor:help")) ) + oe->setProperty("UseEventor", 1); + else + oe->setProperty("UseEventor", 2); + } + + gdi.fillRight(); + gdi.pushX(); + + gdi.addSelection("CmpSel", 300, 400, CompetitionCB, "Välj tävling:"); + + char bf[260]; + getUserFile(bf, ""); + oe->enumerateCompetitions(bf, "*.meos"); + oe->fillCompetitions(gdi, "CmpSel",0); + gdi.autoGrow("CmpSel"); + gdi.selectFirstItem("CmpSel"); + + int lastCmp = oe->getPropertyInt("LastCompetition", 0); + gdi.selectItemByData("CmpSel", lastCmp); + + gdi.dropLine(); + gdi.addButton("OpenCmp", "Öppna", CompetitionCB, "Öppna vald tävling").setDefault(); + + gdi.dropLine(4); + gdi.popX(); + + gdi.addButton("NewCmp", "Ny tävling", CompetitionCB, "Skapa en ny, tom, tävling"); + if (useEventor()) + gdi.addButton("Eventor", "Tävling från Eventor...", CompetitionCB, "Skapa en ny tävling med data från Eventor"); + gdi.addButton("ConnectMySQL", "Databasanslutning...", CompetitionCB, "Anslut till en server"); + + gdi.popX(); + gdi.dropLine(2.5); + gdi.addButton("Import", "Importera tävling...", CompetitionCB, "Importera en tävling från fil"); + gdi.addButton("Restore", "Återställ säkerhetskopia...", CompetitionCB, "Visa tillgängliga säkerhetskopior"); + gdi.addButton("LocalSettings", "Ändra lokala inställningar...", CompetitionCB); + + gdi.popX(); + gdi.dropLine(3); + + gdi.dropLine(2.3); + textSizeControl(gdi); + + gdi.popX(); + gdi.dropLine(3); + if (enableTests) { + gdi.fillRight(); + gdi.addButton("SaveTest", "#Save test", CompetitionCB); + gdi.addButton("RunTest", "#Run tests", CompetitionCB); + gdi.addSelection("Tests", 200, 200, 0); + vector< pair > tests; + TestMeOS tm(oe, "ALL"); + tm.getTests(tests); + gdi.addItem("Tests", tests); + gdi.selectFirstItem("Tests"); + gdi.addButton("RunSpecificTest", "#Run", CompetitionCB); + + gdi.dropLine(2); + gdi.popX(); + } + + gdi.fillDown(); + + copyrightLine(gdi); + + gdi.addButton(gdi.GetPageX()-gdi.scaleLength(180), + gdi.getCY()-gdi.getButtonHeight(), + "Exit", "Avsluta", CompetitionCB); + gdi.setInputFocus("CmpSel", true); + } + else { + oe->checkNecessaryFeatures(); + gdi.selectTab(tabId); + + gdi.addString("", 3, "MeOS"); + gdi.dropLine(); + oe->synchronize(); + + gdi.pushX(); + gdi.fillRight(); + gdi.addInput("Name", oe->getName(), 24, 0, "Tävlingsnamn:"); + gdi.fillDown(); + + gdi.addInput("Annotation", oe->getAnnotation(), 20, 0, "Kommentar / version:") + .setBgColor(colorLightCyan); + gdi.popX(); + + gdi.fillRight(); + gdi.addInput("Date", oe->getDate(), 8, 0, "Datum:"); + gdi.addInput("ZeroTime", oe->getZeroTime(), 8, 0, "Nolltid:"); + + gdi.fillDown(); + gdi.dropLine(1.2); + gdi.addCheckbox("LongTimes", "Aktivera stöd för tider över 24 timmar", CompetitionCB, oe->useLongTimes()); + + if (oe->isClient()) { + gdi.popX(); + gdi.disableInput("ZeroTime"); + gdi.disableInput("LongTimes"); + if (oe->useLongTimes()) + gdi.disableInput("Date"); + } + else { + gdi.popX(); + if (!oe->useLongTimes()) + gdi.addString("ZeroTimeHelp", 0, "help:zero_time"); + else { + gdi.addString("ZeroTimeHelp", 0, "help:long_times"); + gdi.disableInput("ZeroTime"); + } + } + + gdi.fillRight(); + gdi.dropLine(); + + if (oe->getExtIdentifier() > 0 && useEventor()) { + gdi.addButton("SynchEventor", "Eventorkoppling", CompetitionCB, "Utbyt tävlingsdata med Eventor"); + } + + gdi.addButton("Settings", "Tävlingsinställningar", CompetitionCB); + gdi.addButton("Report", "Tävlingsrapport", CompetitionCB); + gdi.addButton("Features", "MeOS Funktioner", CompetitionCB); + +#ifdef _DEBUG + gdi.addButton("Test", "Test", CompetitionCB); +#endif + + gdi.fillDown(); + gdi.popX(); + + gdi.dropLine(3); + + //gdi.fillRight(); + //gdi.addCheckbox("UseEconomy", "Hantera klubbar och ekonomi", CompetitionCB, oe->useEconomy()); + //gdi.addCheckbox("UseSpeaker", "Använd speakerstöd", CompetitionCB, oe->getDCI().getInt("UseSpeaker")!=0); + //gdi.popX(); + //gdi.dropLine(2); + + //gdi.addCheckbox("UseRunnerDb", "Använd löpardatabasen", CompetitionCB, oe->useRunnerDb()); + + //gdi.popX(); + //gdi.dropLine(2); + textSizeControl(gdi); + + gdi.dropLine(4); + gdi.popX(); + gdi.fillRight(); + gdi.addButton("Save", "Spara", CompetitionCB, "help:save"); + gdi.addButton("SaveAs", "Spara som fil...", CompetitionCB, ""); + gdi.addButton("Duplicate", "Duplicera", CompetitionCB, "help:duplicate"); + + gdi.addButton("Delete", "Radera", CompetitionCB); + gdi.addButton("CloseCmp", "Stäng", CompetitionCB); + + gdi.dropLine(2.5); + gdi.popX(); + +#ifdef D_DEBUG + gdi.dropLine(2.5); + gdi.popX(); + gdi.addButton("CloneEvent", "#! Klona", CompetitionCB); +#endif + + gdi.fillDown(); + gdi.popX(); + + gdi.newColumn(); + gdi.dropLine(3); + gdi.setCX(gdi.getCX()+gdi.scaleLength(60)); + + RECT rc; + rc.top = gdi.getCY() - gdi.scaleLength(30); + rc.left = gdi.getCX() - gdi.scaleLength(30); + + int bw = gdi.scaleLength(150); + gdi.addString("", 1, "Importera tävlingsdata"); + gdi.addButton(gdi.getCX(), gdi.getCY(), bw, "Entries", "Anmälningar", + CompetitionCB, "", false, false); + gdi.addButton(gdi.getCX(), gdi.getCY(), bw, "FreeImport", "Fri anmälningsimport", + CompetitionCB, "", false, false); + gdi.addButton(gdi.getCX(), gdi.getCY(), bw, "Courses", "Banor", + CompetitionCB, "", false, false); + + gdi.dropLine(); + gdi.addString("", 1, "Exportera tävlingsdata"); + gdi.addButton(gdi.getCX(), gdi.getCY(), bw, "Startlist", "Startlista", + CompetitionCB, "Exportera startlista på fil", false, false); + gdi.addButton(gdi.getCX(), gdi.getCY(), bw, "Splits", "Resultat && sträcktider", + CompetitionCB, "Exportera resultat på fil", false, false); + + gdi.dropLine(); + gdi.addString("", 1, "Funktioner"); + if (oe->useRunnerDb()) { + gdi.addButton(gdi.getCX(), gdi.getCY(), bw, "RunnerDatabase", "Löpardatabasen", + CompetitionCB, "Visa och hantera löpardatabasen", false, false); + } + + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::SeveralStages)) { + gdi.addButton(gdi.getCX(), gdi.getCY(), bw, "MultiEvent", "Hantera flera etapper", + CompetitionCB, "", false, false); + } + gdi.addButton(gdi.getCX(), gdi.getCY(), bw, "SaveAs", "Säkerhetskopiera", + CompetitionCB, "", false, false); + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Network)) { + gdi.addButton(gdi.getCX(), gdi.getCY(), bw, "ConnectMySQL", "Databasanslutning", + CompetitionCB, "", false, false); + } + rc.bottom = gdi.getCY() + gdi.scaleLength(30); + rc.right = rc.left + bw + gdi.scaleLength(60); + + gdi.addRectangle(rc, colorLightBlue); + + gdi.popX(); + + gdi.dropLine(3); + copyrightLine(gdi); + + gdi.setOnClearCb(CompetitionCB); + } + gdi.refresh(); + return true; +} + +void TabCompetition::textSizeControl(gdioutput &gdi) const +{ + gdi.dropLine(); + int s = oe->getPropertyInt("TextSize", 0); + const char *id="TextSize"; + gdi.fillRight(); + RECT rc; + int x = gdi.getCX() + gdi.scaleLength(15); + gdi.dropLine(-0.5); + rc.top = gdi.getCY() - gdi.scaleLength(10); + rc.left = gdi.getCX(); + + gdi.setCX(x); + + gdi.addString("", 1, "Programinställningar"); + gdi.dropLine(2); + gdi.setCX(x); + //gdi.addString("", 0, "Textstorlek:"); + + gdi.addSelection(id, 90, 200, CompetitionCB, "Textstorlek:"); + gdi.addItem(id, lang.tl("Normal"), 0); + gdi.addItem(id, lang.tl("Stor"), 1); + gdi.addItem(id, lang.tl("Större"), 2); + gdi.addItem(id, lang.tl("Störst"), 3); + gdi.selectItemByData(id, s); + + id = "Language"; + gdi.addSelection(id, 150, 300, CompetitionCB, "Språk:"); + vector ln = lang.get().getLangResource(); + string current = oe->getPropertyString("Language", "Svenska"); + int ix = -1; + for (size_t k = 0; kempty()) { + gdi.setCX(gdi.getCX()+gdi.getLineHeight()*2); + gdi.dropLine(); + gdi.addButton("Setup", "Inställningar...", CompetitionCB); + + rc.right = gdi.getCX() + gdi.scaleLength(15); + + gdi.setCX(x); + gdi.dropLine(3); + + gdi.addCheckbox("UseEventor", "Använd Eventor", CompetitionCB, + useEventor(), "eventor:help"); + + rc.bottom = gdi.getCY() + gdi.scaleLength(25); + } + else { + rc.right = gdi.getWidth();//gdi.getCX() + gdi.scaleLength(10); + rc.bottom = gdi.getCY() + gdi.scaleLength(50); + } + + gdi.addRectangle(rc, colorLightYellow); + gdi.dropLine(); +} + +int TabCompetition::getOrganizer(bool updateEvent) { + string apikey = oe->getPropertyStringDecrypt("apikey", ""); + if (apikey.empty()) + return 0; + if (!isAscii(apikey)) + return 0; + + Download dwl; + dwl.initInternet(); + vector< pair > key; + string file = getTempFile(); + key.push_back(pair("ApiKey", apikey)); + string url = eventorBase + "organisation/apiKey"; + try { + dwl.downloadFile(url, file, key); + } + catch (dwException &ex) { + if (ex.code == 403) + return 0; + else { + throw std::exception("Kunde inte ansluta till Eventor."); + } + } + catch (std::exception &) { + throw std::exception("Kunde inte ansluta till Eventor."); + } + + dwl.createDownloadThread(); + while (dwl.isWorking()) { + Sleep(50); + } + + int clubId = 0; + + xmlparser xml(0); + xmlList xmlEvents; + try { + xml.read(file.c_str()); + xmlobject obj = xml.getObject("Organisation"); + if (obj) { + clubId = obj.getObjectInt("OrganisationId"); + obj.getObjectString("Name", eventor.name); + + xmlobject ads = obj.getObject("Address"); + if (ads) { + ads.getObjectString("careOf", eventor.careOf); + ads.getObjectString("street", eventor.street); + ads.getObjectString("city", eventor.city); + ads.getObjectString("zipCode", eventor.zipCode); + } + + xmlobject tele = obj.getObject("Tele"); + + if (tele) { + tele.getObjectString("mailAddress", eventor.email); + } + + xmlobject aco = obj.getObject("Account"); + if (aco) { + aco.getObjectString("AccountNo", eventor.account); + } + } + } + catch (std::exception &) { + removeTempFile(file); + throw; + } + + removeTempFile(file); + + return clubId; +} + +void TabCompetition::getAPIKey(vector< pair > &key) const { + string apikey = oe->getPropertyStringDecrypt("apikey", ""); + + if (apikey.empty() || organizorId == 0) + throw std::exception("Internal error"); + + key.clear(); + key.push_back(pair("ApiKey", apikey)); +} + +void TabCompetition::getEventorCompetitions(gdioutput &gdi, + const string &fromDate, + vector &events) const +{ + events.clear(); + + vector< pair > key; + getAPIKey(key); + + string file = getTempFile(); + string url = eventorBase + "events?fromDate=" + fromDate + + "&organisationIds=" + itos(organizorId) + "&includeEntryBreaks=true"; + Download dwl; + dwl.initInternet(); + + try { + dwl.downloadFile(url, file, key); + } + catch (std::exception &) { + removeTempFile(file); + throw; + } + + dwl.createDownloadThread(); + while (dwl.isWorking()) { + Sleep(100); + } + xmlparser xml(0); + xmlList xmlEvents; + + try { + xml.read(file.c_str()); + xmlobject obj = xml.getObject("EventList"); + obj.getObjects("Event", xmlEvents); + } + catch (std::exception &) { + removeTempFile(file); + throw; + } + + removeTempFile(file); + + for (size_t k = 0; k < xmlEvents.size(); k++) { + CompetitionInfo ci; + xmlEvents[k].getObjectString("Name", ci.Name); + ci.Id = xmlEvents[k].getObjectInt("EventId"); + xmlobject date = xmlEvents[k].getObject("StartDate"); + date.getObjectString("Date", ci.Date); + if (date.getObject("Clock")) + date.getObjectString("Clock", ci.firstStart); + + if (useEventorUTC()) { + int offset = getTimeZoneInfo(ci.Date); + int t = convertAbsoluteTimeISO(ci.firstStart); + int nt = t - offset; + int dayOffset = 0; + if (nt < 0) { + nt += 24*3600; + dayOffset = -1; + } + else if (nt > 24*3600) { + nt -= 24*3600; + dayOffset = 1; + } + ci.firstStart = formatTimeHMS(nt); + //TODO: Take dayoffset into account + } + + xmlEvents[k].getObjectString("WebURL", ci.url); + xmlobject aco = xmlEvents[k].getObject("Account"); + if (aco) { + string type = aco.getAttrib("type").get(); + string no; + aco.getObjectString("AccountNo", no); + + if (type == "bankGiro") + ci.account = "BG " + no; + else if (type == "postalGiro") + ci.account = "PG " + no; + else + ci.account = no; + } + + ci.lastNormalEntryDate = ""; + xmlList entryBreaks; + xmlEvents[k].getObjects("EntryBreak", entryBreaks); + /* Mats Troeng explains Entry Break 2011-04-03: + Efteranmälan i detta fall är satt som en tilläggsavgift (+50%) på ordinarie avgift. + Tilläggsavgiften är aktiv 2011-04-13 -- 2011-04-20, medan den ordinarie avgiften är aktiv -- 2011-04-20. Man kan också + definiera enligt ditt andra exempel i Eventor om man vill, men då måste man sätta ett fixt belopp i stället för en + procentsats för efteranmälan eftersom det inte finns något belopp att beräkna procentsatsen på. + + För att få ut anmälningsstoppen för en tävling tittar man alltså på unionen av alla (ValidFromDate - 1 sekund) + samt ValidToDate. I normalfallet är det två stycken, varav det första är ordinarie anmälningsstopp. + För t ex O-Ringen som har flera anmälningsstopp blir det mer än två EntryBreaks. + */ + for (size_t k = 0; k= breakDate) + ci.lastNormalEntryDate = breakDate; + } + + eBreak = entryBreaks[k].getObject("ValidToDate"); + if (eBreak) { + string breakDate; + eBreak.getObjectString("Date", breakDate); + if (ci.lastNormalEntryDate.empty() || ci.lastNormalEntryDate >= breakDate) + ci.lastNormalEntryDate = breakDate; + + } + } + + events.push_back(ci); + } +} + +void TabCompetition::getEventorCmpData(gdioutput &gdi, int id, + const string &eventFile, + const string &clubFile, + const string &classFile, + const string &entryFile, + const string &dbFile) const +{ + ProgressWindow pw(gdi.getHWND()); + pw.init(); + gdi.fillDown(); + gdi.addString("", 1, "Ansluter till Internet").setColor(colorGreen); + gdi.dropLine(0.5); + gdi.refreshFast(); + Download dwl; + dwl.initInternet(); + + pw.setProgress(1); + vector< pair > key; + string apikey = oe->getPropertyStringDecrypt("apikey", ""); + key.push_back(pair("ApiKey", apikey)); + + gdi.fillRight(); + + int prg = 0; + int event_prg = dbFile.empty() ? 1000 / 4 : 1000/6; + int club_prg = event_prg; + + if (id > 0) { + gdi.addString("", 0, "Hämtar tävling..."); + gdi.refreshFast(); + dwl.downloadFile(eventorBase + "export/event?eventId=" + itos(id) + iofExportVersion, eventFile, key); + dwl.createDownloadThread(); + while (dwl.isWorking()) { + Sleep(100); + } + if (!dwl.successful()) + throw std::exception("Download failed"); + + prg += int(event_prg * 0.2); + pw.setProgress(prg); + gdi.addString("", 0, "OK"); + gdi.popX(); + gdi.dropLine(); + + gdi.addString("", 0, "Hämtar klasser..."); + gdi.refreshFast(); + dwl.downloadFile(eventorBase + "export/classes?eventId=" + itos(id) + iofExportVersion, classFile, key); + dwl.createDownloadThread(); + while (dwl.isWorking()) { + Sleep(100); + } + + if (!dwl.successful()) + throw std::exception("Download failed"); + + prg += event_prg; + pw.setProgress(prg); + gdi.addString("", 0, "OK"); + gdi.popX(); + gdi.dropLine(); + + + gdi.addString("", 0, "Hämtar anmälda..."); + gdi.refreshFast(); + dwl.downloadFile(eventorBase + "export/entries?eventId=" + itos(id) + iofExportVersion, entryFile, key); + dwl.createDownloadThread(); + while (dwl.isWorking()) { + Sleep(100); + } + if (!dwl.successful()) + throw std::exception("Download failed"); + + prg += int(event_prg * 1.8); + pw.setProgress(prg); + gdi.addString("", 0, "OK"); + gdi.popX(); + gdi.dropLine(); + } + + + gdi.addString("", 0, "Hämtar klubbar..."); + gdi.refreshFast(); + dwl.downloadFile(eventorBase + "export/clubs?" + iofExportVersion, clubFile, key); + dwl.createDownloadThread(); + while (dwl.isWorking()) { + Sleep(100); + } + if (!dwl.successful()) + throw std::exception("Download failed"); + + prg += club_prg; + pw.setProgress(prg); + gdi.addString("", 0, "OK"); + gdi.popX(); + gdi.dropLine(); + + if (dbFile.length() > 0) { + gdi.addString("", 0, "Hämtar löpardatabasen..."); + gdi.refreshFast(); + dwl.downloadFile(eventorBase + "export/cachedcompetitors?organisationIds=1&includePreselectedClasses=false&zip=true" + iofExportVersion, dbFile, key); + dwl.createDownloadThread(); + while (dwl.isWorking()) { + Sleep(100); + } + + if (!dwl.successful()) + throw std::exception("Download failed"); + + pw.setProgress(1000); + gdi.addString("", 0, "OK"); + } + + gdi.popX(); + gdi.dropLine(); +} + +void TabCompetition::saveMultiEvent(gdioutput &gdi) { + ListBoxInfo lbiPre, lbiPost; + + gdi.getSelectedItem("PreEvent", lbiPre); + gdi.getSelectedItem("PostEvent", lbiPost); + + int idPost = lbiPost.data; + int idPre = lbiPre.data; + + string nameIdPost = oe->getNameId(idPost); + string nameIdPre = oe->getNameId(idPre); + string nameId = oe->getNameId(0); + if (nameIdPost == nameId || nameIdPre == nameId || (nameIdPost == nameIdPre && !nameIdPost.empty())) + throw meosException("Ogiltig föregående/efterföljande etapp."); + + if (idPost == -2) + oe->getDI().setString("PostEvent", ""); + else if (!nameIdPost.empty()) + oe->getDI().setString("PostEvent", nameIdPost); + + if (idPre == -2) + oe->getDI().setString("PreEvent", ""); + else if (!nameIdPre.empty()) + oe->getDI().setString("PreEvent", nameIdPre); +} + +void TabCompetition::loadMultiEvent(gdioutput &gdi) { + if (oe->isClient()) { + throw meosException("info:multieventnetwork"); + } + + gdi.clearPage(false); + gdi.addString("", boldLarge, "Hantera flera etapper"); + + gdi.setRestorePoint("MultiHeader"); + gdi.dropLine(); + + gdi.pushX(); + gdi.fillRight(); + + string preEvent = oe->getDCI().getString("PreEvent"); + string postEvent = oe->getDCI().getString("PostEvent"); + + gdi.addSelection("PreEvent", 300, 200, CompetitionCB, "Föregående etapp:", "Välj den etapp som föregår denna tävling"); + char bf[260]; + getUserFile(bf, ""); + oe->enumerateCompetitions(bf, "*.meos"); + + oe->fillCompetitions(gdi, "PreEvent", 1, preEvent); + gdi.addItem("PreEvent", lang.tl("Ingen / okänd"), -2); + bool hasPre = !gdi.getText("PreEvent").empty(); + if (!hasPre) + gdi.selectItemByData("PreEvent", -2); + + gdi.addSelection("PostEvent", 300, 200, CompetitionCB, "Nästa etapp:", "Välj den etapp som kommer efter denna tävling"); + oe->fillCompetitions(gdi, "PostEvent", 1, postEvent); + gdi.addItem("PostEvent", lang.tl("Ingen / okänd"), -2); + bool hasPost = !gdi.getText("PostEvent").empty(); + + if (!hasPost) + gdi.selectItemByData("PostEvent", -2); + + gdi.dropLine(5); + gdi.popX(); + gdi.fillRight(); + + int numStages = oe->getNumStages(); + gdi.addSelection("StageNumber", 100, 200, CompetitionCB, "Denna etapps nummer:"); + gdi.addItem("StageNumber", lang.tl("Inget nummer"), -2); + for (int k = 1; k <= 52; k++) + gdi.addItem("StageNumber", lang.tl("Etapp X#" + itos(k)), k); + int sn = oe->getStageNumber(); + if (sn>=1 && sn <= 52) { + gdi.selectItemByData("StageNumber", sn); + if (oe->hasNextStage()) + numStages = max(numStages, sn+1); + else + numStages = max(numStages, sn); + + oe->setNumStages(numStages); + oe->synchronize(true); + } + else + gdi.selectFirstItem("StageNumber"); + + gdi.fillDown(); + gdi.addInput("NumStages", numStages > 0 ? itos(numStages) : _EmptyString, 4, CompetitionCB, "Totalt antal etapper:"); + + gdi.fillRight(); + gdi.dropLine(2); + gdi.addButton("OpenPre", "Öppna föregående", CompetitionCB, "Öppna nästa etapp"); + gdi.addButton("OpenPost", "Öppna nästa", CompetitionCB, "Öppna föregående etapp"); + + gdi.dropLine(3); + gdi.popX(); + + gdi.addButton("SaveMulti", "Spara", CompetitionCB); + gdi.addButton("CloneCmp", "Lägg till ny etapp...", CompetitionCB); + gdi.addButton("TransferData", "Överför resultat till nästa etapp", CompetitionCB); + gdi.addButton("Cancel", "Återgå", CompetitionCB); + + gdi.setInputStatus("OpenPre", hasPre); + gdi.setInputStatus("OpenPost", hasPost); + gdi.setInputStatus("TransferData", hasPost); + gdi.setInputStatus("CloneCmp", !hasPost); + + gdi.refresh(); +} + +void TabCompetition::loadRunnerDB(gdioutput &gdi, int tableToShow, bool updateTableOnly) { + if (!updateTableOnly) { + gdi.clearPage(false); + gdi.addString("", boldLarge, "Löpardatabasen"); + + gdi.setRestorePoint("DBHeader"); + } + else { + gdi.restore("DBHeader", false); + } + gdi.dropLine(); + gdi.pushX(); + gdi.fillRight(); + gdi.addButton("RunnerDB", "Personer", CompetitionCB, "Visa löpardatabasen"); + gdi.addButton("ClubDB", "Klubbar", CompetitionCB, "Visa klubbdatabasen"); + gdi.addButton("DBaseIn", "Importera", CompetitionCB, "Importera IOF (xml)"); + if (useEventor()) + gdi.addButton("EventorUpdateDB", "Uppdatera", CompetitionCB, "Uppdatera från Eventor"); + gdi.addButton("ExportSetup", "Exportera", CompetitionCB, "Exportera på fil"); + gdi.addButton("Cancel", "Återgå", CompetitionCB); + + gdi.dropLine(3); + gdi.popX(); + + //if (tableToShow != 0) { + gdi.fillRight(); + gdi.addButton("ExportRunnerDB", "Exportera personer (IOF-XML)", CompetitionCB); + gdi.addButton("ExportClubDB", "Exportera klubbar (IOF-XML)", CompetitionCB); + gdi.addButton("ClearDB", "Töm databasen", CompetitionCB); + gdi.dropLine(3); + gdi.popX(); + + if (oe->isClient()) { + gdi.fillDown(); + gdi.addString("", 10, "info:runnerdbonline"); + gdi.dropLine(); + //gdi.disableInput("ExportRunnerDB"); + //gdi.disableInput("ExportClubDB"); + gdi.disableInput("ClearDB"); + } + //} + + if (tableToShow == 1) { + oe->updateRunnerDatabase(); + Table *tb = oe->getRunnerDatabase().getRunnerTB(); + gdi.addTable(tb, 40, gdi.getCY()); + gdi.registerEvent("CellAction", CompetitionCB); + } + else if (tableToShow == 2) { + oe->updateRunnerDatabase(); + Table *tb = oe->getRunnerDatabase().getClubTB(); + gdi.addTable(tb, 40, gdi.getCY()); + } + + gdi.refresh(); +} + +void TabCompetition::welcomeToMeOS(gdioutput &gdi) { + gdi.clearPage(false, false); + gdi.scaleSize(1.8/gdi.getScale()); + gdi.dropLine(5); + gdi.setCX(gdi.getCX() + 5*gdi.getLineHeight()); + + gdi.addString("", 2, "Välkommen till MeOS"); + gdi.addString("", 1, MakeDash("#- ")+ lang.tl("ett Mycket Enkelt OrienteringsSystem")).setColor(colorDarkBlue); + gdi.dropLine(); + gdi.addString("", 0, getMeosFullVersion()); + gdi.dropLine(2); + gdi.addStringUT(0, "Välj språk / Preferred language / Sprache"); + gdi.dropLine(); + gdi.fillRight(); + const char *id = "Language"; + gdi.addSelection(id, 90, 200, CompetitionCB); + vector ln = lang.get().getLangResource(); + string current = oe->getPropertyString("Language", "Svenska"); + int ix = -1; + for (size_t k = 0; k &changedClass) const { + for (size_t k = 0; kgetName() + " (" + changedClass[k]->getClass() +", " + + changedClass[k]->getStartTimeS()+ ")"); + } +} + +void TabCompetition::selectTransferClasses(gdioutput &gdi, bool expand) { + gdi.restore("SelectTClass", false); + gdi.setRestorePoint("SelectTClass"); + + gdi.fillDown(); + gdi.addSelection("ChangeClassType", 300, 400, 0, "Hantera deltagare som bytt klass:"); + gdi.addItem("ChangeClassType", lang.tl("Byt till vakansplats i rätt klass (om möjligt)"), oEvent::ChangeClassVacant); + gdi.addItem("ChangeClassType", lang.tl("Byt till rätt klass (behåll eventuell starttid)"), oEvent::ChangeClass); + gdi.addItem("ChangeClassType", lang.tl("Tillåt ny klass, inget totalresultat"), oEvent::TransferNoResult); + gdi.addItem("ChangeClassType", lang.tl("Tillåt ny klass, behåll resultat från annan klass"), oEvent::TransferAnyway); + gdi.selectItemByData("ChangeClassType", lastChangeClassType); + + if (expand) { + gdi.fillDown(); + gdi.addListBox("ClassNewEntries", 200, 400, 0, "Klasser där nyanmälningar ska överföras:", "", true); + oe->fillClasses(gdi, "ClassNewEntries", oEvent::extraNone, oEvent::filterNone); + + gdi.setSelection("ClassNewEntries", allTransfer); + gdi.pushX(); + gdi.fillRight(); + gdi.addButton("SelectAll", "Välj allt", CompetitionCB); + gdi.fillDown(); + gdi.addButton("SelectNone", "Välj inget", CompetitionCB); + gdi.popX(); + gdi.addCheckbox("TransferEconomy", "Överför nya deltagare i ej valda klasser med status \"deltar ej\""); + gdi.fillRight(); + } + else { + gdi.fillRight(); + gdi.addButton("ExpandTResults", "Välj klasser med nya anmälningar", CompetitionCB); + } + + gdi.addButton("DoTransferData", "Överför resultat", CompetitionCB); + gdi.addButton("MultiEvent", "Återgå", CompetitionCB); + gdi.popX(); + gdi.dropLine(); + gdi.refresh(); +} + +static int ClearFeaturesCB(gdioutput *gdi, int type, void *data) +{ + TabCompetition &tc = dynamic_cast(*gdi->getTabs().get(TCmpTab)); + tc.saveMeosFeatures(*gdi, true); + return 1; +} + +static int CheckFeaturesCB(gdioutput *gdi, int type, void *data) +{ + TabCompetition &tc = dynamic_cast(*gdi->getTabs().get(TCmpTab)); + tc.saveMeosFeatures(*gdi, false); + tc.updateFeatureStatus(*gdi); + return 0; +} + +void TabCompetition::meosFeatures(gdioutput &gdi, bool newGuide) { + if (!newGuide) { + oe->checkNecessaryFeatures(); + gdi.clearPage(false); + gdi.addString("", boldLarge, MakeDash("MeOS - Funktioner")); + } + else { + gdi.dropLine(); + gdi.addString("", fontMediumPlus, MakeDash("MeOS - Funktioner")); + } + gdi.dropLine(0.5); + + const MeOSFeatures &mf = oe->getMeOSFeatures(); + int yp = gdi.getCY(); + int tx, ty; + gdi.getTargetDimension(tx, ty); + ty = max(ty-gdi.scaleLength(150), 300); + int nf = mf.getNumFeatures(); + int maxLen = gdi.scaleLength(150); + for (int k = 0; k < nf; k++) { + if (mf.isHead(k)) { + if (gdi.getCY() > ty) { + //gdi.newColumn(); + gdi.setCX(gdi.getCX() + maxLen + gdi.scaleLength(10)); + maxLen = gdi.scaleLength(150); + gdi.setCY(yp); + } + gdi.dropLine(0.6); + TextInfo &ti = gdi.addString("", fontMediumPlus, mf.getHead(k)); + maxLen = max(maxLen, ti.textRect.right - ti.textRect.left); + gdi.dropLine(0.4); + } + else { + MeOSFeatures::Feature f = mf.getFeature(k); + ButtonInfo &bi = gdi.addCheckbox("feat" + mf.getCode(f), mf.getDescription(f), + CheckFeaturesCB, mf.hasFeature(f)); + maxLen = max(maxLen, bi.width); + + if (mf.isRequired(f, *oe)) + gdi.setInputStatus("feat" + mf.getCode(f), false); + } + } + + gdi.dropLine(); + + if (!newGuide) { + gdi.fillRight(); + gdi.addButton("SaveFeaures", "Spara", CompetitionCB).setDefault(); + gdi.addButton("Cancel", "Avbryt", CompetitionCB).setCancel(); + gdi.setOnClearCb(ClearFeaturesCB); + + gdi.refresh(); + } + +} + +void TabCompetition::updateFeatureStatus(gdioutput &gdi) { + const MeOSFeatures &mf = oe->getMeOSFeatures(); + int nf = mf.getNumFeatures(); + for (int k = 0; k < nf; k++) { + if (!mf.isHead(k)) { + MeOSFeatures::Feature f = mf.getFeature(k); + string id = "feat" + mf.getCode(f); + gdi.check(id, mf.hasFeature(f)); + gdi.setInputStatus(id, !mf.isRequired(f, *oe)); + } + } + gdi.refresh(); +} + + +void TabCompetition::saveMeosFeatures(gdioutput &gdi, bool write) { + MeOSFeatures &mf = oe->getMeOSFeatures(); + + int nf = mf.getNumFeatures(); + for (int k = 0; k < nf; k++) { + if (!mf.isHead(k)) { + MeOSFeatures::Feature f = mf.getFeature(k); + string key = "feat" + mf.getCode(f); + mf.useFeature(f, gdi.isChecked(key), *oe); + } + } + if (write) { + oe->getDI().setString("Features", mf.serialize()); + oe->synchronize(true); + } +} + +void TabCompetition::entryForm(gdioutput &gdi, bool isGuide) { + if (isGuide) { + gdi.dropLine(1); + gdi.addString("", fontMediumPlus, "Importera tävlingsdata"); + } + else + gdi.addString("", 2, "Importera tävlingsdata"); + + gdi.dropLine(0.5); + gdi.addString("", 10, "help:import_entry_data"); + gdi.dropLine(); + + gdi.pushX(); + + gdi.fillRight(); + gdi.addInput("FileNameCmp", "", 48, 0, "Tävlingsinställningar (IOF, xml)"); + gdi.dropLine(); + gdi.addButton("BrowseEntries", "Bläddra...", CompetitionCB).setExtra("FileNameCmp"); + gdi.popX(); + + gdi.dropLine(2.5); + gdi.addInput("FileNameCls", "", 48, 0, "Klasser (IOF, xml)"); + gdi.dropLine(); + gdi.addButton("BrowseEntries", "Bläddra...", CompetitionCB).setExtra("FileNameCls"); + gdi.popX(); + + gdi.dropLine(2.5); + gdi.addInput("FileNameClb", "", 48, 0, "Klubbar (IOF, xml)"); + gdi.dropLine(); + gdi.addButton("BrowseEntries", "Bläddra...", CompetitionCB).setExtra("FileNameClb"); + gdi.popX(); + + gdi.dropLine(2.5); + gdi.addInput("FileName", "", 48, 0, "Anmälningar (IOF (xml) eller OE-CSV)"); + gdi.dropLine(); + gdi.addButton("BrowseEntries", "Bläddra...", CompetitionCB).setExtra("FileName"); + + gdi.popX(); + gdi.dropLine(3.2); + + if (!isGuide && oe->getNumRunners() > 0) { + gdi.addCheckbox("RemoveRemoved", "Ta bort eventuella avanmälda deltagare", 0, true); + } + gdi.popX(); + + gdi.dropLine(2.5); + gdi.addInput("FileNameRank", "", 48, 0, "Ranking (IOF, xml)"); + gdi.dropLine(); + gdi.addButton("BrowseEntries", "Bläddra...", CompetitionCB).setExtra("FileNameRank"); + gdi.popX(); + gdi.fillDown(); + gdi.dropLine(3); +} + +void TabCompetition::saveEntries(gdioutput &gdi, bool removeRemoved, bool isGuide) { + string filename[5]; + filename[0] = gdi.getText("FileNameCmp"); + filename[1] = gdi.getText("FileNameCls"); + filename[2] = gdi.getText("FileNameClb"); + filename[3] = gdi.getText("FileName"); + filename[4] = gdi.getText("FileNameRank"); + + csvparser csv; + + for (int i = 0; i<5; i++) { + if (filename[i].empty()) + continue; + + gdi.addString("", 0, "Behandlar: X#" + filename[i]); + + int type=csv.iscsv(filename[i].c_str()); + + if (type) { + const char *File = filename[i].c_str(); + + if (type==1) { + gdi.addString("", 0, "Importerar OE2003 csv-fil..."); + gdi.refresh(); + gdi.setWaitCursor(true); + if (csv.ImportOE_CSV(*oe, File)) { + gdi.addString("", 0, "Klart. X deltagare importerade.#" + itos(csv.nimport)); + } + else gdi.addString("", 0, "Försöket misslyckades."); + } + else if (type==2) { + gdi.addString("", 0, "Importerar OS2003 csv-fil..."); + gdi.refresh(); + gdi.setWaitCursor(true); + if (csv.ImportOS_CSV(*oe, File)) { + gdi.addString("", 0, "Klart. X lag importerade.#" + itos(csv.nimport)); + } + else gdi.addString("", 0, "Försöket misslyckades."); + } + else if (type==3) { + gdi.addString("", 0, "Importerar RAID patrull csv-fil..."); + gdi.setWaitCursor(true); + if (csv.ImportRAID(*oe, File)) { + gdi.addString("", 0, "Klart. X patruller importerade.#" + itos(csv.nimport)); + } + else gdi.addString("", 0, "Försöket misslyckades."); + + } + } + else { + oe->importXML_EntryData(gdi, filename[i].c_str(), false, removeRemoved); + } + if (!isGuide) { + gdi.setWindowTitle(oe->getTitleName()); + oe->updateTabs(); + } + } +} + + +void TabCompetition::selectStartlistOptions(gdioutput &gdi) { + gdi.clearPage(true); + gdi.addString("", boldLarge, "Exportera startlista"); + gdi.pushY(); + gdi.addListBox("ClassNewEntries", 250, 400, 0, "Klassval:", "", true); + oe->fillClasses(gdi, "ClassNewEntries", oEvent::extraNone, oEvent::filterNone); + + gdi.setSelection("ClassNewEntries", allTransfer); + gdi.pushX(); + gdi.fillRight(); + gdi.addButton("SelectAll", "Välj allt", CompetitionCB); + gdi.fillDown(); + gdi.addButton("SelectNone", "Välj inget", CompetitionCB); + gdi.popX(); + + gdi.newColumn(); + gdi.pushX(); + gdi.popY(); + gdi.addSelection("Type", 250, 200, CompetitionCB, "Exporttyp:"); + + vector< pair > types; + ImportFormats::getExportFormats(types, false); + gdi.addItem("Type", types); + ImportFormats::ExportFormats format = ImportFormats::getDefaultExportFormat(*oe); + gdi.selectItemByData("Type", format); + + vector< pair > typeLanguages; + ImportFormats::getOECSVLanguage(typeLanguages); + + gdi.addSelection("LanguageType", 250, 200, CompetitionCB, "Export language:"); + gdi.addItem("LanguageType", typeLanguages); + + gdi.selectItemByData("LanguageType", ImportFormats::getDefaultCSVLanguage(*oe)); + + + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + + if (oe->hasTeam()) { + gdi.addCheckbox("ExportTeam", "Exportera individuella lopp istället för lag", 0, false); + } + if (oe->hasMultiRunner() || oe->getStageNumber() > 0) + gdi.addCheckbox("IncludeRaceNumber", "Inkludera information om flera lopp per löpare", 0, true); + + setExportOptionsStatus(gdi, format); + + gdi.addInput("Filename", "", 48, CompetitionCB, "Filnamn:").setExtra("DoSaveStartlist"); + gdi.fillRight(); + gdi.dropLine(); + gdi.addButton("BrowseExport", "Bläddra...", CompetitionCB); + gdi.addButton("DoSaveStartlist", "Exportera", CompetitionCB).setDefault(); + gdi.addButton("Cancel", "Avbryt", CompetitionCB).setCancel(); + gdi.disableInput("DoSaveStartlist"); + gdi.refresh(); +} + +void TabCompetition::selectExportSplitOptions(gdioutput &gdi) { + gdi.clearPage(false); + gdi.addString("", boldLarge, "Export av resultat/sträcktider"); + gdi.dropLine(); + gdi.pushY(); + gdi.addListBox("ClassNewEntries", 250, 400, 0, "Klassval:", "", true); + oe->fillClasses(gdi, "ClassNewEntries", oEvent::extraNone, oEvent::filterNone); + + gdi.setSelection("ClassNewEntries", allTransfer); + gdi.pushX(); + gdi.fillRight(); + gdi.addButton("SelectAll", "Välj allt", CompetitionCB); + gdi.fillDown(); + gdi.addButton("SelectNone", "Välj inget", CompetitionCB); + gdi.popX(); + gdi.newColumn(); + gdi.popY(); + gdi.pushX(); + gdi.addSelection("Type", 250, 200, CompetitionCB, "Exporttyp:"); + + vector< pair > types; + ImportFormats::getExportFormats(types, true); + + gdi.addItem("Type", types); + ImportFormats::ExportFormats format = ImportFormats::getDefaultExportFormat(*oe); + gdi.selectItemByData("Type", format); + + vector< pair > typeLanguages; + ImportFormats::getOECSVLanguage(typeLanguages); + + gdi.addSelection("LanguageType", 250, 200, CompetitionCB, "Export language:"); + gdi.addItem("LanguageType", typeLanguages); + + gdi.selectItemByData("LanguageType", ImportFormats::getDefaultCSVLanguage(*oe)); + + gdi.addCheckbox("ExportSplitTimes", "Export split times", 0, oe->getPropertyInt("ExportCSVSplits", false) != 0); + + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + + if (oe->hasTeam()) { + gdi.addSelection("LegType", 300, 100, 0, "Exportval, IOF-XML"); + gdi.addItem("LegType", lang.tl("Totalresultat"), 1); + gdi.addItem("LegType", lang.tl("Alla lopp som individuella"), 3); + gdi.addItem("LegType", lang.tl("Alla sträckor/lopp i separata filer"), 2); + int legMax = cnf.getNumLegsTotal(); + for (int k = 0; k crs; + oe->getCourses(crs); + for (size_t k = 0; k < crs.size(); k++) { + if (crs[k]->getCommonControl() != 0) + hasLoops = true; + } + if (hasLoops) + gdi.addCheckbox("UnrollLoops", "Unroll split times for loop courses", 0, true); + + if (oe->hasMultiRunner() || oe->getStageNumber() > 0) + gdi.addCheckbox("IncludeRaceNumber", "Inkludera information om flera lopp per löpare", 0, true); + + setExportOptionsStatus(gdi, format); + gdi.addInput("Filename", "", 48, CompetitionCB, "Filnamn:").setExtra("DoSaveSplits"); + gdi.fillRight(); + gdi.dropLine(); + gdi.addButton("BrowseExportResult", "Bläddra...", CompetitionCB); + gdi.addButton("DoSaveSplits", "Exportera", CompetitionCB).setDefault(); + gdi.addButton("Cancel", "Avbryt", CompetitionCB).setCancel(); + + gdi.disableInput("DoSaveSplits"); + gdi.refresh(); +} + +void TabCompetition::setExportOptionsStatus(gdioutput &gdi, int format) const { + if (gdi.hasField("LegType")) { + gdi.setInputStatus("LegType", format == ImportFormats::IOF30 || format == ImportFormats::IOF203); // Enable on IOF-XML + } + if (gdi.hasField("ExportTeam")) { + gdi.setInputStatus("ExportTeam", format == ImportFormats::IOF30); // Enable on IOF-XML + } + + if (gdi.hasField("ExportSplitTimes")) { + gdi.setInputStatus("ExportSplitTimes", format == ImportFormats::OE); + if (format == ImportFormats::IOF203 || format == ImportFormats::IOF30) + gdi.check("ExportSplitTimes", true); + } + + if (gdi.hasField("IncludeRaceNumber")) { + gdi.setInputStatus("IncludeRaceNumber", format == ImportFormats::IOF30); // Enable on IOF-XML + } + + gdi.setInputStatus("LanguageType", format == ImportFormats::OE); +} + +void TabCompetition::clearCompetitionData() { +} + +void TabCompetition::loadSettings(gdioutput &gdi) { + gdi.clearPage(false); + + gdi.addString("", boldLarge, "Tävlingsinställningar"); + gdi.dropLine(0.5); + vector fields; + gdi.pushY(); + gdi.addString("", 1, "Adress och kontakt"); + fields.push_back("Organizer"); + fields.push_back("CareOf"); + fields.push_back("Street"); + fields.push_back("Address"); + fields.push_back("EMail"); + fields.push_back("Homepage"); + + oe->getDI().buildDataFields(gdi, fields); + + gdi.dropLine(); + gdi.addString("", 1, "Tidszon"); + + gdi.dropLine(0.3); + gdi.addCheckbox("UTC", "Exportera tider i UTC", 0, + oe->getDCI().getInt("UTC") == 1); + + gdi.newColumn(); + gdi.popY(); + + gdi.addString("", 1, "Avgifter"); + fields.clear(); + gdi.fillRight(); + gdi.pushX(); + fields.push_back("CardFee"); + fields.push_back("EliteFee"); + fields.push_back("EntryFee"); + fields.push_back("YouthFee"); + + oe->getDI().buildDataFields(gdi, fields); + + gdi.popX(); + gdi.dropLine(3); + + fields.clear(); + fields.push_back("OrdinaryEntry"); + fields.push_back("LateEntryFactor"); + + oe->getDI().buildDataFields(gdi, fields); + + gdi.fillDown(); + gdi.popX(); + gdi.dropLine(3); + + gdi.addString("", 1, "Åldersgränser, reducerad anmälningsavgift"); + fields.clear(); + fields.push_back("YouthAge"); + fields.push_back("SeniorAge"); + gdi.fillRight(); + oe->getDI().buildDataFields(gdi, fields); + + gdi.fillDown(); + gdi.popX(); + gdi.dropLine(3); + + + gdi.addString("", 1, "Valuta"); + fields.clear(); + fields.push_back("CurrencySymbol"); + fields.push_back("CurrencyCode"); + + gdi.fillRight(); + oe->getDI().buildDataFields(gdi, fields); + + gdi.dropLine(); + gdi.addCheckbox("PreSymbol", "Valutasymbol före", 0, + oe->getDCI().getInt("CurrencyPreSymbol") == 1); + + gdi.popX(); + gdi.dropLine(3); + bool useFrac = oe->getDCI().getInt("CurrencyFactor") == 100; + gdi.addCheckbox("UseFraction", "Tillåt decimaler", CompetitionCB, + useFrac, "Tillåt valutauttryck med decimaler"); + + fields.clear(); + gdi.dropLine(-1); + fields.push_back("CurrencySeparator"); + oe->getDI().buildDataFields(gdi, fields); + + gdi.setInputStatus("CurrencySeparator_odc", useFrac); + + gdi.fillDown(); + gdi.popX(); + gdi.dropLine(3); + + gdi.addString("", 1, "Betalningsinformation"); + fields.clear(); + fields.push_back("Account"); + fields.push_back("PaymentDue"); + + oe->getDI().buildDataFields(gdi, fields); + + gdi.fillDown(); + gdi.addString("", 1, "Tävlingsregler"); + fields.clear(); + gdi.fillRight(); + gdi.pushX(); + fields.push_back("MaxTime"); + oe->getDI().buildDataFields(gdi, fields); + oe->getDI().fillDataFields(gdi); + + gdi.dropLine(3); + int bottom = gdi.getCY(); + + + gdi.newColumn(); + gdi.popY(); + gdi.pushX(); + gdi.fillDown(); + gdi.addString("", 1, "Betalningsmetoder"); + gdi.dropLine(); + gdi.addString("", 10, "help:paymentmodes"); + gdi.dropLine(); + vector< pair > modes; + oe->getPayModes(modes); + for (size_t k = 0; k < modes.size(); k++) { + gdi.fillRight(); + string ms = itos(modes[k].second); + gdi.addInput("M" + itos(k), modes[k].first, 24).setExtra(modes[k].second); + if (k > 0) + gdi.addButton(gdi.getCX(), gdi.getCY(), gdi.scaleLength(20), + "RemovePayMode", MakeDash("-"), CompetitionCB, + "Ta bort", false, false).setExtra(modes[k].second); + if (k == 0) + gdi.addButton(gdi.getCX(), gdi.getCY(), gdi.scaleLength(20), + "AddPayMode", "+", CompetitionCB, + "Lägg till", false, false); + + gdi.dropLine(2.5); + gdi.popX(); + } + bottom = max(bottom, gdi.getCY()); + + gdi.popX(); + gdi.setCY(bottom); + gdi.fillRight(); + gdi.addButton("SaveSettings", "Spara", CompetitionCB).setDefault(); + gdi.addButton("Cancel", "Avbryt", CompetitionCB).setCancel(); + gdi.dropLine(2); + gdi.setOnClearCb(CompetitionCB); + gdi.refresh(); + +} + +void TabCompetition::saveSettings(gdioutput &gdi) { + vector fields; + vector fees(4); + fields.push_back("CardFee"); + fields.push_back("EliteFee"); + fields.push_back("EntryFee"); + fields.push_back("YouthFee"); + + for (int k = 0; k<4; k++) + fees[k] = oe->getDCI().getInt(fields[k]); + string factor = oe->getDCI().getString("LateEntryFactor"); + oe->getDI().saveDataFields(gdi); + + bool changedFee = false; + bool changedCardFee = false; + + for (int k = 0; k<4; k++) { + if (fees[k] != oe->getDCI().getInt(fields[k])) { + if (k > 0) + changedFee = true; + else { + changedCardFee = true; + if (oe->getDCI().getInt(fields[k]) == 0) + oe->getDI().setInt(fields[k].c_str(), -1); // Disallow zero card fee. -1 means no fee. + } + } + } + if (factor != oe->getDCI().getString("LateEntryFactor")) + changedFee = true; + + oe->getDI().setInt("UTC", gdi.isChecked("UTC") ? 1 : 0); + + oe->getDI().setInt("CurrencyFactor", gdi.isChecked("UseFraction") ? 100 : 1); + oe->getDI().setInt("CurrencyPreSymbol", gdi.isChecked("PreSymbol") ? 1 : 0); + oe->setCurrency(-1, "", "", false); + + vector< pair > modes; + oe->getPayModes(modes); + for (size_t k = 0; k < modes.size(); k++) { + string field = "M"+itos(k); + if (gdi.hasField(field)) { + string mode = gdi.getText("M"+itos(k)); + int id = gdi.getBaseInfo(field.c_str()).getExtraInt(); + oe->setPayMode(id, mode); + } + } + + // Read from model + if (oe->isChanged()) { + oe->setProperty("Organizer", oe->getDCI().getString("Organizer")); + oe->setProperty("Street", oe->getDCI().getString("Street")); + oe->setProperty("Address", oe->getDCI().getString("Address")); + oe->setProperty("EMail", oe->getDCI().getString("EMail")); + oe->setProperty("Homepage", oe->getDCI().getString("Homepage")); + + oe->setProperty("CardFee", oe->getDCI().getInt("CardFee")); + oe->setProperty("EliteFee", oe->getDCI().getInt("EliteFee")); + oe->setProperty("EntryFee", oe->getDCI().getInt("EntryFee")); + oe->setProperty("YouthFee", oe->getDCI().getInt("YouthFee")); + + oe->setProperty("YouthAge", oe->getDCI().getInt("YouthAge")); + oe->setProperty("SeniorAge", oe->getDCI().getInt("SeniorAge")); + + oe->setProperty("Account", oe->getDCI().getString("Account")); + oe->setProperty("LateEntryFactor", oe->getDCI().getString("LateEntryFactor")); + + oe->setProperty("CurrencySymbol", oe->getDCI().getString("CurrencySymbol")); + oe->setProperty("CurrencyFactor", oe->getDCI().getInt("CurrencyFactor")); + oe->setProperty("CurrencyPreSymbol", oe->getDCI().getInt("CurrencyPreSymbol")); + oe->setProperty("CurrencySeparator", oe->getDCI().getString("CurrencySeparator")); + + oe->setProperty("PayModes", oe->getDCI().getString("PayModes")); + } + oe->synchronize(true); + set dummy; + if (changedFee && oe->getNumClasses() > 0) { + bool updateFee = gdi.ask("ask:changedcmpfee"); + + if (updateFee) + oe->applyEventFees(true, true, changedCardFee, dummy); + } + else if (changedCardFee) + oe->applyEventFees(false, false, true, dummy); +} diff --git a/code/TabCompetition.h b/code/TabCompetition.h new file mode 100644 index 0000000..cb07347 --- /dev/null +++ b/code/TabCompetition.h @@ -0,0 +1,150 @@ +#pragma once +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "tabbase.h" + +#include "oFreeImport.h" + +class PrefsEditor; +class ImportFormats; + +class TabCompetition : + public TabBase +{ + string eventorBase; + string iofExportVersion; + void textSizeControl(gdioutput &gdi) const; + + bool showConnectionPage; + bool importFile(HWND hWnd, gdioutput &gdi); + bool exportFileAs(HWND hWnd, gdioutput &gdi); + + bool save(gdioutput &gdi, bool write = true); + + void loadRunnerDB(gdioutput &gdi, int tableToShow, bool updateTableOnly); + + // Events from Eventor + vector events; + list prefsEditor; + + oFreeImport fi; + string entryText; + vector entries; + void loadConnectionPage(gdioutput &gdi); + + string defaultServer; + string defaultName; + string defaultPwd; + string defaultPort; + + void copyrightLine(gdioutput &gdi) const; + void loadAboutPage(gdioutput &gdi) const; + + int organizorId; + + int lastChangeClassType; + + struct { + string name; + string careOf; + string street; + string city; + string zipCode; + string account; + string email; + } eventor; + + int getOrganizer(bool updateEvent); + void getAPIKey(vector< pair > &key) const; + void getEventorCompetitions(gdioutput &gdi, + const string &fromDate, + vector &events) const; + + void saveSettings(gdioutput &gdi); + void loadSettings(gdioutput &gdi); + + void getEventorCmpData(gdioutput &gdi, int id, + const string &eventFile, + const string &clubFile, + const string &classFile, + const string &entryFile, + const string &dbFile) const; + + void loadMultiEvent(gdioutput &gdi); + void saveMultiEvent(gdioutput &gdi); + + string eventorOrigin; // The command used when checking eventor + bool checkEventor(gdioutput &gdi, ButtonInfo &bi); + + bool useEventor() const; + bool useEventorUTC() const; + + void openCompetition(gdioutput &gdi, int id); + void selectTransferClasses(gdioutput &gdi, bool expand); + + // Welcome page for new users + void welcomeToMeOS(gdioutput &gdi); + + // Class id for last selected class for entry + int lastSelectedClass; + + set allTransfer; + + void displayRunners(gdioutput &gdi, const vector &changedClass) const; + + void meosFeatures(gdioutput &gdi, bool newGuide); + + void newCompetitionGuide(gdioutput &gdi, int step); + + void entryForm(gdioutput &gdi, bool isGuide); + void saveEntries(gdioutput &gdi, bool removeRemoved, bool isGuide); + void setExportOptionsStatus(gdioutput &gdi, int format) const; + + void selectStartlistOptions(gdioutput &gdi); + void selectExportSplitOptions(gdioutput &gdi); + + void entryChoice(gdioutput &gdi); + void createCompetition(gdioutput &gdi); + + void listBackups(gdioutput &gdi); +protected: + void clearCompetitionData(); + +public: + const char * getTypeStr() const {return "TCmpTab";} + TabType getType() const {return TCmpTab;} + + void saveMeosFeatures(gdioutput &gdi, bool write); + void updateFeatureStatus(gdioutput &gdi); + + void setEventorServer(const string &server); + void setEventorUTC(bool useUTC); + + int competitionCB(gdioutput &gdi, int type, void *data); + int restoreCB(gdioutput &gdi, int type, void *data); + int newGuideCB(gdioutput &gdi, int type, void *data); + + bool loadPage(gdioutput &gdi); + TabCompetition(oEvent *oe); + ~TabCompetition(void); +}; diff --git a/code/TabControl.cpp b/code/TabControl.cpp new file mode 100644 index 0000000..cc9d367 --- /dev/null +++ b/code/TabControl.cpp @@ -0,0 +1,529 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" + +#include "resource.h" + +#include +#include +#include + +#include "oEvent.h" +#include "xmlparser.h" +#include "gdioutput.h" +#include "csvparser.h" +#include "SportIdent.h" +#include "meos_util.h" +#include "gdifonts.h" +#include "table.h" +#include +#include "MeOSFeatures.h" + +#include "TabControl.h" + +TabControl::TabControl(oEvent *poe):TabBase(poe) +{ + clearCompetitionData(); +} + +TabControl::~TabControl(void) +{ +} + +void TabControl::selectControl(gdioutput &gdi, pControl pc) +{ + if (pc) { + pc->synchronize(); + + if (pc->getStatus() == oControl::StatusStart || + pc->getStatus() == oControl::StatusFinish) { + gdi.selectItemByData("Controls", pc->getId()); + gdi.selectItemByData("Status", oControl::StatusOK); + gdi.setText("ControlID", "-", true); + + gdi.setText("Code", ""); + gdi.setText("Name", pc->getName()); + gdi.setText("TimeAdjust", "00:00"); + gdi.setText("MinTime", "-"); + gdi.setText("Point", ""); + controlId = pc->getId(); + + gdi.enableInput("Remove"); + gdi.enableInput("Save"); + gdi.enableEditControls(false); + gdi.enableInput("Name"); + } + else { + gdi.selectItemByData("Controls", pc->getId()); + gdi.selectItemByData("Status", pc->getStatus()); + const int numVisit = pc->getNumVisitors(true); + const int numVisitExp = pc->getNumVisitors(false); + + string info; + if (numVisit > 0) { + info = "Antal besökare X, genomsnittlig bomtid Y, största bomtid Z#" + + itos(numVisit) + " (" + itos(numVisitExp) + ")#" + getTimeMS(pc->getMissedTimeTotal() / numVisit) + + "#" + getTimeMS(pc->getMissedTimeMax()); + } + else if (numVisitExp > 0) { + info = "Förväntat antal besökare: X#" + itos(numVisitExp); + } + gdi.setText("ControlID", itos(pc->getId()), true); + + gdi.setText("Info", lang.tl(info), true); + gdi.setText("Code", pc->codeNumbers()); + gdi.setText("Name", pc->getName()); + gdi.setText("TimeAdjust", pc->getTimeAdjustS()); + gdi.setText("MinTime", pc->getMinTimeS()); + if (gdi.hasField("Point")) + gdi.setText("Point", pc->getRogainingPointsS()); + + controlId = pc->getId(); + + gdi.enableInput("Remove"); + gdi.enableInput("Save"); + gdi.enableInput("Visitors"); + gdi.enableInput("Courses"); + gdi.enableEditControls(true); + + oControl::ControlStatus st = pc->getStatus(); + if (st == oControl::StatusRogaining || st == oControl::StatusNoTiming) + gdi.disableInput("MinTime"); + + if (st == oControl::StatusNoTiming) + gdi.disableInput("TimeAdjust"); + + if (gdi.hasField("Point") && st != oControl::StatusRogaining) + gdi.disableInput("Point"); + } + } + else { + gdi.selectItemByData("Controls", -1); + gdi.selectItemByData("Status", oControl::StatusOK); + gdi.setText("Code", ""); + gdi.setText("Name", ""); + controlId = 0; + + gdi.setText("ControlID", "-", true); + gdi.setText("TimeAdjust", "00:00"); + if (gdi.hasField("Point")) + gdi.setText("Point", ""); + + gdi.disableInput("Remove"); + gdi.disableInput("Save"); + gdi.disableInput("Visitors"); + gdi.disableInput("Courses"); + + gdi.enableEditControls(false); + } +} + +int ControlsCB(gdioutput *gdi, int type, void *data) +{ + TabControl &tc = dynamic_cast(*gdi->getTabs().get(TControlTab)); + return tc.controlCB(*gdi, type, data); +} + +void TabControl::save(gdioutput &gdi) +{ + if (controlId==0) + return; + + DWORD pcid = controlId; + + pControl pc; + pc = oe->getControl(pcid, false); + + if (!pc) + throw std::exception("Internal error"); + if (pc->getStatus() != oControl::StatusFinish && pc->getStatus() != oControl::StatusStart) { + if (!pc->setNumbers(gdi.getText("Code"))) + gdi.alert("Kodsiffran måste vara ett heltal. Flera kodsiffror måste separeras med komma."); + + pc->setStatus(oControl::ControlStatus(gdi.getSelectedItem("Status").first)); + pc->setTimeAdjust(gdi.getText("TimeAdjust")); + if (pc->getStatus() != oControl::StatusRogaining) { + if (pc->getStatus() != oControl::StatusNoTiming) + pc->setMinTime(gdi.getText("MinTime")); + pc->setRogainingPoints(0); + } + else { + if (gdi.hasField("Point")) { + pc->setMinTime(0); + pc->setRogainingPoints(gdi.getTextNo("Point")); + } + } + } + + pc->setName(gdi.getText("Name")); + + pc->synchronize(); + vector< pair > d; + oe->fillControls(d, oEvent::CTAll); + gdi.addItem("Controls", d); + + oe->reEvaluateAll(set(), true); + + selectControl(gdi, pc); +} + +static void visitorTable(Table &table, void *ptr) { + TabControl *view = (TabControl *)ptr; + view->visitorTable(table); +} + +static void courseTable(Table &table, void *ptr) { + TabControl *view = (TabControl *)ptr; + view->courseTable(table); +} + +void TabControl::courseTable(Table &table) const { + vector r; + oe->getRunners(0, 0, r, false); + map runnersPerCourse; + for (size_t k = 0; k < r.size(); k++) { + pCourse c = r[k]->getCourse(false); + int id = c != 0 ? c->getId() : 0; + ++runnersPerCourse[id]; + } + + vector crs; + oe->getCourses(crs); + + int ix = 1; + for (size_t k = 0; k < crs.size(); k++) { + vector pc; + crs[k]->getControls(pc); + int used = 0; + for (size_t j = 0; j < pc.size(); j++) { + if (pc[j]->getId() == controlId) { + used++; + } + } + + oCourse &it = *crs[k]; + if (used > 0) { + table.addRow(ix++, &it); + + int row = 0; + table.set(row++, it, TID_ID, itos(it.getId()), false); + table.set(row++, it, TID_MODIFIED, it.getTimeStamp(), false); + + table.set(row++, it, TID_COURSE, crs[k]->getName(), false); + table.set(row++, it, TID_INDEX, itos(used), false); + table.set(row++, it, TID_RUNNER, itos(runnersPerCourse[crs[k]->getId()]), false); + } + } +} + +void TabControl::visitorTable(Table &table) const { + vector c; + oe->getCards(c); + pControl pc = oe->getControl(controlId, false); + + if (!pc) + return; + vector n; + pc->getNumbers(n); + struct PI { + PI(int c, int type, int t) : card(c), code(type), time(t) {} + int card; + int code; + int time; + bool operator<(const PI&c) const { + if (card != c.card) + return card < c.card; + else if (code != c.code) + return code < c.code; + else + return time < c.time; + } + bool operator==(const PI&c) const { + return c.card == card && c.code == code && c.time == time; + } + }; + set registeredPunches; + vector p; + int ix=1; + for (size_t k = 0; k< c.size(); k++) { + oCard &it = *c[k]; + + it.getPunches(p); + //oPunch *punch = it.getPunchByType(pc->getFirstNumber()); //XXX + + for (size_t j = 0; j < p.size(); j++) { + + vector::iterator res = find(n.begin(), n.end(), p[j]->getTypeCode()); + if (res != n.end()) { + oPunch *punch = p[j]; + registeredPunches.insert(PI(it.getCardNo(), p[j]->getTypeCode(), p[j]->getAdjustedTime())); + table.addRow(ix++, &it); + + int row = 0; + table.set(row++, it, TID_ID, itos(it.getId()), false); + table.set(row++, it, TID_MODIFIED, it.getTimeStamp(), false); + + pRunner r = it.getOwner(); + if (r) { + table.set(row++, it, TID_RUNNER, r->getName(), false); + table.set(row++, it, TID_COURSE, r->getCourseName(), false); + } + else { + table.set(row++, it, TID_RUNNER, "-", false); + table.set(row++, it, TID_COURSE, "-", false); + } + table.set(row++, it, TID_FEE, punch->isUsedInCourse() ? + lang.tl("Ja") : lang.tl("Nej"), false); + table.set(row++, it, TID_CARD, it.getCardNoString(), false); + + table.set(row++, it, TID_STATUS, punch->getTime(), false); + table.set(row++, it, TID_CONTROL, punch->getType(), false); + table.set(row++, it, TID_CODES, j>0 ? p[j-1]->getType() : "-", true); + } + } + } +} + +int TabControl::controlCB(gdioutput &gdi, int type, void *data) +{ + if (type==GUI_BUTTON) { + ButtonInfo bi=*(ButtonInfo *)data; + + if (bi.id=="Save") + save(gdi); + else if (bi.id=="Add") { + bool rogaining = false; + if (controlId>0) { + save(gdi); + pControl pc = oe->getControl(controlId, false); + rogaining = pc && pc->getStatus() == oControl::StatusRogaining; + } + pControl pc = oe->addControl(0,oe->getNextControlNumber(), ""); + + if (rogaining) + pc->setStatus(oControl::StatusRogaining); + vector< pair > d; + oe->fillControls(d, oEvent::CTAll); + gdi.addItem("Controls", d); + selectControl(gdi, pc); + } + else if (bi.id=="Remove") { + + DWORD cid = controlId; + if (cid==0) { + gdi.alert("Ingen kontroll vald vald."); + return 0; + } + + if (oe->isControlUsed(cid)) + gdi.alert("Kontrollen används och kan inte tas bort."); + else + oe->removeControl(cid); + + vector< pair > d; + oe->fillControls(d, oEvent::CTAll); + gdi.addItem("Controls", d); + selectControl(gdi, 0); + } + else if (bi.id=="SwitchMode") { + if (!tableMode) + save(gdi); + tableMode = !tableMode; + loadPage(gdi); + } + else if (bi.id=="Visitors") { + save(gdi); + + Table *table=new Table(oe, 20, "Kontroll X#" + itos(controlId), "controlvisitor"); + + table->addColumn("Id", 70, true, true); + table->addColumn("Ändrad", 70, false); + + table->addColumn("Namn", 150, false); + table->addColumn("Bana", 70, false); + table->addColumn("På banan", 70, false); + table->addColumn("Bricka", 70, true, true); + + table->addColumn("Tidpunkt", 70, false); + table->addColumn("Stämpelkod", 70, true); + table->addColumn("Föregående kontroll", 70, false); + table->setGenerator(::visitorTable, this); + table->setTableProp(0); + table->update(); + gdi.clearPage(false); + int xp=gdi.getCX(); + gdi.fillDown(); + gdi.addButton("Show", "Återgå", ControlsCB); + gdi.addTable(table, xp, gdi.getCY()); + gdi.refresh(); + } + else if (bi.id=="Courses") { + Table *table=new Table(oe, 20, "Kontroll X#" + itos(controlId), "controlcourse"); + + table->addColumn("Id", 70, true, true); + table->addColumn("Ändrad", 70, false); + + table->addColumn("Bana", 70, false, true); + table->addColumn("Förekomst", 70, true, true); + table->addColumn("Antal deltagare", 70, true, true); + + table->setGenerator(::courseTable, this); + table->setTableProp(0); + table->update(); + gdi.clearPage(false); + int xp=gdi.getCX(); + gdi.fillDown(); + gdi.addButton("Show", "Återgå", ControlsCB); + gdi.addTable(table, xp, gdi.getCY()); + gdi.refresh(); + } + else if (bi.id=="Show") { + loadPage(gdi); + } + } + else if (type==GUI_LISTBOX){ + ListBoxInfo bi=*(ListBoxInfo *)data; + + if (bi.id=="Controls") { + if (gdi.isInputChanged("")) + save(gdi); + + pControl pc=oe->getControl(bi.data, false); + if (!pc) + throw std::exception("Internal error"); + + selectControl(gdi, pc); + } + else if (bi.id == "Status" ) { + gdi.setInputStatus("MinTime", bi.data != oControl::StatusRogaining && bi.data != oControl::StatusNoTiming, true); + gdi.setInputStatus("Point", bi.data == oControl::StatusRogaining, true); + gdi.setInputStatus("TimeAdjust", bi.data != oControl::StatusNoTiming, true); + } + } + else if (type==GUI_CLEAR) { + if (controlId>0) + save(gdi); + + return true; + } + return 0; +} + + +bool TabControl::loadPage(gdioutput &gdi) +{ + oe->checkDB(); + gdi.selectTab(tabId); + gdi.clearPage(false); + int xp=gdi.getCX(); + + const int button_w=gdi.scaleLength(90); + string switchMode; + switchMode=tableMode ? "Formulärläge" : "Tabelläge"; + gdi.addButton(2, 2, button_w, "SwitchMode", switchMode, + ControlsCB, "Välj vy", false, false).fixedCorner(); + + if (tableMode) { + Table *tbl=oe->getControlTB(); + gdi.addTable(tbl, xp, 30); + return true; + } + + gdi.fillDown(); + gdi.addString("", boldLarge, "Kontroller"); + + gdi.pushY(); + gdi.addListBox("Controls", 250, 530, ControlsCB).isEdit(false).ignore(true); + gdi.setTabStops("Controls", 40, 160); + + vector< pair > d; + oe->fillControls(d, oEvent::CTAll); + gdi.addItem("Controls", d); + + gdi.newColumn(); + gdi.fillDown(); + gdi.popY(); + + gdi.pushX(); + gdi.fillRight(); + gdi.addString("", 1, "Kontrollens ID-nummer:"); + gdi.fillDown(); + gdi.addString("ControlID", 1, "#-").setColor(colorGreen); + gdi.popX(); + + gdi.fillRight(); + gdi.addInput("Name", "", 16, 0, "Kontrollnamn:"); + + gdi.addSelection("Status", 150, 100, ControlsCB, "Status:", "Ange om kontrollen fungerar och hur den ska användas."); + oe->fillControlStatus(gdi, "Status"); + + gdi.addInput("TimeAdjust", "", 6, 0, "Tidsjustering:"); + gdi.fillDown(); + gdi.addInput("MinTime", "", 6, 0, "Minsta sträcktid:"); + + gdi.popX(); + gdi.dropLine(0.5); + gdi.addString("", 10, "help:9373"); + + gdi.fillRight(); + + gdi.dropLine(0.5); + gdi.addInput("Code", "", 16, 0, "Stämpelkod(er):"); + + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Rogaining)) { + gdi.addInput("Point", "", 6, 0, "Rogaining-poäng:"); + } + gdi.popX(); + gdi.dropLine(3.5); + + gdi.fillRight(); + gdi.addButton("Save", "Spara", ControlsCB, "help:save"); + gdi.disableInput("Save"); + gdi.addButton("Remove", "Radera", ControlsCB); + gdi.disableInput("Remove"); + gdi.addButton("Courses", "Banor...", ControlsCB); + gdi.addButton("Visitors", "Besökare...", ControlsCB); + gdi.addButton("Add", "Ny kontroll", ControlsCB); + + gdi.dropLine(2.5); + gdi.popX(); + + gdi.fillDown(); + + gdi.addString("Info", 0, "").setColor(colorGreen); + + gdi.dropLine(1.5); + gdi.addString("", 10, "help:89064"); + + selectControl(gdi, oe->getControl(controlId, false)); + + gdi.setOnClearCb(ControlsCB); + + gdi.refresh(); + return true; +} + +void TabControl::clearCompetitionData() { + tableMode = false; + controlId = 0; +} diff --git a/code/TabControl.h b/code/TabControl.h new file mode 100644 index 0000000..a966bc9 --- /dev/null +++ b/code/TabControl.h @@ -0,0 +1,52 @@ +#pragma once +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "tabbase.h" + +class TabControl : + public TabBase +{ + int controlCB(gdioutput &gdi, int type, void *data); + + bool tableMode; + int controlId; + void save(gdioutput &gdi); + + +protected: + void clearCompetitionData(); + +public: + void visitorTable(Table &table) const; + void courseTable(Table &table) const; + void selectControl(gdioutput &gdi, pControl pc); + + const char * getTypeStr() const {return "TControlTab";} + TabType getType() const {return TControlTab;} + + bool loadPage(gdioutput &gdi); + TabControl(oEvent *oe); + ~TabControl(void); + + friend int ControlsCB(gdioutput *gdi, int type, void *data); +}; diff --git a/code/TabCourse.cpp b/code/TabCourse.cpp new file mode 100644 index 0000000..bd08d19 --- /dev/null +++ b/code/TabCourse.cpp @@ -0,0 +1,1158 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" + +#include "resource.h" + +#include +#include +#include + +#include "oEvent.h" +#include "xmlparser.h" +#include "gdioutput.h" +#include "csvparser.h" +#include "SportIdent.h" +#include "gdifonts.h" +#include "IOF30Interface.h" +#include "meosexception.h" +#include "MeOSFeatures.h" +#include "oEventDraw.h" +#include "oListInfo.h" + +#include "TabCourse.h" +#include "TabCompetition.h" +#include "meos_util.h" +#include "pdfwriter.h" + +TabCourse::TabCourse(oEvent *poe):TabBase(poe) +{ + clearCompetitionData(); +} + +TabCourse::~TabCourse(void) +{ +} + +void LoadCoursePage(gdioutput &gdi); +void LoadClassPage(gdioutput &gdi); + +void TabCourse::selectCourse(gdioutput &gdi, pCourse pc) +{ + if (gdi.hasField("Rogaining")) { + gdi.setText("TimeLimit", ""); + gdi.disableInput("TimeLimit"); + gdi.setText("PointLimit", ""); + gdi.disableInput("PointLimit"); + gdi.setText("PointReduction", ""); + gdi.disableInput("PointReduction"); + gdi.check("ReductionPerMinute", false); + gdi.disableInput("ReductionPerMinute"); + gdi.selectItemByData("Rogaining", 0); + } + + if (pc) { + pc->synchronize(); + + string uis = pc->getControlsUI(); + gdi.setText("Controls", uis); + + gdi.setText("CourseExpanded", encodeCourse(uis, pc->useFirstAsStart(), pc->useLastAsFinish()), true); + + gdi.setText("Name", pc->getName()); + + gdi.setTextZeroBlank("Length", pc->getLength()); + gdi.setTextZeroBlank("Climb", pc->getDI().getInt("Climb")); + gdi.setTextZeroBlank("NumberMaps", pc->getNumberMaps()); + + gdi.check("FirstAsStart", pc->useFirstAsStart()); + gdi.check("LastAsFinish", pc->useLastAsFinish()); + + if (gdi.hasField("Rogaining")) { + int rt = pc->getMaximumRogainingTime(); + int rp = pc->getMinimumRogainingPoints(); + + if ( rt > 0 ) { + gdi.selectItemByData("Rogaining", 1); + gdi.enableInput("TimeLimit"); + gdi.setText("TimeLimit", formatTimeHMS(rt)); + gdi.enableInput("PointReduction"); + gdi.setText("PointReduction", itos(pc->getRogainingPointsPerMinute())); + gdi.enableInput("ReductionPerMinute"); + gdi.check("ReductionPerMinute", pc->getDCI().getInt("RReductionMethod") != 0); + } + else if (rp > 0) { + gdi.selectItemByData("Rogaining", 2); + gdi.enableInput("PointLimit"); + gdi.setText("PointLimit", itos(rp)); + } + } + + courseId = pc->getId(); + gdi.enableInput("Remove"); + gdi.enableInput("Save"); + + gdi.selectItemByData("Courses", pc->getId()); + gdi.setText("CourseProblem", lang.tl(pc->getCourseProblems()), true); + vector cls; + vector crs; + oe->getClasses(cls, true); + string usedInClasses; + for (size_t k = 0; k < cls.size(); k++) { + int nleg = max(cls[k]->getNumStages(), 1); + int nlegwithcrs = 0; + vector usage; + set allClassCrs; + for (int j = 0; j < nleg; j++) { + cls[k]->getCourses(j, crs); + if (!crs.empty()) + nlegwithcrs++; + + bool done = false; + for (size_t i = 0; i < crs.size(); i++) { + if (!crs[i]) + continue; + allClassCrs.insert(crs[i]->getId()); + if (!done && crs[i] == pc) { + usage.push_back(cls[k]->getLegNumber(j)); + done = true; // Cannot break, fill allClasssCrs + } + } + } + string add; + if (usage.size() == nleg || + usage.size() == nlegwithcrs || + (!usage.empty() && allClassCrs.size() == 1)) { + add = cls[k]->getName(); + } + else if (!usage.empty()) { + add = cls[k]->getName(); + add += " ("; + for (size_t i = 0; i < usage.size(); i++) { + if (i > 0) + add += ", "; + add += usage[i]; + } + add += ")"; + } + + if (!add.empty()) { + if (!usedInClasses.empty()) + usedInClasses += ", "; + usedInClasses += add; + } + } + gdi.setText("CourseUse", usedInClasses, true); + pCourse shortens = pc->getLongerVersion(); + if (shortens) + gdi.setTextTranslate("Shortens", "Avkortar: X#" + shortens->getName(), true); + else + gdi.setText("Shortens", "", true); + + gdi.enableEditControls(true); + + fillCourseControls(gdi, pc->getControlsUI()); + int cc = pc->getCommonControl(); + gdi.check("WithLoops", cc != 0); + gdi.setInputStatus("CommonControl", cc != 0); + if (cc) { + gdi.selectItemByData("CommonControl", cc); + } + + fillOtherCourses(gdi, *pc); + pCourse sh = pc->getShorterVersion(); + gdi.check("Shorten", sh != 0); + gdi.setInputStatus("ShortCourse", sh != 0); + if (sh) { + gdi.selectItemByData("ShortCourse", sh->getId()); + } + } + else { + gdi.setText("Name", ""); + gdi.setText("Controls", ""); + gdi.setText("CourseExpanded", ""); + + gdi.setText("Length", ""); + gdi.setText("Climb", ""); + gdi.setText("NumberMaps", ""); + gdi.check("FirstAsStart", false); + gdi.check("LastAsFinish", false); + courseId = 0; + gdi.disableInput("Remove"); + gdi.disableInput("Save"); + gdi.selectItemByData("Courses", -1); + gdi.setText("CourseProblem", "", true); + gdi.setText("CourseUse", "", true); + gdi.setText("Shortens", "", true); + gdi.check("WithLoops", false); + gdi.clearList("CommonControl"); + gdi.setInputStatus("CommonControl", false); + gdi.check("Shorten", false); + gdi.clearList("ShortCourse"); + gdi.setInputStatus("ShortCourse", false); + + gdi.enableEditControls(false); + } + gdi.setInputStatus("DrawCourse", pc != 0); +} + +int CourseCB(gdioutput *gdi, int type, void *data) +{ + TabCourse &tc = dynamic_cast(*gdi->getTabs().get(TCourseTab)); + + return tc.courseCB(*gdi, type, data); +} + +void TabCourse::save(gdioutput &gdi, int canSwitchViewMode) +{ + DWORD cid = courseId; + + pCourse pc; + string name=gdi.getText("Name"); + + if (name.empty()) { + gdi.alert("Banan måste ha ett namn."); + return; + } + + bool create=false; + if (cid>0) + pc=oe->getCourse(cid); + else { + pc=oe->addCourse(name); + create=true; + } + + bool firstAsStart = gdi.isChecked("FirstAsStart"); + bool lastAsFinish = gdi.isChecked("LastAsFinish"); + bool oldFirstAsStart = pc->useFirstAsStart(); + if (!oldFirstAsStart && firstAsStart) { + vector cr; + oe->getRunners(0, pc->getId(), cr, false); + bool hasRes = false; + for (size_t k = 0; k < cr.size(); k++) { + if (cr[k]->getCard() != 0) { + hasRes = true; + break; + } + } + if (hasRes) { + firstAsStart = gdi.ask("ask:firstasstart"); + } + } + + + pc->setName(name); + bool changedCourse = pc->importControls(gdi.getText("Controls"), true); + pc->setLength(gdi.getTextNo("Length")); + pc->getDI().setInt("Climb", gdi.getTextNo("Climb")); + pc->setNumberMaps(gdi.getTextNo("NumberMaps")); + pc->firstAsStart(firstAsStart); + pc->lastAsFinish(lastAsFinish); + + if (gdi.isChecked("WithLoops")) { + int cc = gdi.getTextNo("CommonControl"); + if (cc == 0) + throw meosException("Ange en varvningskontroll för banan"); + pc->setCommonControl(cc); + } + else + pc->setCommonControl(0); + + if (gdi.isChecked("Shorten")) { + ListBoxInfo ci; + if (gdi.getSelectedItem("ShortCourse", ci) && oe->getCourse(ci.data)) { + pc->setShorterVersion(oe->getCourse(ci.data)); + } + else + throw meosException("Ange en avkortad banvariant"); + } + else + pc->setShorterVersion(0); + + if (gdi.hasField("Rogaining")) { + string t; + pc->setMaximumRogainingTime(convertAbsoluteTimeMS(gdi.getText("TimeLimit"))); + pc->setMinimumRogainingPoints(atoi(gdi.getText("PointLimit").c_str())); + int pr = atoi(gdi.getText("PointReduction").c_str()); + pc->setRogainingPointsPerMinute(pr); + if (pr > 0) { + int rmethod = gdi.isChecked("ReductionPerMinute") ? 1 : 0; + pc->getDI().setInt("RReductionMethod", rmethod); + } + } + + pc->synchronize();//Update SQL + + oe->fillCourses(gdi, "Courses"); + oe->reEvaluateCourse(pc->getId(), true); + + if (canSwitchViewMode != 2 && changedCourse && pc->getLegLengths().size() > 2) { + if (canSwitchViewMode == 1) { + if(gdi.ask("ask:updatelegs")) { + gdi.sendCtrlMessage("LegLengths"); + return; + } + } + else { + gdi.alert("warn:updatelegs"); + } + } + + if (gdi.getData("FromClassPage", cid)) { + assert(false); + } + else if (addedCourse || create) + selectCourse(gdi, 0); + else + selectCourse(gdi, pc); +} + +int TabCourse::courseCB(gdioutput &gdi, int type, void *data) +{ + if (type==GUI_BUTTON) { + ButtonInfo bi=*(ButtonInfo *)data; + + if (bi.id=="Save") { + save(gdi, 1); + } + else if (bi.id == "LegLengths") { + save(gdi, 2); + + pCourse pc = oe->getCourse(courseId); + if (!pc || pc->getNumControls() == 0) { + return 0; + } + gdi.clearPage(false); + gdi.addString("", boldLarge, "Redigera sträcklängder för X#" + pc->getName()); + gdi.dropLine(); + int w = gdi.scaleLength(120); + int xp = gdi.getCX() + w; + int yp = gdi.getCY(); + gdi.addString("", 1, "Sträcka:"); + gdi.addString("", yp, xp, 1, "Längd:"); + + for (int i = 0; i <= pc->getNumControls(); i++) { + int len = pc->getLegLength(i); + pControl cbegin = pc->getControl(i-1); + string begin = i == 0 ? lang.tl("Start") : (cbegin ? cbegin->getName() : ""); + pControl cend = pc->getControl(i); + string end = i == pc->getNumControls() ? lang.tl("Mål") : (cend ? cend->getName() : ""); + gdi.pushX(); + gdi.fillRight(); + gdi.addStringUT(0, begin + MakeDash(" - ") + end + ":").xlimit = w-10; + gdi.setCX(xp); + gdi.fillDown(); + gdi.addInput("c" + itos(i), len > 0 ? itos(len) : "", 8); + gdi.popX(); + if (i < pc->getNumControls()) { + RECT rc; + rc.left = gdi.getCX() + gdi.getLineHeight(); + rc.right = rc.left + (3*w)/2; + rc.top = gdi.getCY() + 2; + rc.bottom = gdi.getCY() + 4; + gdi.addRectangle(rc, colorDarkBlue, false); + } + } + + gdi.dropLine(); + gdi.fillRight(); + gdi.addButton("Cancel", "Avbryt", CourseCB).setCancel(); + gdi.addButton("SaveLegLen", "Spara", CourseCB).setDefault(); + gdi.setOnClearCb(CourseCB); + gdi.setData("EditLengths", 1); + gdi.refresh(); + } + else if (bi.id == "SaveLegLen") { + saveLegLengths(gdi); + loadPage(gdi); + } + else if (bi.id=="BrowseCourse") { + vector< pair > ext; + ext.push_back(make_pair("Alla banfiler", "*.xml;*.csv;*.txt")); + ext.push_back(make_pair("Banor, OCAD semikolonseparerat", "*.csv;*.txt")); + ext.push_back(make_pair("Banor, IOF (xml)", "*.xml")); + + string file=gdi.browseForOpen(ext, "csv"); + + if (file.length()>0) + gdi.setText("FileName", file); + } + else if (bi.id=="Print") { + gdi.print(oe); + } + else if (bi.id=="PDF") { + vector< pair > ext; + ext.push_back(make_pair("Portable Document Format (PDF)", "*.pdf")); + + int index; + string file=gdi.browseForSave(ext, "pdf", index); + + if (!file.empty()) { + pdfwriter pdf; + pdf.generatePDF(gdi, gdi.toWide(file), "Report", "MeOS", gdi.getTL()); + gdi.openDoc(file.c_str()); + } + } + else if (bi.id == "WithLoops") { + bool w = gdi.isChecked(bi.id); + gdi.setInputStatus("CommonControl", w); + if (w && gdi.getTextNo("CommonControl") == 0) + gdi.selectFirstItem("CommonControl"); + } + else if (bi.id == "Shorten") { + bool w = gdi.isChecked(bi.id); + gdi.setInputStatus("ShortCourse", w); + if (w) { + ListBoxInfo clb; + if (!gdi.getSelectedItem("ShortCoursse", clb) || clb.data <= 0) + gdi.selectFirstItem("CommonControl"); + } + } + else if (bi.id == "ExportCourses") { + int FilterIndex=0; + vector< pair > ext; + ext.push_back(make_pair("IOF CourseData, version 3.0 (xml)", "*.xml")); + string save = gdi.browseForSave(ext, "xml", FilterIndex); + if (save.length()>0) { + IOF30Interface iof30(oe, false); + xmlparser xml(gdi.getEncoding() == ANSI ? 0 : &gdi); + xml.openOutput(save.c_str(), false); + iof30.writeCourses(xml); + xml.closeOut(); + } + } + else if (bi.id=="ImportCourses") { + setupCourseImport(gdi, CourseCB); + } + else if (bi.id=="DoImportCourse") { + string filename = gdi.getText("FileName"); + if (filename.empty()) + return 0; + gdi.disableInput("DoImportCourse"); + gdi.disableInput("Cancel"); + gdi.disableInput("BrowseCourse"); + gdi.disableInput("AddClasses"); + + try { + TabCourse::runCourseImport(gdi, filename, oe, gdi.isChecked("AddClasses")); + } + catch (std::exception &) { + gdi.enableInput("DoImportCourse"); + gdi.enableInput("Cancel"); + gdi.enableInput("BrowseCourse"); + gdi.enableInput("AddClasses"); + throw; + } + gdi.addButton("Cancel", "OK", CourseCB); + gdi.dropLine(); + gdi.refresh(); + } + else if (bi.id == "DrawCourse") { + save(gdi, true); + pCourse crs = oe->getCourse(courseId); + if (crs == 0) + throw meosException("Ingen bana vald."); + vector cls; + oe->getClasses(cls, true); + string clsNames; + bool hasAsked = false; + courseDrawClasses.clear(); + for (size_t k = 0; k < cls.size(); k++) { + if (cls[k]->getCourseId() != courseId) + continue; + if (!hasAsked &&oe->classHasResults(cls[k]->getId())) { + hasAsked = true; + if (!gdi.ask("warning:drawresult")) + return 0; + } + courseDrawClasses.push_back(ClassDrawSpecification(cls[k]->getId(), 0, -1, -1, 0)); + if (!clsNames.empty()) + clsNames += ", "; + clsNames += cls[k]->getName(); + } + if (courseDrawClasses.empty()) + throw meosException("Ingen klass använder banan."); + + gdi.clearPage(false); + gdi.addString("", boldLarge, "Lotta klasser med banan X#" + crs->getName()); + gdi.addStringUT(0, clsNames); + gdi.dropLine(); + gdi.pushX(); + + gdi.fillRight(); + int firstStart = 3600; + int interval = 2*60; + int vac = 1; + gdi.addInput("FirstStart", oe->getAbsTime(firstStart), 10, 0, "Första start:"); + gdi.addInput("Interval", formatTime(interval), 10, 0, "Startintervall (min):"); + gdi.addInput("Vacances", itos(vac), 10, 0, "Antal vakanser:"); + gdi.fillDown(); + gdi.popX(); + gdi.dropLine(3); + gdi.addSelection("Method", 200, 200, 0, "Metod:"); + gdi.addItem("Method", lang.tl("Lottning"), DMRandom); + gdi.addItem("Method", lang.tl("SOFT-lottning"), DMSOFT); + + gdi.selectItemByData("Method", getDefaultMethod()); + gdi.dropLine(0.9); + gdi.fillRight(); + gdi.addButton("DoDrawCourse", "Lotta", CourseCB).setDefault(); + gdi.addButton("Cancel", "Avbryt", CourseCB).setCancel(); + gdi.dropLine(); + gdi.fillDown(); + gdi.refresh(); + } + else if (bi.id == "DoDrawCourse") { + string firstStart = gdi.getText("FirstStart"); + string minInterval = gdi.getText("Interval"); + int vacances = gdi.getTextNo("Vacances"); + int fs = oe->getRelativeTime(firstStart); + int iv = convertAbsoluteTimeMS(minInterval); + DrawMethod method = DrawMethod(gdi.getSelectedItem("Method").first); + courseDrawClasses[0].firstStart = fs; + courseDrawClasses[0].vacances = vacances; + courseDrawClasses[0].interval = iv; + + for (size_t k = 1; k < courseDrawClasses.size(); k++) { + vector r; + oe->getRunners(courseDrawClasses[k-1].classID, 0, r, false); + int vacDelta = vacances; + for (size_t i = 0; i < r.size(); i++) { + if (r[i]->isVacant()) + vacDelta--; + } + + courseDrawClasses[k].firstStart = courseDrawClasses[k-1].firstStart + (r.size() + vacDelta) * iv; + courseDrawClasses[k].vacances = vacances; + courseDrawClasses[k].interval = iv; + } + + oe->drawList(courseDrawClasses, method == DMSOFT, 1, oEvent::drawAll); + + oe->addAutoBib(); + + gdi.clearPage(false); + gdi.addButton("Cancel", "Återgå", CourseCB); + + oListParam par; + oListInfo info; + par.listCode = EStdStartList; + for (size_t k=0; kgenerateListInfo(par, gdi.getLineHeight(), info); + oe->generateList(gdi, false, info, true); + gdi.refresh(); + } + else if (bi.id=="Add") { + if (courseId>0) { + string ctrl = gdi.getText("Controls"); + string name = gdi.getText("Name"); + pCourse pc = oe->getCourse(courseId); + if (pc && !name.empty() && !ctrl.empty() && pc->getControlsUI() != ctrl) { + if (name == pc->getName()) { + // Make name unique if same name + int len = name.length(); + if (len > 2 && (isdigit(name[len-1]) || isdigit(name[len-2]))) { + ++name[len-1]; // course 1 -> course 2, course 1a -> course 1b + } + else + name += " 2"; + } + if (gdi.ask("Vill du lägga till banan 'X' (Y)?#" + name + "#" + ctrl)) { + pc = oe->addCourse(name); + courseId = pc->getId(); + gdi.setText("Name", name); + save(gdi, 1); + return true; + } + } + save(gdi, 1); + } + pCourse pc = oe->addCourse(oe->getAutoCourseName()); + pc->synchronize(); + oe->fillCourses(gdi, "Courses"); + selectCourse(gdi, pc); + gdi.setInputFocus("Name", true); + addedCourse = true; + } + else if (bi.id=="Remove"){ + DWORD cid = courseId; + if (cid==0) + throw meosException("Ingen bana vald."); + + if (oe->isCourseUsed(cid)) + gdi.alert("Banan används och kan inte tas bort."); + else + oe->removeCourse(cid); + + oe->fillCourses(gdi, "Courses"); + + selectCourse(gdi, 0); + } + else if (bi.id == "FirstAsStart" || bi.id == "LastAsFinish") { + refreshCourse(gdi.getText("Controls"), gdi); + } + else if (bi.id=="Cancel"){ + LoadPage("Banor"); + } + } + else if (type==GUI_LISTBOX){ + ListBoxInfo bi=*(ListBoxInfo *)data; + + if (bi.id=="Courses") { + if (gdi.isInputChanged("")) + save(gdi, 0); + + pCourse pc=oe->getCourse(bi.data); + selectCourse(gdi, pc); + addedCourse = false; + } + else if (bi.id=="Rogaining") { + string t; + t = gdi.getText("TimeLimit"); + if (!t.empty() && t != "-") + time_limit = t; + t = gdi.getText("PointLimit"); + if (!t.empty()) + point_limit = t; + t = gdi.getText("PointReduction"); + if (!t.empty()) + point_reduction = t; + + string tl, pl, pr; + if (bi.data == 1) { + tl = time_limit; + pr = point_reduction; + } + else if (bi.data == 2) { + pl = point_limit; + } + + gdi.setInputStatus("TimeLimit", !tl.empty()); + gdi.setText("TimeLimit", tl); + + gdi.setInputStatus("PointLimit", !pl.empty()); + gdi.setText("PointLimit", pl); + + gdi.setInputStatus("PointReduction", !pr.empty()); + gdi.setInputStatus("ReductionPerMinute", !pr.empty()); + gdi.setText("PointReduction", pr); + + } + } + else if (type == GUI_INPUT) { + InputInfo ii=*(InputInfo *)data; + if (ii.id == "Controls") { + int current = gdi.getTextNo("CommonControl"); + fillCourseControls(gdi, ii.text); + if (gdi.isChecked("WithLoops") && current != 0) + gdi.selectItemByData("CommonControl", current); + } + } + else if (type == GUI_INPUTCHANGE) { + InputInfo &ii=*(InputInfo *)data; + + if (ii.id == "Controls") { + refreshCourse(ii.text, gdi); + } + } + else if (type==GUI_CLEAR) { + if (gdi.hasData("EditLengths")) { + saveLegLengths(gdi); + return true; + } + if (courseId>0) + save(gdi, 0); + + return true; + } + return 0; +} + +bool TabCourse::loadPage(gdioutput &gdi) { + oe->checkDB(); + gdi.selectTab(tabId); + + DWORD ClassID=0, RunnerID=0; + + time_limit = "01:00:00"; + point_limit = "10"; + point_reduction = "1"; + + gdi.getData("ClassID", ClassID); + gdi.getData("RunnerID", RunnerID); + + gdi.clearPage(false); + + gdi.setData("ClassID", ClassID); + gdi.setData("RunnerID", RunnerID); + gdi.addString("", boldLarge, "Banor"); + gdi.pushY(); + + gdi.fillDown(); + gdi.addListBox("Courses", 250, 360, CourseCB, "Banor (antal kontroller)").isEdit(false).ignore(true); + gdi.setTabStops("Courses", 240); + + oe->fillCourses(gdi, "Courses"); + + gdi.dropLine(0.7); + gdi.pushX(); + gdi.addString("", boldText, "Funktioner"); + gdi.dropLine(); + gdi.fillRight(); + gdi.addButton("ImportCourses", "Importera från fil...", CourseCB); + gdi.addButton("ExportCourses", "Exportera...", CourseCB); + gdi.popX(); + gdi.dropLine(2.5); + gdi.addButton("DrawCourse", "Lotta starttider..", CourseCB); + gdi.disableInput("DrawCourse"); + gdi.newColumn(); + gdi.fillDown(); + + gdi.popY(); + + gdi.addString("", 10, "help:25041"); + + gdi.dropLine(0.5); + gdi.pushX(); + gdi.fillRight(); + gdi.addInput("Name", "", 20, 0, "Namn:"); + gdi.fillDown(); + gdi.addInput("NumberMaps", "", 6, 0, "Antal kartor:"); + + gdi.popX(); + + vector allCrs; + oe->getCourses(allCrs); + size_t mlen = 0; + for (size_t k = 0; k < allCrs.size(); k++) { + mlen = max(allCrs[k]->getControlsUI().length()/2+5, mlen); + } + + gdi.addInput("Controls", "", max(48u, mlen), CourseCB, "Kontroller:"); + gdi.dropLine(0.3); + gdi.addString("CourseExpanded", 0, "...").setColor(colorDarkGreen); + gdi.dropLine(0.5); + gdi.addString("", 10, "help:12662"); + gdi.dropLine(1); + + gdi.fillRight(); + gdi.addInput("Climb", "", 8, 0, "Climb (m):"); + gdi.addInput("Length", "", 8, 0, "Längd (m):"); + gdi.dropLine(0.9); + gdi.fillDown(); + gdi.addButton("LegLengths", "Redigera sträcklängder...", CourseCB).isEdit(true); + gdi.dropLine(0.5); + gdi.popX(); + + gdi.fillRight(); + gdi.addCheckbox("FirstAsStart", "Använd första kontrollen som start", CourseCB); + gdi.fillDown(); + gdi.addCheckbox("LastAsFinish", "Använd sista kontrollen som mål", CourseCB); + gdi.popX(); + + gdi.fillRight(); + gdi.addCheckbox("WithLoops", "Bana med slingor", CourseCB); + gdi.setCX(gdi.getCX()+ gdi.scaleLength(20)); + gdi.addString("", 0, "Varvningskontroll:"); + gdi.fillDown(); + gdi.dropLine(-0.2); + gdi.addSelection("CommonControl", 50, 200, 0, "", "En bana med slingor tillåter deltagaren att ta slingorna i valfri ordning"); + + gdi.dropLine(0.2); + gdi.popX(); + + gdi.fillRight(); + gdi.addCheckbox("Shorten", "Med avkortning", CourseCB); + gdi.setCX(gdi.getCX()+ gdi.scaleLength(20)); + gdi.addString("", 0, "Avkortad banvariant:"); + gdi.dropLine(-0.2); + gdi.addSelection("ShortCourse", 150, 200, 0, "", "info_shortening"); + gdi.addString("Shortens", 0, ""); + + gdi.fillDown(); + + gdi.dropLine(2.5); + gdi.popX(); + + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Rogaining)) { + RECT rc; + rc.top = gdi.getCY() -5; + rc.left = gdi.getCX(); + gdi.setCX(gdi.getCX()+gdi.scaleLength(10)); + + gdi.addString("", 1, "Rogaining"); + gdi.dropLine(0.5); + gdi.fillRight(); + gdi.addSelection("Rogaining", 120, 80, CourseCB); + gdi.addItem("Rogaining", lang.tl("Ingen rogaining"), 0); + gdi.addItem("Rogaining", lang.tl("Tidsgräns"), 1); + gdi.addItem("Rogaining", lang.tl("Poänggräns"), 2); + + gdi.setCX(gdi.getCX()+gdi.scaleLength(20)); + gdi.dropLine(-0.8); + int cx = gdi.getCX(); + gdi.addInput("PointLimit", "", 8, 0, "Poänggräns:").isEdit(false); + gdi.addInput("TimeLimit", "", 8, 0, "Tidsgräns:").isEdit(false); + gdi.addInput("PointReduction", "", 8, 0, "Poängavdrag (per minut):").isEdit(false); + gdi.dropLine(3.5); + rc.right = gdi.getCX() + 5; + gdi.setCX(cx); + gdi.fillDown(); + gdi.addCheckbox("ReductionPerMinute", "Poängavdrag per påbörjad minut"); + + rc.bottom = gdi.getCY() + 5; + gdi.addRectangle(rc, colorLightBlue, true); + } + + gdi.popX(); + gdi.fillDown(); + gdi.dropLine(1); + gdi.addString("CourseUse", 0, "").setColor(colorDarkBlue); + gdi.dropLine(); + gdi.addString("CourseProblem", 1, "").setColor(colorRed); + gdi.dropLine(2); + gdi.fillRight(); + gdi.addButton("Save", "Spara", CourseCB, "help:save").setDefault(); + gdi.addButton("Remove", "Radera", CourseCB); + gdi.addButton("Add", "Ny bana", CourseCB); + gdi.disableInput("Remove"); + gdi.disableInput("Save"); + + selectCourse(gdi, oe->getCourse(courseId)); + gdi.setOnClearCb(CourseCB); + + gdi.refresh(); + + return true; +} + +void TabCourse::runCourseImport(gdioutput& gdi, const string &filename, + oEvent *oe, bool addClasses) { + csvparser csv; + if (csv.iscsv(filename.c_str())) { + gdi.fillRight(); + gdi.pushX(); + gdi.addString("", 0, "Importerar OCAD csv-fil..."); + gdi.refreshFast(); + + if (csv.ImportOCAD_CSV(*oe, filename.c_str(), addClasses)) { + gdi.addString("", 1, "Klart.").setColor(colorGreen); + } + else gdi.addString("", 0, "Operationen misslyckades.").setColor(colorRed); + gdi.popX(); + gdi.dropLine(2.5); + gdi.fillDown(); + } + else { + oe->importXML_EntryData(gdi, filename.c_str(), addClasses, false); + } + if (addClasses) { + // There is specific course-class matching inside the import of each format, + // that uses additional information. Here we try to match based on a generic approach. + vector cls; + vector crs; + oe->getClasses(cls, false); + oe->getCourses(crs); + + map name2Course; + map > course2Class; + for (size_t k = 0; k < crs.size(); k++) + name2Course[crs[k]->getName()] = crs[k]; + bool hasMissing = false; + for (size_t k = 0; k < cls.size(); k++) { + vector usedCrs; + cls[k]->getCourses(-1, usedCrs); + + if (usedCrs.empty()) { + map::iterator res = name2Course.find(cls[k]->getName()); + if (res != name2Course.end()) { + usedCrs.push_back(res->second); + if (cls[k]->getNumStages()==0) { + cls[k]->setCourse(res->second); + } + else { + for (size_t i = 0; igetNumStages(); i++) + cls[k]->addStageCourse(i, res->second->getId()); + } + } + else { + hasMissing = true; + } + } + + for (size_t j = 0; j < usedCrs.size(); j++) { + course2Class[usedCrs[j]->getId()].push_back(cls[k]); + } + } + + for (size_t k = 0; k < crs.size(); k++) { + pClass bestClass; + if (hasMissing && (bestClass = oe->getBestClassMatch(crs[k]->getName())) != 0) { + vector usedCrs; + bestClass->getCourses(-1, usedCrs); + if (usedCrs.empty()) { + course2Class[crs[k]->getId()].push_back(bestClass); + if (bestClass->getNumStages()==0) { + bestClass->setCourse(crs[k]); + } + else { + for (size_t i = 0; igetNumStages(); i++) + bestClass->addStageCourse(i, crs[k]->getId()); + } + } + } + } + + gdi.addString("", 1, "Klasser"); + int yp = gdi.getCY(); + int xp = gdi.getCX(); + int w = gdi.scaleLength(200); + for (size_t k = 0; k < cls.size(); k++) { + vector usedCrs; + cls[k]->getCourses(-1, usedCrs); + string c; + for (size_t j = 0; j < usedCrs.size(); j++) { + if (j>0) + c += ", "; + c += usedCrs[j]->getName(); + } + TextInfo &ci = gdi.addStringUT(yp, xp, 0, cls[k]->getName(), w); + if (c.empty()) { + c = MakeDash("-"); + ci.setColor(colorRed); + } + gdi.addStringUT(yp, xp + w, 0, c); + yp += gdi.getLineHeight(); + } + + gdi.dropLine(); + gdi.addString("", 1, "Banor"); + yp = gdi.getCY(); + for (size_t k = 0; k < crs.size(); k++) { + string c; + vector usedCls = course2Class[crs[k]->getId()]; + for (size_t j = 0; j < usedCls.size(); j++) { + if (j>0) + c += ", "; + c += usedCls[j]->getName(); + } + TextInfo &ci = gdi.addStringUT(yp, xp, 0, crs[k]->getName(), w); + if (c.empty()) { + c = MakeDash("-"); + ci.setColor(colorRed); + } + gdi.addStringUT(yp, xp + w, 0, c); + yp += gdi.getLineHeight(); + } + gdi.dropLine(); + } + + gdi.addButton(gdi.getWidth()+20, 45, gdi.scaleLength(120), + "Print", "Skriv ut...", CourseCB, + "Skriv ut listan.", true, false); + gdi.addButton(gdi.getWidth()+20, 75, gdi.scaleLength(120), + "PDF", "PDF...", CourseCB, + "Spara som PDF.", true, false); + + gdi.setWindowTitle(oe->getTitleName()); + oe->updateTabs(); + gdi.refresh(); +} + +void TabCourse::setupCourseImport(gdioutput& gdi, GUICALLBACK cb) { + + gdi.clearPage(true); + gdi.addString("", 2, "Importera banor/klasser"); + gdi.addString("", 0, "help:importcourse"); + gdi.dropLine(); + + gdi.fillRight(); + gdi.pushX(); + gdi.addInput("FileName", "", 48, 0, "Filnamn:"); + gdi.dropLine(); + gdi.fillDown(); + gdi.addButton("BrowseCourse", "Bläddra...", CourseCB); + + gdi.dropLine(0.5); + gdi.popX(); + + gdi.fillDown(); + gdi.addCheckbox("AddClasses", "Lägg till klasser", 0, true); + + gdi.dropLine(); + gdi.fillRight(); + gdi.addButton("DoImportCourse", "Importera", cb).setDefault(); + gdi.fillDown(); + gdi.addButton("Cancel", "Avbryt", cb).setCancel(); + gdi.setInputFocus("FileName"); + gdi.popX(); +} + +void TabCourse::fillCourseControls(gdioutput &gdi, const string &ctrl) { + vector nr; + oCourse::splitControls(ctrl, nr); + + vector< pair > item; + map used; + for (size_t k = 0; k < nr.size(); k++) { + pControl pc = oe->getControl(nr[k], false); + if (pc) { + if (pc->getStatus() == oControl::StatusOK) + ++used[pc->getFirstNumber()]; + } + else + ++used[nr[k]]; + } + + set added; + for (int i = 10; i > 0; i--) { + for (map::iterator it = used.begin(); it != used.end(); ++it) { + if (it->second >= i && !added.count(it->first)) { + added.insert(it->first); + item.push_back(make_pair(itos(it->first), it->first)); + } + } + } + + gdi.clearList("CommonControl"); + gdi.addItem("CommonControl", item); +} + +void TabCourse::fillOtherCourses(gdioutput &gdi, oCourse &crs) { + vector< pair > ac; + oe->fillCourses(ac, true); + set skipped; + skipped.insert(crs.getId()); + pCourse longer = crs.getLongerVersion(); + int iter = 20; + while (longer && --iter>0) { + skipped.insert(longer->getId()); + longer = longer->getLongerVersion(); + } + + vector< pair > out; + for (size_t k = 0; k < ac.size(); k++) { + if (!skipped.count(ac[k].second)) + out.push_back(ac[k]); + } + + gdi.clearList("ShortCourse"); + gdi.addItem("ShortCourse", out); +} + +void TabCourse::saveLegLengths(gdioutput &gdi) { + pCourse pc = oe->getCourse(courseId); + if (!pc) + return; + + pc->synchronize(false); + string lstr; + bool gotAny = false; + for (int i = 0; i <= pc->getNumControls(); i++) { + string t = trim(gdi.getText("c" + itos(i))); + if (t.empty()) + t = "0"; + else + gotAny = true; + + if (i == 0) + lstr = t; + else + lstr += ";" + t; + } + if (!gotAny) + lstr = ""; + + pc->importLegLengths(lstr, true); + pc->synchronize(true); +} + +DrawMethod TabCourse::getDefaultMethod() const { + int dm = oe->getPropertyInt("DefaultDrawMethod", DMSOFT); + if (dm == DMRandom) + return DMRandom; + else + return DMSOFT; +} + +void TabCourse::clearCompetitionData() { + courseId = 0; + addedCourse = false; +} + +void TabCourse::refreshCourse(const string &text, gdioutput &gdi) { + bool firstAsStart = gdi.isChecked("FirstAsStart"); + bool lastAsFinish = gdi.isChecked("LastAsFinish"); + string controls = encodeCourse(text, firstAsStart, lastAsFinish); + if (controls != gdi.getText("CourseExpanded")) + gdi.setText("CourseExpanded", controls, true); +} +string TabCourse::encodeCourse(const string &in, bool firstStart, bool lastFinish) { + vector newC; + oCourse::splitControls(in, newC); + string dash = MakeDash("-"); + string out; + out.reserve(in.length() * 2); + string bf; + for (size_t i = 0; i < newC.size(); ++i) { + if (i == 0) { + out += lang.tl("Start"); + if (firstStart) + out += "(" + itos(newC[i]) + ")"; + else + out += dash + formatControl(newC[i], bf); + + if (newC.size() == 1) { + out += dash + lang.tl("Mål"); + break; + } + continue; + } + else + out += dash; + + if (i+1 == newC.size()) { + if (lastFinish) + out += lang.tl("Mål") + "(" + itos(newC[i]) + ")"; + else + out += formatControl(newC[i], bf) + dash + lang.tl("Mål"); + } + else { + out += formatControl(newC[i], bf); + } + } + return out; +} + +const string &TabCourse::formatControl(int id, string &bf) const { + pControl ctrl = oe->getControl(id, false); + if (ctrl) { + bf = ctrl->getString(); + return bf; + } + else + return itos(id); +} diff --git a/code/TabCourse.h b/code/TabCourse.h new file mode 100644 index 0000000..174962b --- /dev/null +++ b/code/TabCourse.h @@ -0,0 +1,77 @@ +#pragma once +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "tabbase.h" + +struct ClassDrawSpecification; +enum DrawMethod; + +class TabCourse : + public TabBase +{ + int courseId; + /** canSwitchViewMode: 0 = no, 1 = yes, 2 = switching to legs */ + void save(gdioutput &gdi, int canSwitchViewMode); + int courseCB(gdioutput &gdi, int type, void *data); + bool addedCourse; + + string time_limit; + string point_limit; + string point_reduction; + + void fillCourseControls(gdioutput &gdi, const string &ctrl); + void fillOtherCourses(gdioutput &gdi, oCourse &crs); + + void saveLegLengths(gdioutput &gdi); + + vector courseDrawClasses; + + DrawMethod getDefaultMethod() const; + + string encodeCourse(const string &in, bool firstStart, bool lastFinish); + void refreshCourse(const string &text, gdioutput &gdi); + + const string &formatControl(int id, string &bf) const; + +protected: + void clearCompetitionData(); + + +public: + void selectCourse(gdioutput &gdi, pCourse pc); + + bool loadPage(gdioutput &gdi); + + const char * getTypeStr() const {return "TCourseTab";} + TabType getType() const {return TCourseTab;} + + TabCourse(oEvent *oe); + ~TabCourse(void); + + static void runCourseImport(gdioutput& gdi, const string &filename, + oEvent *oe, bool addClasses); + + static void setupCourseImport(gdioutput& gdi, GUICALLBACK cb); + + friend int CourseCB(gdioutput *gdi, int type, void *data); +}; diff --git a/code/TabList.cpp b/code/TabList.cpp new file mode 100644 index 0000000..dd57c0f --- /dev/null +++ b/code/TabList.cpp @@ -0,0 +1,2106 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" + +#include "resource.h" + +#include +#include + +#include "oEvent.h" +#include "xmlparser.h" +#include "gdioutput.h" +#include "csvparser.h" +#include "SportIdent.h" +#include "oListInfo.h" +#include "TabList.h" +#include "TabRunner.h" +#include "TabTeam.h" +#include "TabSI.h" +#include "TabAuto.h" +#include "meos_util.h" +#include +#include "classconfiginfo.h" +#include "metalist.h" +#include "gdifonts.h" +#include "listeditor.h" +#include "meosexception.h" +#include "pdfwriter.h" +#include "methodeditor.h" +#include "MeOSFeatures.h" +#include "liveresult.h" +#include + +const static int CUSTOM_OFFSET = 10; + +TabList::TabList(oEvent *poe):TabBase(poe) +{ + listEditor = 0; + methodEditor = 0; + clearCompetitionData(); +} + +TabList::~TabList(void) +{ + delete listEditor; + delete methodEditor; + listEditor = 0; + methodEditor = 0; + + for (size_t k = 0; k < liveResults.size(); k++) { + delete liveResults[k]; + liveResults[k] = 0; + } + liveResults.clear(); +} + +int ListsCB(gdioutput *gdi, int type, void *data); + +int ListsEventCB(gdioutput *gdi, int type, void *data) +{ + if (type!=GUI_EVENT) + return -1; + + TabList &tc = dynamic_cast(*gdi->getTabs().get(TListTab)); + + tc.rebuildList(*gdi); + + return 0; +} + +void TabList::rebuildList(gdioutput &gdi) +{ + if (!SelectedList.empty()) { + ButtonInfo bi; + bi.id=SelectedList; + noReEvaluate = true; + ListsCB(&gdi, GUI_BUTTON, &bi); + noReEvaluate = false; + } +} + +int openRunnerTeamCB(gdioutput *gdi, int type, void *data) +{ + if (type==GUI_LINK && data) { + TextInfo *ti = static_cast(data); + int id = ti->getExtraInt(); + + if (id != 0 && ti->id == "T" && gdi->canClear()) { + TabTeam &tt = dynamic_cast(*gdi->getTabs().get(TTeamTab)); + tt.loadPage(*gdi, id); + } + else if (id != 0 && ti->id == "R" && gdi->canClear()) { + TabRunner &tr = dynamic_cast(*gdi->getTabs().get(TRunnerTab)); + tr.loadPage(*gdi, id); + } + } + return 0; +} + +int NoStartRunnerCB(gdioutput *gdi, int type, void *data) +{ + if (type==GUI_LINK) + { + TextInfo *ti=(TextInfo *)data; + int id=atoi(ti->id.c_str()); + + TabList &tc = dynamic_cast(*gdi->getTabs().get(TListTab)); + pRunner p = tc.getEvent()->getRunner(id, 0); + + if (p){ + p->setStatus(StatusDNS, true, false); + p->synchronize(); + ti->callBack=0; + ti->highlight=false; + ti->active=false; + ti->color=RGB(255,0,0); + gdi->setText(ti->id, "Ej start", true); + } + } + return 0; +} + +int ListsCB(gdioutput *gdi, int type, void *data) +{ + TabList &tc = dynamic_cast(*gdi->getTabs().get(TListTab)); + + return tc.listCB(*gdi, type, data); +} + +int TabList::baseButtons(gdioutput &gdi, int extraButtons) { + gdi.addButton(gdi.getWidth()+20, 15, gdi.scaleLength(120), + "Cancel", ownWindow ? "Stäng" : "Återgå", ListsCB, "", true, false); + + gdi.addButton(gdi.getWidth()+20, 18+gdi.getButtonHeight(), gdi.scaleLength(120), + "Print", "Skriv ut...", ListsCB, "Skriv ut listan.", true, false); + gdi.addButton(gdi.getWidth()+20, 21+2*gdi.getButtonHeight(), gdi.scaleLength(120), + "HTML", "Webb...", ListsCB, "Spara för webben.", true, false); + gdi.addButton(gdi.getWidth()+20, 24+3*gdi.getButtonHeight(), gdi.scaleLength(120), + "PDF", "PDF...", ListsCB, "Spara som PDF.", true, false); + gdi.addButton(gdi.getWidth()+20, 27+4*gdi.getButtonHeight(), gdi.scaleLength(120), + "Copy", "Kopiera", ListsCB, "Kopiera till urklipp.", true, false); + + int ypos = 30+5*gdi.getButtonHeight(); + + if (extraButtons == 1) { + int w, h; + gdi.addButton(gdi.getWidth()+20, ypos, gdi.scaleLength(120), + "EditInForest", "edit_in_forest", ListsCB, "", true, false).getDimension(gdi, w, h); + ypos += h + 3; + } + + return ypos; +} + +void TabList::generateList(gdioutput &gdi) +{ + if (currentList.getListCode() == EFixedLiveResult) { + liveResult(gdi, currentList); + + int baseY = 15; + if (!gdi.isFullScreen()) { + gdi.addButton(gdi.getWidth()+20, baseY, gdi.scaleLength(120), + "Cancel", ownWindow ? "Stäng" : "Återgå", ListsCB, "", true, false); + + baseY += 3 + gdi.getButtonHeight(); + gdi.addButton(gdi.getWidth()+20, baseY, gdi.scaleLength(120), + "FullScreenLive", "Fullskärm", ListsCB, "Visa listan i fullskärm", true, false); + } + SelectedList="GeneralList"; + + return; + } + + DWORD storedWidth = 0; + int oX = 0; + int oY = 0; + if (gdi.hasData("GeneralList")) { + if (!currentList.needRegenerate(*oe)) + return; + gdi.takeShownStringsSnapshot(); + oX=gdi.GetOffsetX(); + oY=gdi.GetOffsetY(); + gdi.getData("GeneralList", storedWidth); + gdi.restoreNoUpdate("GeneralList"); + } + else + gdi.clearPage(false); + + gdi.setRestorePoint("GeneralList"); + + currentList.setCallback(ownWindow ? 0 : openRunnerTeamCB); + try { + oe->generateList(gdi, !noReEvaluate, currentList, false); + } + catch (const meosException &ex) { + string err = lang.tl(ex.what()); + gdi.addString("", 1, "List Error: X#" + err).setColor(colorRed); + } + + gdi.setOffset(oX, oY, false); + int currentWidth = gdi.getWidth(); + gdi.setData("GeneralList", currentWidth); + + if (!hideButtons) { + int extra = 0; + if (currentList.getListCode() == EFixedInForest) + extra = 1; + + int baseY = baseButtons(gdi, extra); + + if (!ownWindow) { + gdi.addButton(gdi.getWidth()+20, baseY, gdi.scaleLength(120), + "Window", "Eget fönster", ListsCB, "Öppna i ett nytt fönster.", true, false); + + gdi.addButton(gdi.getWidth()+20, baseY + 3 + 1*gdi.getButtonHeight(), gdi.scaleLength(120), + "Automatic", "Automatisera", ListsCB, "Skriv ut eller exportera listan automatiskt.", true, false); + + baseY += 2*(3+gdi.getButtonHeight()); + } + baseY += 3 + gdi.getButtonHeight(); + gdi.addButton(gdi.getWidth()+20, baseY, gdi.scaleLength(120), + "AutoScroll", "Automatisk skroll", ListsCB, "Rulla upp och ner automatiskt", true, false); + + baseY += 3 + gdi.getButtonHeight(); + gdi.addButton(gdi.getWidth()+20, baseY, gdi.scaleLength(120), + "FullScreen", "Fullskärm", ListsCB, "Visa listan i fullskärm", true, false); + + if (!currentList.getParam().saved && !oe->isReadOnly()) { + baseY += 3 + gdi.getButtonHeight(); + gdi.addButton(gdi.getWidth()+20, baseY, gdi.scaleLength(120), + "Remember", "Kom ihåg listan", ListsCB, "Spara den här listan som en favoritlista", true, false); + } + } + + gdi.registerEvent("DataUpdate", ListsEventCB); + gdi.setData("DataSync", 1); + if (currentList.needPunchCheck()) + gdi.setData("PunchSync", 1); + gdi.registerEvent("GeneralList", ListsCB); + gdi.setOnClearCb(ListsCB); + SelectedList="GeneralList"; + + if (abs(int(currentWidth - storedWidth)) < 5) { + gdi.refreshSmartFromSnapshot(true); + } + else + gdi.refresh(); +} + +int TabList::listCB(gdioutput &gdi, int type, void *data) +{ + int index; + if (type==GUI_BUTTON || type==GUI_EVENT) { + BaseInfo *tbi = 0; + ButtonInfo button; + EventInfo evnt; + if (type == GUI_BUTTON) { + button = *(ButtonInfo *)data; + tbi = &button; + } + else if (type == GUI_EVENT) { + evnt = *(EventInfo *)data; + tbi = &evnt; + } + else + throw 0; + + BaseInfo &bi=*tbi; + + if (bi.id=="Cancel") { + if (ownWindow) + gdi.closeWindow(); + else { + SelectedList = ""; + currentListType = EStdNone; + loadPage(gdi); + } + } + else if (bi.id=="Print") { + gdi.print(oe); + } + else if (bi.id=="HTML") { + vector< pair > ext; + ext.push_back(make_pair("Strukturerat webbdokument (html)", "*.html;*.htm")); + ext.push_back(make_pair("Formaterat webbdokument (html)", "*.html;*.htm")); + + string file=gdi.browseForSave(ext, "html", index); + + if (!file.empty()) { + if (index == 1) + gdi.writeTableHTML(gdi.toWide(file), oe->getName(), 0); + else { + assert(index == 2); + gdi.writeHTML(gdi.toWide(file), oe->getName(), 0); + } + gdi.openDoc(file.c_str()); + } + } + else if (bi.id=="Copy") { + ostringstream fout; + gdi.writeTableHTML(fout, "MeOS", true, 0); + string res = fout.str(); + gdi.copyToClipboard(res, false, ""); + } + else if (bi.id=="PDF") { + vector< pair > ext; + ext.push_back(make_pair("Portable Document Format (PDF)", "*.pdf")); + + string file=gdi.browseForSave(ext, "pdf", index); + + if (!file.empty()) { + pdfwriter pdf; + pdf.generatePDF(gdi, gdi.toWide(file), oe->getName() + ", " + currentList.getName(), oe->getDCI().getString("Organizer"), gdi.getTL()); + gdi.openDoc(file.c_str()); + } + } + else if (bi.id == "Window" || bi.id == "AutoScroll" || + bi.id == "FullScreen" || bi.id == "FullScreenLive") { + gdioutput *gdi_new; + TabList *tl_new = this; + if (!ownWindow) { + gdi_new = createExtraWindow(uniqueTag("list"), MakeDash("MeOS - " + currentList.getName()), gdi.getWidth() + 64 + gdi.scaleLength(120)); + if (gdi_new) { + TabList &tl = dynamic_cast(*gdi_new->getTabs().get(TListTab)); + tl.currentList = currentList; + tl.SelectedList = SelectedList; + tl.ownWindow = true; + tl.loadPage(*gdi_new); + tl_new = &tl; + SelectedList = ""; + currentList = oListInfo(); + loadPage(gdi); + } + } + else + gdi_new = &gdi; + + if (gdi_new && bi.id == "AutoScroll" || bi.id == "FullScreen") { + tl_new->hideButtons = true; + + gdi_new->alert("help:fullscreen"); + + if (bi.id == "FullScreen") + gdi_new->setFullScreen(true); + + int h = gdi_new->setHighContrastMaxWidth(); + tl_new->loadPage(*gdi_new); + double sec = 6.0; + double delta = h * 20. / (1000. * sec); + gdi_new->setAutoScroll(delta); + } + else if (gdi_new && bi.id == "FullScreenLive") { + gdi_new->setFullScreen(true); + tl_new->hideButtons = true; + tl_new->loadPage(*gdi_new); + } + } + else if (bi.id == "Remember") { + oListParam &par = currentList.getParam(); + string baseName = par.getDefaultName(); + baseName = oe->getListContainer().makeUniqueParamName(baseName); + par.setName(baseName); + oe->synchronize(false); + oe->getListContainer().addListParam(currentList.getParam()); + oe->synchronize(true); + gdi.removeControl(bi.id); + } + else if (bi.id == "ShowSaved") { + ListBoxInfo lbi; + if (gdi.getSelectedItem("SavedInstance", lbi)) { + oListParam &par = oe->getListContainer().getParam(lbi.data); + + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + generateList(gdi); + } + } + else if (bi.id == "RenameSaved") { + ListBoxInfo lbi; + if (gdi.getSelectedItem("SavedInstance", lbi)) { + const oListParam &par = oe->getListContainer().getParam(lbi.data); + gdi.clearPage(true); + gdi.addString("", boldLarge, "Döp om X#" + par.getName()); + gdi.setData("ParamIx", lbi.data); + gdi.dropLine(); + gdi.fillRight(); + gdi.addInput("Name", par.getName(), 36); + gdi.setInputFocus("Name", true); + gdi.addButton("DoRenameSaved", "Döp om", ListsCB); + gdi.addButton("Cancel", "Avbryt", ListsCB); + gdi.dropLine(3); + } + } + else if (bi.id == "DoRenameSaved") { + int ix = int(gdi.getData("ParamIx")); + oListParam &par = oe->getListContainer().getParam(ix); + string name = gdi.getText("Name"); + par.setName(name); + loadPage(gdi); + } + else if (bi.id == "MergeSaved") { + ListBoxInfo lbi; + if (gdi.getSelectedItem("SavedInstance", lbi)) { + //oe->getListContainer().mergeParam(0, lbi.data); + const oListParam &par = oe->getListContainer().getParam(lbi.data); + gdi.clearPage(true); + gdi.addString("", boldLarge, "Slå ihop X#" + par.getName()); + gdi.setData("ParamIx", lbi.data); + gdi.dropLine(); + gdi.addListBox("Merge", 350, 250, 0, "Slå ihop med:"); + vector < pair > cand; + oe->getListContainer().getMergeCandidates(lbi.data, cand); + gdi.addItem("Merge", cand); + gdi.addCheckbox("ShowTitle", "Visa rubrik mellan listorna", 0, false); + gdi.fillRight(); + gdi.addButton("DoMerge", "Slå ihop", ListsCB); + gdi.addButton("Cancel", "Avbryt", ListsCB); + gdi.dropLine(3); + } + } + else if (bi.id == "DoMerge") { + ListBoxInfo lbi; + if (gdi.getSelectedItem("Merge", lbi)) { + int mergeWidth = lbi.data; + int base = (int)gdi.getData("ParamIx"); + oe->synchronize(false); + bool showTitle = gdi.isChecked("ShowTitle"); + oe->getListContainer().mergeParam(mergeWidth, base, showTitle); + oe->synchronize(true); + loadPage(gdi); + } + return 0; + } + else if (bi.id == "SplitSaved") { + ListBoxInfo lbi; + if (gdi.getSelectedItem("SavedInstance", lbi)) { + oe->synchronize(false); + oe->getListContainer().split(lbi.data); + oe->synchronize(true); + loadPage(gdi); + return 0; + } + } + else if (bi.id == "RemoveSaved") { + ListBoxInfo lbi; + if (gdi.getSelectedItem("SavedInstance", lbi)) { + oe->synchronize(false); + oe->getListContainer().removeParam(lbi.data); + oe->synchronize(true); + loadPage(gdi); + } + return 0; + } + else if (bi.id == "Automatic") { + PrintResultMachine prm(60*10, currentList); + tabAutoAddMachinge(prm); + gdi.getTabs().get(TAutoTab)->loadPage(gdi); + } + else if (bi.id == "WideFormat") { + enableWideFormat(gdi, gdi.isChecked(bi.id)); + } + else if (bi.id=="SelectAll") { + set lst; + lst.insert(-1); + gdi.setSelection("ListSelection", lst); + + if (gdi.hasField("ResultType")) { + ListBoxInfo entry; + gdi.getSelectedItem("ResultType", entry); + gdi.setInputStatus("Generate", int(entry.data) >= 0); + } + } + else if (bi.id=="SelectNone") { + set lst; + gdi.setSelection("ListSelection", lst); + if (gdi.hasField("ResultType")) { + gdi.setInputStatus("Generate", false); + } + } + else if (bi.id=="CancelPS") { + gdi.getTabs().get(TabType(bi.getExtraInt()))->loadPage(gdi); + } + else if (bi.id=="SavePS") { + const char *ctype = (char *)gdi.getData("Type"); + saveExtraLines(*oe, ctype, gdi); + + if (gdi.hasField("SplitAnalysis")) { + int aflag = (gdi.isChecked("SplitAnalysis") ? 0 : 1) + (gdi.isChecked("Speed") ? 0 : 2) + + (gdi.isChecked("Results") ? 0 : 4); + oe->getDI().setInt("Analysis", aflag); + } + + + if (gdi.hasField("WideFormat")) { + bool wide = gdi.isChecked("WideFormat"); + oe->setProperty("WideSplitFormat", wide); + + if (wide && gdi.hasField("NumPerPage")) { + pair res = gdi.getSelectedItem("NumPerPage"); + if (res.second) + oe->setProperty("NumSplitsOnePage", res.first); + + int no = gdi.getTextNo("MaxWaitTime"); + if (no >= 0) + oe->setProperty("SplitPrintMaxWait", no); + } + } + gdi.getTabs().get(TabType(bi.getExtraInt()))->loadPage(gdi); + } + else if (bi.id == "PrinterSetup") { + ((TabSI *)gdi.getTabs().get(TSITab))->printerSetup(gdi); + } + else if (bi.id=="Generate") { + ListBoxInfo lbi; + bool advancedResults = false; + if (gdi.getSelectedItem("ListType", lbi)) { + currentListType=EStdListType(lbi.data); + } + else if (gdi.getSelectedItem("ResultType", lbi)) { + currentListType = getTypeFromResultIndex(lbi.data); + lastSelectedResultList = lbi.data; + advancedResults = true; + } + else return 0; + + oListParam par; + gdi.getSelectedItem("ResultSpecialTo", lbi); + par.useControlIdResultTo = lbi.data; + + gdi.getSelectedItem("ResultSpecialFrom", lbi); + par.useControlIdResultFrom = lbi.data; + + gdi.getSelectedItem("LegNumber", lbi); + par.setLegNumberCoded(lbi.data); + lastLeg = lbi.data; + + gdi.getSelection("ListSelection", par.selection); + if (advancedResults) + lastResultClassSelection = par.selection; + par.filterMaxPer = gdi.getTextNo("ClassLimit"); + par.inputNumber = gdi.getTextNo("InputNumber"); + lastInputNumber = itos(par.inputNumber); + + par.pageBreak = gdi.isChecked("PageBreak"); + par.listCode = (EStdListType)currentListType; + par.showInterTimes = gdi.isChecked("ShowInterResults"); + par.showSplitTimes = gdi.isChecked("ShowSplits"); + par.splitAnalysis = gdi.isChecked("SplitAnalysis"); + par.setCustomTitle(gdi.getText("Title")); + par.useLargeSize = gdi.isChecked("UseLargeSize"); + + lastLimitPer = par.filterMaxPer; + lastInterResult = par.showInterTimes; + lastSplitState = par.showSplitTimes; + lastLargeSize = par.useLargeSize; + + + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + + generateList(gdi); + gdi.refresh(); + } + else if (bi.id=="GeneralList") { + if (SelectedList=="GeneralList") { + generateList(gdi); + } + else + loadGeneralList(gdi); + } + else if (bi.id == "EditList") { + if (!listEditor) + listEditor = new ListEditor(oe); + + gdi.clearPage(false); + listEditor->show(gdi); + gdi.refresh(); + } + else if (bi.id == "EditMethod") { + if (!methodEditor) + methodEditor = new MethodEditor(oe); + + gdi.clearPage(false); + methodEditor->show(gdi); + gdi.refresh(); + } + else if (bi.id=="ResultIndividual") { + oe->sanityCheck(gdi, true); + oListParam par; + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + cnf.getIndividual(par.selection); + par.listCode = EStdResultList; + par.showInterTimes = true; + par.setLegNumberCoded(-1); + par.pageBreak = gdi.isChecked("PageBreak"); + par.splitAnalysis = gdi.isChecked("SplitAnalysis"); + + ListBoxInfo lbi; + gdi.getSelectedItem("ClassLimit", lbi); + par.filterMaxPer = lbi.data; + + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + generateList(gdi); + gdi.refresh(); + } + else if (bi.id=="ResultIndSplit") { + oe->sanityCheck(gdi, true); + oListParam par; + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + cnf.getIndividual(par.selection); + par.listCode = EStdResultList; + par.showSplitTimes = true; + par.setLegNumberCoded(-1); + par.pageBreak = gdi.isChecked("PageBreak"); + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + generateList(gdi); + gdi.refresh(); + } + else if (bi.id=="StartIndividual") { + oe->sanityCheck(gdi, false); + oListParam par; + par.listCode = EStdStartList; + par.setLegNumberCoded(-1); + par.pageBreak = gdi.isChecked("PageBreak"); + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + cnf.getIndividual(par.selection); + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + currentList.setCallback(openRunnerTeamCB); + generateList(gdi); + gdi.refresh(); + } + else if (bi.id=="StartClub") { + oe->sanityCheck(gdi, false); + oListParam par; + par.listCode = EStdClubStartList; + par.pageBreak = gdi.isChecked("PageBreak"); + par.setLegNumberCoded(-1); + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + //cnf.getIndividual(par.selection); + //cnf.getPatrol(par.selection); + + // oListInfo foo = currentList; + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + currentList.setCallback(openRunnerTeamCB); + //currentList.addList(foo); + generateList(gdi); + gdi.refresh(); + } + else if (bi.id=="ResultClub") { + oe->sanityCheck(gdi, false); + oListParam par; + par.listCode = EStdClubResultList; + par.pageBreak = gdi.isChecked("PageBreak"); + par.splitAnalysis = gdi.isChecked("SplitAnalysis"); + par.setLegNumberCoded(-1); + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + cnf.getIndividual(par.selection); + cnf.getPatrol(par.selection); + + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + currentList.setCallback(openRunnerTeamCB); + generateList(gdi); + gdi.refresh(); + } + else if (bi.id=="PreReport") { + SelectedList=bi.id; + gdi.clearPage(false); + oe->generatePreReport(gdi); + baseButtons(gdi, 0); + gdi.refresh(); + } + else if (bi.id=="InForestList") { + SelectedList=bi.id; + gdi.clearPage(false); + + gdi.registerEvent("DataUpdate", ListsEventCB); + gdi.setData("DataSync", 1); + gdi.registerEvent(bi.id, ListsCB); + + oe->generateInForestList(gdi, openRunnerTeamCB, NoStartRunnerCB); + baseButtons(gdi, 1); + gdi.refresh(); + } + else if (bi.id=="TeamStartList") { + oe->sanityCheck(gdi, false); + oListParam par; + par.listCode = EStdTeamStartList; + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + cnf.getRelay(par.selection); + par.pageBreak = gdi.isChecked("PageBreak"); + par.setLegNumberCoded(0); + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + currentList.setCallback(openRunnerTeamCB); + generateList(gdi); + gdi.refresh(); + } + else if (bi.id=="RaceNStart") { + oe->sanityCheck(gdi, false); + oListParam par; + int race = int(bi.getExtra()); + par.setLegNumberCoded(race); + par.listCode = EStdIndMultiStartListLeg; + par.pageBreak = gdi.isChecked("PageBreak"); + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + cnf.getRaceNStart(race, par.selection); + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + currentList.setCallback(openRunnerTeamCB); + generateList(gdi); + gdi.refresh(); + } + else if (bi.id=="LegNStart") { + oe->sanityCheck(gdi, false); + oListParam par; + par.pageBreak = gdi.isChecked("PageBreak"); + int race = bi.getExtraInt(); + par.setLegNumberCoded(race); + par.listCode = EStdTeamStartListLeg; + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + cnf.getLegNStart(race, par.selection); + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + currentList.setCallback(openRunnerTeamCB); + generateList(gdi); + gdi.refresh(); + } + else if (bi.id=="PatrolStartList") { + oe->sanityCheck(gdi, false); + oListParam par; + par.pageBreak = gdi.isChecked("PageBreak"); + par.listCode = EStdPatrolStartList; + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + cnf.getPatrol(par.selection); + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + currentList.setCallback(openRunnerTeamCB); + generateList(gdi); + gdi.refresh(); + } + else if (bi.id=="TeamResults") { + oe->sanityCheck(gdi, true); + oListParam par; + par.pageBreak = gdi.isChecked("PageBreak"); + par.splitAnalysis = gdi.isChecked("SplitAnalysis"); + par.listCode = EStdTeamResultListAll; + + par.filterMaxPer = gdi.getSelectedItem("ClassLimit").first; + + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + cnf.getRelay(par.selection); + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + generateList(gdi); + gdi.refresh(); + } + else if (bi.id=="MultiResults") { + oe->sanityCheck(gdi, true); + oListParam par; + par.pageBreak = gdi.isChecked("PageBreak"); + par.splitAnalysis = gdi.isChecked("SplitAnalysis"); + par.listCode = EStdIndMultiResultListAll; + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + cnf.getRaceNRes(0, par.selection); + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + generateList(gdi); + gdi.refresh(); + } + else if (bi.id=="RaceNRes") { + oe->sanityCheck(gdi, true); + oListParam par; + par.pageBreak = gdi.isChecked("PageBreak"); + par.splitAnalysis = gdi.isChecked("SplitAnalysis"); + int race = int(bi.getExtra()); + par.setLegNumberCoded(race); + par.listCode = EStdIndMultiResultListLeg; + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + cnf.getRaceNRes(race, par.selection); + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + currentList.setCallback(openRunnerTeamCB); + generateList(gdi); + gdi.refresh(); + } + else if (bi.id=="LegNResult") { + oe->sanityCheck(gdi, true); + oListParam par; + par.pageBreak = gdi.isChecked("PageBreak"); + par.splitAnalysis = gdi.isChecked("SplitAnalysis"); + int race = bi.getExtraInt(); + par.setLegNumberCoded(race); + par.filterMaxPer = gdi.getSelectedItem("ClassLimit").first; + par.listCode = oe->getListContainer().getType("legresult"); + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + cnf.getLegNRes(race, par.selection); + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + currentList.setCallback(openRunnerTeamCB); + generateList(gdi); + gdi.refresh(); + } + else if (bi.id=="PatrolResultList") { + oe->sanityCheck(gdi, false); + oListParam par; + par.pageBreak = gdi.isChecked("PageBreak"); + par.splitAnalysis = gdi.isChecked("SplitAnalysis"); + par.listCode = EStdPatrolResultList; + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + cnf.getPatrol(par.selection); + + par.filterMaxPer = gdi.getSelectedItem("ClassLimit").first; + + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + currentList.setCallback(openRunnerTeamCB); + generateList(gdi); + gdi.refresh(); + } + else if (bi.id=="RogainingResultList") { + oe->sanityCheck(gdi, true); + oListParam par; + par.pageBreak = gdi.isChecked("PageBreak"); + par.splitAnalysis = gdi.isChecked("SplitAnalysis"); + par.listCode = ERogainingInd; + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + cnf.getRogaining(par.selection); + + par.filterMaxPer = gdi.getSelectedItem("ClassLimit").first; + + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + currentList.setCallback(openRunnerTeamCB); + generateList(gdi); + gdi.refresh(); + } + else if (bi.id=="CourseReport") { + oe->sanityCheck(gdi, false); + + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + vector par; + + if (cnf.hasTeamClass()) { + par.push_back(oListParam()); + par.back().pageBreak = gdi.isChecked("PageBreak"); + par.back().listCode = ETeamCourseList; + cnf.getTeamClass(par.back().selection); + } + + if (cnf.hasIndividual()) { + par.push_back(oListParam()); + par.back().pageBreak = gdi.isChecked("PageBreak"); + par.back().listCode = EIndCourseList; + par.back().showInterTitle = false; + cnf.getIndividual(par.back().selection); + } + + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + generateList(gdi); + gdi.refresh(); + } + else if (bi.id=="RentedCards") { + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + oListParam par; + par.listCode = EStdRentedCard; + par.setLegNumberCoded(-1); + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + generateList(gdi); + gdi.refresh(); + } + else if (bi.id=="PriceList") { + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + oListParam par; + cnf.getIndividual(par.selection); + par.listCode = EIndPriceList; + par.filterMaxPer = gdi.getSelectedItem("ClassLimit").first; + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + generateList(gdi); + gdi.refresh(); + } + else if (bi.id=="MinuteStartList") { + oe->sanityCheck(gdi, false); + SelectedList=bi.id; + gdi.clearPage(false); + + gdi.registerEvent("DataUpdate", ListsEventCB); + gdi.setData("DataSync", 1); + gdi.registerEvent(bi.id, ListsCB); + + oe->generateMinuteStartlist(gdi); + baseButtons(gdi, 0); + gdi.refresh(); + } + else if (bi.id=="ResultList") { + settingsResultList(gdi); + } + else if (bi.id.substr(0, 7) == "Result:" || + bi.id.substr(0, 7) == "StartL:" || + bi.id.substr(0, 7) == "GenLst:") { + bool isReport = bi.id.substr(0, 7) == "GenLst:"; + bool allClasses = bi.getExtraInt() == 1; + bool rogaining = bi.getExtraInt() == 2; + oe->sanityCheck(gdi, bi.id.substr(0, 7) == "Result:"); + oListParam par; + par.listCode = oe->getListContainer().getType(bi.id.substr(7)); + par.pageBreak = gdi.isChecked("PageBreak"); + par.splitAnalysis = gdi.isChecked("SplitAnalysis"); + + par.filterMaxPer = gdi.getSelectedItem("ClassLimit").first; + + par.setLegNumberCoded(-1); + + if (rogaining) { + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + cnf.getRogaining(par.selection); + } + else if (!isReport && !allClasses) { + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + cnf.getIndividual(par.selection); + cnf.getPatrol(par.selection); + } + + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + currentList.setCallback(openRunnerTeamCB); + generateList(gdi); + gdi.refresh(); + } + else if (bi.id == "CustomList") { + oe->synchronize(); + oe->sanityCheck(gdi, false); + oListParam par; + int index = bi.getExtraInt(); + par.listCode = oe->getListContainer().getType(index); + par.pageBreak = gdi.isChecked("PageBreak"); + par.splitAnalysis = gdi.isChecked("SplitAnalysis"); + par.setLegNumberCoded(-1); + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + + oListInfo::EBaseType type = oe->getListContainer().getList(index).getListType(); + if (oListInfo::addRunners(type)) + cnf.getIndividual(par.selection); + if (oListInfo::addPatrols(type)) + cnf.getPatrol(par.selection); + if (oListInfo::addTeams(type)) + cnf.getTeamClass(par.selection); + + oe->generateListInfo(par, gdi.getLineHeight(), currentList); + currentList.setCallback(openRunnerTeamCB); + generateList(gdi); + gdi.refresh(); + } + else if (bi.id == "ImportCustom") { + + MetaListContainer &lc = oe->getListContainer(); + vector< pair > installedLists; + set installedId; + for (int k = 0; k < lc.getNumLists(); k++) { + if (lc.isExternal(k)) { + MetaList &mc = lc.getList(k); + installedLists.push_back(make_pair(mc.getListName(), k)); + mc.initUniqueIndex(); + if (!mc.getUniqueId().empty()) + installedId.insert(mc.getUniqueId()); + } + } + + vector< pair > > lists; + lc.enumerateLists(lists); + if (lists.empty() && installedLists.empty()) { + bi.id = "BrowseList"; + return listCB(gdi, GUI_BUTTON, &bi); + } + + + gdi.clearPage(false); + gdi.addString("", boldLarge, "Tillgängliga listor"); + int xx = gdi.getCX() + gdi.scaleLength(360); + int bx = gdi.getCX(); + if (!installedLists.empty()) { + gdi.dropLine(); + gdi.addString("", 1, "Listor i tävlingen"); + gdi.fillRight(); + gdi.pushX(); + for (size_t k = 0; k < installedLists.size(); k++) { + gdi.addStringUT(0, installedLists[k].first).setColor(colorDarkGreen); + gdi.setCX(xx); + gdi.addString("RemoveInstalled", 0, "Ta bort", ListsCB).setExtra(installedLists[k].second); + gdi.addString("EditInstalled", 0, "Redigera", ListsCB).setExtra(installedLists[k].second); + gdi.dropLine(); + if (k+1 < installedLists.size()) { + RECT rc = {bx, gdi.getCY(),gdi.getCX(),gdi.getCY()+1}; + gdi.addRectangle(rc, colorDarkBlue); + gdi.dropLine(0.1); + } + gdi.popX(); + } + gdi.fillDown(); + gdi.popX(); + } + + if (!lists.empty()) { + gdi.dropLine(2); + gdi.addString("", 1, "Installerbara listor"); + gdi.fillRight(); + gdi.pushX(); + + for (size_t k = 0; k < lists.size(); k++) { + gdi.addStringUT(0, lists[k].first, 0); + if (!installedId.count(lists[k].second.first)) { + gdi.setCX(xx); + gdi.addString("CustomList", 0, "Lägg till", ListsCB).setColor(colorDarkGreen).setExtra(k); + gdi.addString("RemoveList", 0, "Radera permanent", ListsCB).setColor(colorDarkRed).setExtra(k); + } + gdi.dropLine(); + + if (k+1 < lists.size() && !installedId.count(lists[k].second.first)) { + RECT rc = {bx, gdi.getCY(),gdi.getCX(),gdi.getCY()+1}; + gdi.addRectangle(rc, colorDarkBlue); + gdi.dropLine(0.1); + } + gdi.popX(); + + } + gdi.fillDown(); + gdi.popX(); + } + + gdi.dropLine(2); + gdi.fillRight(); + gdi.addButton("BrowseList", "Bläddra...", ListsCB); + gdi.addButton("Cancel", "Återgå", ListsCB).setCancel(); + gdi.refresh(); + } + else if (bi.id == "BrowseList") { + vector< pair > filter; + filter.push_back(make_pair("xml-data", "*.xml;*.meoslist")); + string file = gdi.browseForOpen(filter, "xml"); + if (!file.empty()) { + xmlparser xml(0); + xml.read(file); + xmlobject xlist = xml.getObject(0); + oe->synchronize(); + oe->getListContainer().load(MetaListContainer::ExternalList, xlist, false); + oe->synchronize(true); + + loadPage(gdi); + } + } + else if (bi.id == "ResultListFT_ONATT") { + vector< pair > ext; + ext.push_back(make_pair("Semikolonseparerad", "*.csv;*.txt")); + string file=gdi.browseForSave(ext, "txt", index); + if (!file.empty()) + oe->exportONattResults(gdi, file); + } + else if (bi.id == "EditInForest") { + TabRunner &rt = dynamic_cast(*gdi.getTabs().get(TRunnerTab)); + rt.showInForestList(gdi); + } + else if (bi.id == "SplitAnalysis") { + oe->setProperty("splitanalysis", gdi.isChecked(bi.id)); + } + else if (bi.id == "PageBreak") { + oe->setProperty("pagebreak", gdi.isChecked(bi.id)); + } + else if (bi.id == "ShowInterResults"){ + oe->setProperty("intertime", gdi.isChecked(bi.id)); + } + } + else if (type==GUI_LISTBOX) { + ListBoxInfo lbi=*(ListBoxInfo *)data; + + if (lbi.id == "NumPerPage") { + enableWideFormat(gdi, true); + } + else if (lbi.id == "SavedInstance") { + int ix = lbi.data; + bool split = oe->getListContainer().canSplit(ix); + gdi.setInputStatus("SplitSaved", split); + } + else if (lbi.id=="ListType"){ + EStdListType type = EStdListType(lbi.data); + selectGeneralList(gdi, type); + } + else if (lbi.id == "ListSelection") { + gdi.getSelection(lbi.id, lastClassSelection); + if (gdi.hasField("ResultType")) { + ListBoxInfo entry; + gdi.getSelectedItem("ResultType", entry); + gdi.setInputStatus("Generate", !lastClassSelection.empty() && int(entry.data) >= 0); + } + } + else if (lbi.id == "ClassLimit"){ + oe->setProperty("classlimit", lbi.data); + } + else if (lbi.id=="ResultType") { + setResultOptionsFromType(gdi, lbi.data); + } + else if (lbi.id=="ResultSpecialTo") { + oe->setProperty("ControlTo", lbi.data); + } + else if (lbi.id=="ResultSpecialFrom") { + oe->setProperty("ControlFrom", lbi.data); + } + } + else if (type==GUI_CLEAR) { + offsetY=gdi.GetOffsetY(); + offsetX=gdi.GetOffsetX(); + return true; + } + else if (type == GUI_LINK) { + TextInfo ti = *(TextInfo *)data; + if (ti.id == "CustomList") { + vector< pair > > lists; + oe->getListContainer().enumerateLists(lists); + size_t ix = ti.getExtraSize(); + if (ix < lists.size()) { + xmlparser xml(0); + xml.read(lists[ix].second.second); + xmlobject xlist = xml.getObject(0); + + oe->synchronize(false); + oe->getListContainer().load(MetaListContainer::ExternalList, xlist, false); + oe->synchronize(true); + oe->loadGeneralResults(true); + } + ButtonInfo bi; + bi.id = "ImportCustom"; + listCB(gdi, GUI_BUTTON, &bi); + + } + else if (ti.id == "RemoveList") { + vector< pair > > lists; + oe->getListContainer().enumerateLists(lists); + size_t ix = ti.getExtraSize(); + if (ix < lists.size()) { + if (gdi.ask("Vill du ta bort 'X'?#" + lists[ix].first)) { + DeleteFile(lists[ix].second.second.c_str()); + } + } + ButtonInfo bi; + bi.id = "ImportCustom"; + listCB(gdi, GUI_BUTTON, &bi); + } + else if (ti.id == "RemoveInstalled") { + int ix = ti.getExtraInt(); + if (gdi.ask("Vill du ta bort 'X'?#" + oe->getListContainer().getList(ix).getListName())) { + + oe->synchronize(false); + oe->getListContainer().removeList(ix); + oe->synchronize(true); + + ButtonInfo bi; + bi.id = "ImportCustom"; + listCB(gdi, GUI_BUTTON, &bi); + } + } + else if (ti.id == "EditInstalled") { + int ix = ti.getExtraInt(); + if (!listEditor) + listEditor = new ListEditor(oe); + gdi.clearPage(false); + listEditor->load(oe->getListContainer(), ix); + listEditor->show(gdi); + gdi.refresh(); + } + } + + return 0; +} + +void TabList::enableFromTo(oEvent &oe, gdioutput &gdi, bool from, bool to) { + vector< pair > d; + oe.fillControls(d, oEvent::CTCourseControl); + + if (from) { + gdi.enableInput("ResultSpecialFrom"); + vector< pair > ds; + ds.push_back(make_pair(lang.tl("Start"), 0)); + ds.insert(ds.end(), d.begin(), d.end()); + gdi.addItem("ResultSpecialFrom", ds); + if (!gdi.selectItemByData("ResultSpecialFrom", oe.getPropertyInt("ControlFrom", 0))) { + gdi.selectItemByData("ResultSpecialFrom", 0); // Fallback + } + } + else { + gdi.clearList("ResultSpecialFrom"); + gdi.disableInput("ResultSpecialFrom"); + } + + if (to) { + gdi.enableInput("ResultSpecialTo"); + gdi.addItem("ResultSpecialTo", d); + gdi.addItem("ResultSpecialTo", lang.tl("Mål"), 0); + if (!gdi.selectItemByData("ResultSpecialTo", oe.getPropertyInt("ControlTo", 0))) { + gdi.selectItemByData("ResultSpecialTo", 0); // Fallback + } + } + else { + gdi.clearList("ResultSpecialTo"); + gdi.disableInput("ResultSpecialTo"); + } +} + +void TabList::selectGeneralList(gdioutput &gdi, EStdListType type) +{ + oListInfo li; + oe->getListType(type, li); + oe->setProperty("ListType", type); + if (li.supportClasses) { + gdi.enableInput("ListSelection"); + oe->fillClasses(gdi, "ListSelection", oEvent::extraNone, oEvent::filterNone); + if (lastClassSelection.empty()) + lastClassSelection.insert(-1); + gdi.setSelection("ListSelection", lastClassSelection); + } + else { + gdi.clearList("ListSelection"); + gdi.disableInput("ListSelection"); + } + + gdi.setInputStatus("UseLargeSize", li.supportLarge); + gdi.setInputStatus("InputNumber", li.supportParameter); + + gdi.setInputStatus("SplitAnalysis", li.supportSplitAnalysis); + gdi.setInputStatus("ShowInterResults", li.supportInterResults); + gdi.setInputStatus("PageBreak", li.supportPageBreak); + gdi.setInputStatus("ClassLimit", li.supportClassLimit); + //gdi.setInputStatus("Title", li.supportCustomTitle); + + if (li.supportLegs) { + //gdi.enableInput("LegNumber"); + //oe->fillLegNumbers(gdi, "LegNumber", li.isTeamList(), true); + set clsUnused; + vector< pair > out; + oe->fillLegNumbers(clsUnused, li.isTeamList(), true, out); + gdi.addItem("LegNumber", out); + gdi.setInputStatus("LegNumber", !out.empty()); + } + else { + gdi.disableInput("LegNumber"); + gdi.clearList("LegNumber"); + } + + enableFromTo(*oe, gdi, li.supportFrom, li.supportTo); +} + +void TabList::makeClassSelection(gdioutput &gdi) { + gdi.fillDown(); + gdi.addListBox("ListSelection", 250, 300, ListsCB, "Urval:", "", true); + + gdi.pushX(); + gdi.fillRight(); + gdi.dropLine(0.5); + + gdi.addButton("SelectAll", "Välj allt", ListsCB); + gdi.addButton("SelectNone", "Välj inget", ListsCB); + gdi.popX(); +} + +void TabList::loadGeneralList(gdioutput &gdi) +{ + oe->sanityCheck(gdi, false); + gdi.fillDown(); + gdi.clearPage(false); + gdi.addString("", boldLarge, "Skapa generell lista"); + gdi.dropLine(0.8); + gdi.pushY(); + gdi.addSelection("ListType", 250, 300, ListsCB, "Lista:"); + oe->fillListTypes(gdi, "ListType", 0); + + makeClassSelection(gdi); + + gdi.setCX(gdi.scaleLength(290)+30); + gdi.pushX(); + gdi.popY(); + gdi.fillDown(); + gdi.addCheckbox("PageBreak", "Sidbrytning mellan klasser / klubbar", ListsCB, oe->getPropertyInt("pagebreak", 0)!=0); + + gdi.addCheckbox("ShowInterResults", "Visa mellantider", ListsCB, oe->getPropertyInt("intertime", 1)!=0, "Mellantider visas för namngivna kontroller."); + gdi.addCheckbox("SplitAnalysis", "Med sträcktidsanalys", ListsCB, oe->getPropertyInt("splitanalysis", 1)!=0); + gdi.addCheckbox("UseLargeSize", "Använd stor font", 0, lastLargeSize); + + if (lastLimitPer == -1) { + lastLimitPer = oe->getPropertyInt("classlimit", 0); + } + string lastClassLimit; + if (lastLimitPer > 0) + lastClassLimit = itos(lastLimitPer); + + gdi.addInput("ClassLimit", lastClassLimit, 5, 0, "Begränsa antal per klass:"); + gdi.dropLine(); + + makeFromTo(gdi); + /*gdi.fillRight(); + gdi.pushX(); + gdi.addSelection("ResultSpecialFrom", 140, 300, ListsCB, "Från kontroll:"); + gdi.disableInput("ResultSpecialFrom"); + + gdi.addSelection("ResultSpecialTo", 140, 300, ListsCB, "Till kontroll:"); + gdi.disableInput("ResultSpecialTo"); + + gdi.fillDown(); + gdi.popX(); + gdi.dropLine(3); + */ + gdi.addSelection("LegNumber", 140, 300, ListsCB, "Sträcka:"); + gdi.disableInput("LegNumber"); + + gdi.addInput("InputNumber", lastInputNumber, 5, 0, "Listparameter:", "Ett värde vars tolkning beror på listan."); + gdi.disableInput("InputNumber"); + gdi.popX(); + + if (oe->getPropertyInt("ListType", 0) > 0) { + gdi.selectItemByData("ListType", oe->getPropertyInt("ListType", 0)); + selectGeneralList(gdi, EStdListType(oe->getPropertyInt("ListType", 0))); + } + + + gdi.dropLine(3); + gdi.addInput("Title", "", 32, ListsCB, "Egen listrubrik:"); + + gdi.dropLine(); + gdi.fillRight(); + gdi.addButton("Generate", "Generera", ListsCB); + gdi.addButton("Cancel", "Avbryt", ListsCB); + + gdi.refresh(); +} + +static int getListIx(const map &tag2ListIx, + set &usedListIx, + const char *tag, int fallback) { + map::const_iterator res = tag2ListIx.find(tag); + if (res != tag2ListIx.end()) { + usedListIx.insert(res->second); + return res->second; + } + return fallback; +} + +void TabList::makeFromTo(gdioutput &gdi) { + gdi.fillRight(); + gdi.pushX(); + + gdi.addSelection("ResultSpecialFrom", 140, 300, ListsCB, "Från kontroll:"); + gdi.disableInput("ResultSpecialFrom"); + + gdi.addSelection("ResultSpecialTo", 140, 300, ListsCB, "Till kontroll:"); + gdi.disableInput("ResultSpecialTo"); + + gdi.popX(); + gdi.dropLine(3); +} + +void TabList::settingsResultList(gdioutput &gdi) +{ + lastFilledResultClassType = -1; + oe->sanityCheck(gdi, true); + gdi.fillDown(); + gdi.clearPage(false); + gdi.addString("", boldLarge, MakeDash("Resultatlista - inställningar")); + + //gdi.addSelection("ListType", 200, 300, ListsCB, "Lista"); + //oe->fillListTypes(gdi, "ListType", 0); + const int boxHeight = 380; + gdi.pushY(); + gdi.fillDown(); + gdi.addListBox("ListSelection", 200, boxHeight, ListsCB, "Urval:", "", true); + + gdi.dropLine(0.5); + gdi.fillRight(); + gdi.addButton("SelectAll", "Välj allt", ListsCB); + gdi.addButton("SelectNone", "Välj inget", ListsCB); + + gdi.popY(); + gdi.setCX(gdi.scaleLength(250)); + infoCX = gdi.getCX(); + infoCY = gdi.getCY() + gdi.scaleLength(boxHeight) + 2 *gdi.getLineHeight(); + + gdi.fillDown(); + gdi.addString("", 0, "Typ av lista:"); + gdi.pushX(); + gdi.fillRight(); + + gdi.addListBox("ResultType", 180, boxHeight, ListsCB); + + vector< pair > lists; + vector< pair > dlists; + const MetaListContainer &lc = oe->getListContainer(); + lc.getLists(dlists, false, true, !oe->hasTeam()); + set usedListIx; + map tag2ListIx; + for (size_t k = 0; k < dlists.size(); k++) { + int ix = dlists[k].second; + if (lc.isInternal(ix)) + tag2ListIx[lc.getTag(ix)] = dlists[k].second + CUSTOM_OFFSET; + } + lists.reserve(dlists.size() + 10); + + lists.push_back(make_pair(lang.tl("Individuell"), 1)); + + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Patrol)) + lists.push_back(make_pair(lang.tl("Patrull"), 2)); + + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Relay)) { + lists.push_back(make_pair(lang.tl("Stafett - total"), 3)); + lists.push_back(make_pair(lang.tl("Stafett - sammanställning"), 4)); + + lists.push_back(make_pair(lang.tl("Stafett - sträcka"), + getListIx(tag2ListIx, usedListIx, "legresult", 5))); + } + + lists.push_back(make_pair(lang.tl("Allmänna resultat"), 6)); + + size_t startIx = lists.size(); + for (size_t k = 0; k < dlists.size(); k++) { + int ix = dlists[k].second + CUSTOM_OFFSET; + if (usedListIx.count(ix)) + continue; + lists.push_back(make_pair(dlists[k].first, ix)); + } + sort(lists.begin() + startIx, lists.end()); + + gdi.addItem("ResultType", lists); + gdi.autoGrow("ResultType"); + + int lastSelectedResultListOK = -1; + for (size_t k = 0; k < lists.size(); k++) { + if (lastSelectedResultList == lists[k].second) + lastSelectedResultListOK = lists[k].second; + } + + if (lastSelectedResultListOK >= 0) + gdi.selectItemByData("ResultType", lastSelectedResultListOK); + + gdi.fillDown(); + gdi.pushX(); + gdi.addCheckbox("PageBreak", "Sidbrytning mellan klasser", ListsCB, oe->getPropertyInt("pagebreak", 0)!=0); + gdi.addCheckbox("ShowInterResults", "Visa mellantider", 0, lastInterResult, + "Mellantider visas för namngivna kontroller."); + gdi.addCheckbox("ShowSplits", "Lista med sträcktider", 0, lastSplitState); + gdi.addCheckbox("UseLargeSize", "Använd stor font", 0, lastLargeSize); + + gdi.fillRight(); + gdi.popX(); + gdi.addString("", 0, "Topplista, N bästa:"); + gdi.dropLine(-0.2); + + if (lastLimitPer == -1) { + lastLimitPer = oe->getPropertyInt("classlimit", 0); + } + string lastClassLimit; + if (lastLimitPer > 0) + lastClassLimit = itos(lastLimitPer); + + gdi.addInput("ClassLimit", lastClassLimit, 5, 0); + gdi.popX(); + gdi.dropLine(2); + gdi.addString("", 0, "Listparameter:"); + gdi.dropLine(-0.2); + gdi.addInput("InputNumber", lastInputNumber, 5, 0, "", "Ett värde vars tolkning beror på listan."); + gdi.disableInput("InputNumber"); + gdi.popX(); + gdi.dropLine(2); + + makeFromTo(gdi); + + gdi.addSelection("LegNumber", 140, 300, ListsCB, "Sträcka:"); + gdi.disableInput("LegNumber"); + gdi.popX(); + + gdi.dropLine(3); + gdi.addInput("Title", "", 32, ListsCB, "Egen listrubrik:"); + gdi.popX(); + + gdi.dropLine(3.5); + createListButtons(gdi); + + gdi.setRestorePoint("ListInfo"); + infoCY = max(infoCY, gdi.getCY()); + gdi.setCX(infoCX); + gdi.setCY(infoCY); + + if (lastSelectedResultListOK >= 0) + setResultOptionsFromType(gdi, lastSelectedResultListOK); + gdi.refresh(); +} + +void TabList::createListButtons(gdioutput &gdi) { + gdi.fillRight(); + gdi.addButton("Generate", "Skapa listan", ListsCB).setDefault(); + gdi.disableInput("Generate"); + gdi.addButton("Cancel", "Avbryt", ListsCB).setCancel(); + gdi.popX(); +} + +void checkWidth(gdioutput &gdi) { + int h,w; + gdi.getTargetDimension(w, h); + w = max (w, gdi.scaleLength(300)); + if (gdi.getCX() + gdi.scaleLength(100) > w) { + gdi.popX(); + gdi.dropLine(2.5); + } +} + +bool TabList::loadPage(gdioutput &gdi, const string &command) { + SelectedList = command; + offsetX = 0; + offsetY = 0; + return loadPage(gdi); +} + +bool TabList::loadPage(gdioutput &gdi) +{ + oe->checkDB(); + oe->synchronize(); + gdi.selectTab(tabId); + noReEvaluate = false; + gdi.clearPage(false); + if (SelectedList!="") { + ButtonInfo bi; + bi.id=SelectedList; + ListsCB(&gdi, GUI_BUTTON, &bi); + //gdi.SendCtrlMessage(SelectedList); + gdi.setOffset(offsetX, offsetY, false); + return 0; + } + + // Make sure all lists are loaded + oListInfo li; + oe->getListType(EStdNone, li); + + gdi.addString("", boldLarge, "Listor och sammanställningar"); + + gdi.addString("", 10, "help:30750"); + + ClassConfigInfo cnf; + oe->getClassConfigurationInfo(cnf); + gdi.pushX(); + if (!cnf.empty()) { + gdi.dropLine(1); + gdi.addString("", 1, "Startlistor"); + gdi.fillRight(); + if (cnf.hasIndividual()) { + gdi.addButton("StartIndividual", "Individuell", ListsCB); + checkWidth(gdi); + gdi.addButton("StartClub", "Klubbstartlista", ListsCB); + } + + for (size_t k = 0; k 0) { + checkWidth(gdi); + gdi.addButton("RaceNStart", "Lopp X#" + itos(k+1), ListsCB, + "Startlista ett visst lopp.").setExtra(k); + } + } + if (cnf.hasRelay()) { + checkWidth(gdi); + gdi.addButton("TeamStartList", "Stafett (sammanställning)", ListsCB); + } + if (cnf.hasPatrol()) { + checkWidth(gdi); + gdi.addButton("PatrolStartList", "Patrull", ListsCB); + } + for (size_t k = 0; k 0) { + checkWidth(gdi); + gdi.addButton("LegNStart", "Sträcka X#" + itos(k+1), ListsCB).setExtra(k); + } + } + + checkWidth(gdi); + gdi.addButton("MinuteStartList", "Minutstartlista", ListsCB); + + if (cnf.isMultiStageEvent()) { + checkWidth(gdi); + gdi.addButton("StartL:inputresult", "Input Results", ListsCB); + } + + gdi.dropLine(3); + gdi.fillDown(); + gdi.popX(); + gdi.addString("", 1, "Resultatlistor"); + gdi.fillRight(); + + if (cnf.hasIndividual()) { + gdi.addButton("ResultIndividual", "Individuell", ListsCB); + checkWidth(gdi); + gdi.addButton("ResultClub", "Klubbresultat", ListsCB); + checkWidth(gdi); + gdi.addButton("ResultIndSplit", "Sträcktider", ListsCB); + + checkWidth(gdi); + gdi.addButton("Result:latestresult", "Latest Results", ListsCB).setExtra(1); + + if (cnf.isMultiStageEvent()) { + checkWidth(gdi); + gdi.addButton("Result:stageresult", "Etappresultat", ListsCB); + + checkWidth(gdi); + gdi.addButton("Result:finalresult", "Slutresultat", ListsCB); + } + } + bool hasMulti = false; + for (size_t k = 0; k 0) { + checkWidth(gdi); + gdi.addButton("RaceNRes", "Lopp X#" + itos(k+1), ListsCB, + "Resultat för ett visst lopp.").setExtra(k); + hasMulti = true; + } + } + + if (hasMulti) { + checkWidth(gdi); + gdi.addButton("MultiResults", "Alla lopp", ListsCB, "Individuell resultatlista, sammanställning av flera lopp."); + } + if (cnf.hasRelay()) { + checkWidth(gdi); + gdi.addButton("TeamResults", "Stafett (sammanställning)", ListsCB); + } + if (cnf.hasPatrol()) { + checkWidth(gdi); + gdi.addButton("PatrolResultList", "Patrull", ListsCB); + } + for (map >::const_iterator it = cnf.legResult.begin(); it != cnf.legResult.end(); ++it) { + checkWidth(gdi); + gdi.addButton("LegNResult", "Sträcka X#" + itos(it->first+1), ListsCB).setExtra(it->first); + } + + if (cnf.hasRogaining()) { + checkWidth(gdi); + //gdi.addButton("RogainingResultList", "Rogaining", ListsCB); + gdi.addButton("Result:rogainingind", "Rogaining", ListsCB).setExtra(2); + } + + checkWidth(gdi); + gdi.addButton("ResultList", "Avancerat...", ListsCB); + + gdi.fillDown(); + gdi.popX(); + gdi.dropLine(3); + } + + + MetaListContainer &lc = oe->getListContainer(); + if (lc.getNumLists(MetaListContainer::ExternalList) > 0) { + gdi.addString("", 1, "Egna listor"); + + gdi.fillRight(); + gdi.pushX(); + + for (int k = 0; k < lc.getNumLists(); k++) { + if (lc.isExternal(k)) { + MetaList &mc = lc.getList(k); + checkWidth(gdi); + gdi.addButton("CustomList", mc.getListName(), ListsCB).setExtra(k); + } + } + } + + gdi.popX(); + gdi.dropLine(3); + gdi.fillDown(); + + vector< pair > savedParams; + lc.getListParam(savedParams); + if (savedParams.size() > 0) { + gdi.addString("", 1, "Sparade listval"); + gdi.fillRight(); + gdi.pushX(); + + gdi.addSelection("SavedInstance", 250, 200, ListsCB); + gdi.addItem("SavedInstance", savedParams); + gdi.autoGrow("SavedInstance"); + gdi.selectFirstItem("SavedInstance"); + gdi.addButton("ShowSaved", "Visa", ListsCB); + gdi.addButton("RenameSaved", "Döp om", ListsCB); + gdi.addButton("MergeSaved", "Slå ihop...", ListsCB); + gdi.addButton("SplitSaved", "Dela upp...", ListsCB); + + bool split = oe->getListContainer().canSplit(savedParams[0].second); + gdi.setInputStatus("SplitSaved", split); + + gdi.addButton("RemoveSaved", "Ta bort", ListsCB); + gdi.popX(); + gdi.dropLine(3); + gdi.fillDown(); + } + + gdi.addString("", 1, "Rapporter"); + + gdi.fillRight(); + gdi.pushX(); + + gdi.addButton("InForestList", "Kvar-i-skogen", ListsCB, "tooltip:inforest"); + if (cnf.hasIndividual()) { + gdi.addButton("PriceList", "Prisutdelningslista", ListsCB); + } + gdi.addButton("PreReport", "Kör kontroll inför tävlingen...", ListsCB); + checkWidth(gdi); + + if (cnf.hasMultiCourse) { + gdi.addButton("CourseReport", "Bantilldelning", ListsCB); + checkWidth(gdi); + + if (cnf.hasTeamClass()) { + gdi.addButton("GenLst:courseteamtable", "Gafflingar i tabellformat", ListsCB, + "Från den här listan kan man skapa etiketter att klistra på kartor"); + checkWidth(gdi); + } + } + + bool hasVac = false; + { + vector rr; + oe->getRunners(0, 0, rr, false); + for (size_t k = 0; k < rr.size(); k++) { + if (rr[k]->isVacant()) { + hasVac = true; + break; + } + } + } + + if (hasVac) { + gdi.addButton("GenLst:vacnacy", "Vakanser", ListsCB); + checkWidth(gdi); + } + + gdi.addButton("GenLst:courseusage", "Bananvändning", ListsCB); + checkWidth(gdi); + + gdi.addButton("GenLst:controloverview", "Kontroller", ListsCB); + checkWidth(gdi); + + gdi.addButton("GenLst:controlstatistics", "Control Statistics", ListsCB); + checkWidth(gdi); + + if (cnf.hasRentedCard) + gdi.addButton("RentedCards", "Hyrbricksrapport", ListsCB); + + gdi.popX(); + + gdi.dropLine(3); + gdi.addCheckbox("PageBreak", "Sidbrytning mellan klasser / klubbar", ListsCB, oe->getPropertyInt("pagebreak", 0)!=0); + gdi.addCheckbox("SplitAnalysis", "Med sträcktidsanalys", ListsCB, oe->getPropertyInt("splitanalysis", 1)!=0); + + gdi.popX(); + gdi.fillRight(); + gdi.dropLine(2); + gdi.addString("", 0, "Begränsning, antal visade per klass: "); + gdi.dropLine(-0.2); + gdi.addSelection("ClassLimit", 70, 350, ListsCB); + gdi.addItem("ClassLimit", lang.tl("Ingen"), 0); + for (int k = 1; k<=12+9; k++) { + int v = k; + if (v>12) + v=(v-11)*10; + gdi.addItem("ClassLimit", itos(v), v); + } + gdi.selectItemByData("ClassLimit", oe->getPropertyInt("classlimit", 0)); + + gdi.popX(); + + gdi.dropLine(3); + + gdi.addButton("GeneralList", "Alla listor...", ListsCB); + gdi.addButton("EditList", "Redigera lista...", ListsCB); + + gdi.addButton("ImportCustom", "Hantera egna listor...", ListsCB); + checkWidth(gdi); + gdi.addButton("EditMethod", "Result Modules...", ListsCB); + + //gdi.registerEvent("DataUpdate", ListsEventCB); + gdi.refresh(); + + gdi.setOnClearCb(ListsCB); + + offsetY=0; + offsetX=0; + gdi.refresh(); + return true; +} + +void TabList::enableWideFormat(gdioutput &gdi, bool wide) { + if (gdi.hasField("NumPerPage")) { + gdi.setInputStatus("NumPerPage", wide); + + bool needTime = gdi.getSelectedItem("NumPerPage").first != 1; + gdi.setInputStatus("MaxWaitTime", wide & needTime); + } +} + +void TabList::splitPrintSettings(oEvent &oe, gdioutput &gdi, bool setupPrinter, + TabType returnMode, PrintSettingsSelection type) +{ + if (!gdi.canClear()) + return; + + gdi.clearPage(false); + gdi.fillDown(); + if (type == Splits) + gdi.addString("", boldLarge, "Inställningar sträcktidsutskrift"); + else + gdi.addString("", boldLarge, "Inställningar startbevis"); + + gdi.dropLine(); + + gdi.fillRight(); + gdi.pushX(); + if (setupPrinter) { + gdi.addButton("PrinterSetup", "Skrivare...", ListsCB, "Skrivarinställningar"); + gdi.dropLine(0.3); + } + + + if (!oe.empty() && type == Splits) { + bool withSplitAnalysis = (oe.getDCI().getInt("Analysis") & 1) == 0; + bool withSpeed = (oe.getDCI().getInt("Analysis") & 2) == 0; + bool withResult = (oe.getDCI().getInt("Analysis") & 4) == 0; + + gdi.addCheckbox("SplitAnalysis", "Med sträcktidsanalys", 0, withSplitAnalysis); + gdi.addCheckbox("Speed", "Med km-tid", 0, withSpeed); + gdi.addCheckbox("Results", "Med resultat", 0, withResult); + + } + gdi.popX(); + gdi.fillDown(); + char *ctype = type == Splits ? "SPExtra" : "EntryExtra"; + customTextLines(oe, ctype, gdi); + + if (type == Splits) { + const bool wideFormat = oe.getPropertyInt("WideSplitFormat", 0) == 1; + gdi.addCheckbox("WideFormat", "Sträcktider i kolumner (för standardpapper)", ListsCB, wideFormat); + + if (returnMode == TSITab) { + int printLen = oe.getPropertyInt("NumSplitsOnePage", 3); + vector< pair > nsp; + for (size_t j = 1; j < 8; j++) + nsp.push_back(make_pair(itos(j), j)); + gdi.addSelection("NumPerPage", 90, 200, ListsCB, "Max antal brickor per sida"); + gdi.addItem("NumPerPage", nsp); + gdi.selectItemByData("NumPerPage", printLen); + + int maxWait = oe.getPropertyInt("SplitPrintMaxWait", 60); + gdi.addInput("MaxWaitTime", itos(maxWait), 8, 0, "Längsta tid i sekunder att vänta med utskrift"); + + enableWideFormat(gdi, wideFormat); + } + } + + + gdi.fillRight(); + gdi.setData("Type", ctype); + gdi.addButton("SavePS", "OK", ListsCB).setDefault().setExtra(returnMode); + gdi.addButton("CancelPS", "Avbryt", ListsCB).setCancel().setExtra(returnMode); + + gdi.refresh(); +} + +void TabList::saveExtraLines(oEvent &oe, const char *dataField, gdioutput &gdi) { + vector< pair > lines; + for (int k = 0; k < 5; k++) { + string row = "row"+itos(k); + string key = "font"+itos(k); + ListBoxInfo lbi; + gdi.getSelectedItem(key, lbi); + string r = gdi.getText(row); + lines.push_back(make_pair(r, lbi.data)); + } + oe.setExtraLines(dataField, lines); +} + +void TabList::customTextLines(oEvent &oe, const char *dataField, gdioutput &gdi) { + gdi.dropLine(2.5); + gdi.addString("", boldText, "Egna textrader"); + + vector< pair > fonts; + vector< pair > lines; + + MetaListPost::getAllFonts(fonts); + oe.getExtraLines(dataField, lines); + + for (int k = 0; k < 5; k++) { + gdi.fillRight(); + gdi.pushX(); + string row = "row"+itos(k); + gdi.addInput(row, "", 24); + string key = "font"+itos(k); + gdi.addSelection(key, 100, 100); + gdi.addItem(key, fonts); + if (lines.size() > size_t(k)) { + gdi.selectItemByData(key.c_str(), lines[k].second); + gdi.setText(row, lines[k].first); + } + else + gdi.selectFirstItem(key); + gdi.popX(); + gdi.fillDown(); + gdi.dropLine(2); + } +} + +void TabList::liveResult(gdioutput &gdi, oListInfo &li) { + if (liveResults.empty() || !liveResults.back()) { + liveResults.push_back(0); + LiveResult *lr = new LiveResult(oe); + liveResults.back() = lr; + } + liveResults.back()->showTimer(gdi, li); +} + +EStdListType TabList::getTypeFromResultIndex(int ix) const { + switch(ix) { + case 1: + return EStdResultList; + case 2: + return EStdPatrolResultList; + case 3: + return EStdTeamResultListAll; + case 4: + return EStdTeamResultList; + //case 5: + // return EStdTeamResultListLeg; + case 6: + return EGeneralResultList; + default: + if (ix >= CUSTOM_OFFSET) { + int index = ix - CUSTOM_OFFSET; + const string &uid = oe->getListContainer().getList(index).getUniqueId(); + return oe->getListContainer().getCodeFromUnqiueId(uid); + } + } + return EStdNone; +} + +void TabList::setResultOptionsFromType(gdioutput &gdi, int data) { + bool builtIn = data < CUSTOM_OFFSET; + string info, title; + bool hasResMod = false; + oListInfo li; + EStdListType type = getTypeFromResultIndex(data); + oe->getListType(type, li); + ListBoxInfo lbi; + if (gdi.getSelectedItem("LegNumber", lbi) && int(lbi.data) >= 0) + lastLeg = lbi.data; + + if (builtIn) { + enableFromTo(*oe, gdi, data==1 || data==6, data==1 || data==6); + + if (data==6) { + gdi.enableInput("UseLargeSize"); + } + else { + gdi.disableInput("UseLargeSize"); + gdi.check("UseLargeSize", false); + } + + gdi.setInputStatus("ShowInterResults", builtIn); + gdi.setInputStatus("ShowSplits", builtIn); + + + set clsUnused; + vector< pair > out; + + oe->fillLegNumbers(clsUnused, li.isTeamList(), true, out); + gdi.addItem("LegNumber", out); + gdi.setInputStatus("LegNumber", !out.empty()); + + if (!out.empty() && lastLeg >= 0) + gdi.selectItemByData("LegNumber", lastLeg); + + //oe->fillLegNumbers(gdi, "LegNumber", li.isTeamList(), true); + gdi.setInputStatus("InputNumber", false); + } + else { + + gdi.setInputStatus("UseLargeSize", li.supportLarge); + gdi.setInputStatus("InputNumber", li.supportParameter); + + //gdi.setInputStatus("SplitAnalysis", li.supportSplitAnalysis); + //gdi.setInputStatus("ShowInterResults", li.supportInterResults); + //gdi.setInputStatus("PageBreak", li.supportPageBreak); + //gdi.setInputStatus("ClassLimit", li.supportClassLimit); + + if (li.supportLegs) { + gdi.enableInput("LegNumber"); + //oe->fillLegNumbers(gdi, "LegNumber", li.isTeamList(), true); + set clsUnused; + vector< pair > out; + oe->fillLegNumbers(clsUnused, li.isTeamList(), true, out); + gdi.addItem("LegNumber", out); + if (!out.empty() && lastLeg >= 0) + gdi.selectItemByData("LegNumber", lastLeg); + gdi.setInputStatus("LegNumber", !out.empty()); + } + else { + ListBoxInfo lbi; + if (gdi.getSelectedItem("LegNumber", lbi) && int(lbi.data) >= 0) + lastLeg = lbi.data; + gdi.disableInput("LegNumber"); + gdi.clearList("LegNumber"); + } + + enableFromTo(*oe, gdi, li.supportFrom, li.supportTo); + } + + if (!builtIn) { + int index = data - CUSTOM_OFFSET; + const MetaList &ml = oe->getListContainer().getList(index); + info = ml.getListInfo(*oe); + title = ml.getListName(); + hasResMod = !ml.getResultModule().empty(); + } + + if (info.empty() && gdi.getText("ListInfo", true).empty()) { + // Do nothing + } + else { + gdi.restore("ListInfo", false); + gdi.setCX(infoCX); + gdi.setCY(infoCY); + + if (!info.empty()) { + gdi.setRestorePoint("ListInfo"); + gdi.fillDown(); + gdi.addString("", fontMediumPlus, title); + gdi.dropLine(0.3); + gdi.addString("ListInfo", 10, info); + gdi.dropLine(0.7); + } + //createListButtons(gdi); + gdi.refresh(); + } + oEvent::ClassFilter ct = li.isTeamList() ? oEvent::filterOnlyMulti : oEvent::filterNone; + set curSel; + gdi.getSelection("ListSelection", curSel); + + if (lastFilledResultClassType != ct) { + lastFilledResultClassType = ct; + lastResultClassSelection.insert(curSel.begin(), curSel.end()); + oe->fillClasses(gdi, "ListSelection", oEvent::extraNone, ct); + gdi.setSelection("ListSelection", lastResultClassSelection); + } + + gdi.setInputStatus("Generate", data >= 0 && !lastResultClassSelection.empty()); +} + +void TabList::clearCompetitionData() { + SelectedList = ""; + lastResultClassSelection.clear(); + + ownWindow = false; + hideButtons = false; + currentListType=EStdNone; + noReEvaluate = false; + + infoCX = 0; + infoCY = 0; + + lastLimitPer = -1; + lastInterResult = false; + lastSplitState = false; + lastLargeSize = false; + + lastSelectedResultList = -1; + lastLeg = 0; + lastFilledResultClassType = -1; + + delete listEditor; + delete methodEditor; + listEditor = 0; + methodEditor = 0; +} diff --git a/code/TabList.h b/code/TabList.h new file mode 100644 index 0000000..a17795c --- /dev/null +++ b/code/TabList.h @@ -0,0 +1,115 @@ +#pragma once +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ +#include "tabbase.h" +#include "oListInfo.h" + +class LiveResult; +class ListEditor; +class MethodEditor; + +class TabList : + public TabBase +{ +protected: + EStdListType currentListType; + oListInfo currentList; + string SelectedList; + string lastInputNumber; + int lastLimitPer; + bool lastInterResult; + bool lastSplitState; + bool lastLargeSize; + + + EStdListType getTypeFromResultIndex(int ix) const; + + int infoCX; + int infoCY; + + static void createListButtons(gdioutput &gdi); + + void generateList(gdioutput &gdi); + void selectGeneralList(gdioutput &gdi, EStdListType type); + + int offsetY; + int offsetX; + set lastClassSelection; + vector liveResults; + + int lastSelectedResultList; + set lastResultClassSelection; + int lastLeg; + int lastFilledResultClassType; + + void setResultOptionsFromType(gdioutput &gdi, int data); + + + bool hideButtons; + bool ownWindow; + ListEditor *listEditor; + MethodEditor *methodEditor; + + bool noReEvaluate; + + int baseButtons(gdioutput &gdi, int extraButtons); + +private: + // Not supported, copy works not. + TabList(const TabList &); + const TabList &operator = (const TabList &); + +public: + bool loadPage(gdioutput &gdi); + bool loadPage(gdioutput &gdi, const string &command); + + // Clear up competition specific settings + void clearCompetitionData(); + static void makeClassSelection(gdioutput &gdi); + static void makeFromTo(gdioutput &gdi); + static void enableFromTo(oEvent &oe, gdioutput &gdi, bool from, bool to); + void liveResult(gdioutput &gdi, oListInfo ¤tList); + + int listCB(gdioutput &gdi, int type, void *data); + void loadGeneralList(gdioutput &gdi); + void rebuildList(gdioutput &gdi); + void settingsResultList(gdioutput &gdi); + + enum PrintSettingsSelection { + Splits = 0, + StartInfo = 1, + }; + + static void splitPrintSettings(oEvent &oe, gdioutput &gdi, bool setupPrinter, TabType returnMode, PrintSettingsSelection type); + static void customTextLines(oEvent &oe, const char *dataField, gdioutput &gdi); + static void saveExtraLines(oEvent &oe, const char *dataField, gdioutput &gdi); + static void enableWideFormat(gdioutput &gdi, bool wide); + + ListEditor *getListeditor() const {return listEditor;} + + const char * getTypeStr() const {return "TListTab";} + TabType getType() const {return TListTab;} + + TabList(oEvent *oe); + ~TabList(void); + friend int ListsEventCB(gdioutput *gdi, int type, void *data); +}; diff --git a/code/TabMulti.cpp b/code/TabMulti.cpp new file mode 100644 index 0000000..ba117b1 --- /dev/null +++ b/code/TabMulti.cpp @@ -0,0 +1,50 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" + +#include "resource.h" + +#include +#include + +#include "oEvent.h" +#include "xmlparser.h" +#include "gdioutput.h" +#include "csvparser.h" +#include "SportIdent.h" + +#include "TabMulti.h" + +TabMulti::TabMulti(oEvent *poe):TabBase(poe) +{ +} + +TabMulti::~TabMulti(void) +{ +} + +bool TabMulti::loadPage(gdioutput &gdi) +{ + return true; +} + diff --git a/code/TabMulti.h b/code/TabMulti.h new file mode 100644 index 0000000..5041fd8 --- /dev/null +++ b/code/TabMulti.h @@ -0,0 +1,32 @@ +#pragma once +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ +#include "tabbase.h" + +class TabMulti : + public TabBase +{ +public: + bool loadPage(gdioutput &gdi); + TabMulti(oEvent *oe); + ~TabMulti(void); +}; diff --git a/code/TabRunner.cpp b/code/TabRunner.cpp new file mode 100644 index 0000000..d7f83ac --- /dev/null +++ b/code/TabRunner.cpp @@ -0,0 +1,2744 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" + +#include "resource.h" + +#include +#include + +#include "oEvent.h" +#include "xmlparser.h" +#include "gdioutput.h" +#include "gdiconstants.h" + +#include "csvparser.h" +#include "SportIdent.h" +#include "meos_util.h" +#include "TabRunner.h" +#include "TabTeam.h" +#include "TabList.h" +#include "Table.h" +#include +#include "oListInfo.h" +#include "TabSI.h" +#include "intkeymapimpl.hpp" +#include "meosexception.h" +#include "MeOSFeatures.h" + +int SportIdentCB(gdioutput *gdi, int type, void *data); + +TabRunner::TabRunner(oEvent *poe):TabBase(poe) +{ + clearCompetitionData(); +} + +TabRunner::~TabRunner(void) +{ +} + +void disablePunchCourse(gdioutput &gdi); + +bool TabRunner::loadPage(gdioutput &gdi, int runnerId) +{ + oe->checkDB(); + assert(this); + + if (currentMode == 5) { + this->runnerId = runnerId; + loadPage(gdi); + } + else { + currentMode = 0; + loadPage(gdi); + pRunner r=oe->getRunner(runnerId, 0); + if (r){ + selectRunner(gdi, r); + return true; + } + } + return false; +} + +void TabRunner::enableControlButtons(gdioutput &gdi, bool enable, bool vacant) +{ + if (enable) { + gdi.enableInput("Remove"); + gdi.enableInput("Save"); + gdi.enableInput("Undo"); + if (vacant) { + gdi.disableInput("Move", true); + gdi.disableInput("NoStart", true); + } + else { + gdi.enableInput("Move", true); + gdi.enableInput("NoStart", true); + } + } + else { + gdi.disableInput("Remove"); + gdi.disableInput("Save"); + gdi.disableInput("Undo"); + gdi.disableInput("Move", true); + gdi.disableInput("NoStart", true); + } +} + +void TabRunner::selectRunner(gdioutput &gdi, pRunner r) { + if (!r) { + runnerId=0; + gdi.setText("Name", ""); + gdi.setText("Bib", ""); + gdi.selectItemByData("RCourse", 0); + updateNumShort(gdi, 0, 0); + //Don't clear club and class + + + gdi.setText("CardNo", ""); + gdi.enableInput("Start"); + gdi.setText("Start", "-"); + gdi.enableInput("Finish"); + gdi.setText("Finish", "-"); + + gdi.setText("Time", "-"); + gdi.setText("Points", ""); + gdi.selectItemByData("Status", 0); + + gdi.clearList("Punches"); + gdi.clearList("Course"); + + gdi.selectItemByData("Runners", -1); + gdi.setInputFocus("Name", true); + if (gdi.hasField("MultiR")) { + gdi.clearList("MultiR"); + gdi.disableInput("MultiR"); + } + gdi.enableEditControls(false); + enableControlButtons(gdi, false, false); + disablePunchCourse(gdi); + + if (gdi.hasField("EditTeam")) + gdi.disableInput("EditTeam"); + gdi.setText("RunnerInfo", "", true); + + gdi.setText("TimeAdjust", "-"); + gdi.setText("PointAdjust", ""); + + if (gdi.hasField("StatusIn")) { + gdi.selectFirstItem("StatusIn"); + gdi.setText("PlaceIn", ""); + gdi.setText("TimeIn", "-"); + if (gdi.hasField("PointIn")) + gdi.setText("PointIn", ""); + } + + return; + } + + gdi.enableEditControls(true); + disablePunchCourse(gdi); + + pRunner parent=r->getMultiRunner(0); + + r->synchronizeAll(); + //r->apply(false); + vector mp; + r->evaluateCard(true, mp, 0, false); + /* + if (parent!=r) { + parent->synchronize(); + parent->apply(false); + }*/ + + gdi.selectItemByData("Runners", parent->getId()); + + runnerId=r->getId(); + + gdi.setText("Name", r->getNameRaw()); + string bib = r->getBib(); + + if (gdi.hasField("Bib")) { + gdi.setText("Bib", bib); + bool controlBib = r->getTeam() == 0 || (r->getClassRef() && r->getClassRef()->getBibMode() == BibFree); + gdi.setInputStatus("Bib", controlBib); + } + + gdi.setText("Club", r->getClub()); + + oe->fillClasses(gdi, "RClass", oEvent::extraNone, oEvent::filterNone); + gdi.addItem("RClass", lang.tl("Ingen klass"), 0); + gdi.selectItemByData("RClass", r->getClassId()); + + if (gdi.hasField("EditTeam")) { + gdi.setInputStatus("EditTeam", r->getTeam()!=0); + + if (r->getTeam()) { + gdi.setText("Team", r->getTeam()->getName()); + } + else + gdi.setText("Team", ""); + } + + gdi.setText("TimeAdjust", getTimeMS(r->getTimeAdjustment())); + gdi.setText("PointAdjust", -r->getPointAdjustment()); + +#ifdef _DEBUG + vector delta; + vector place; + vector after; + vector placeAcc; + vector afterAcc; + + r->getSplitAnalysis(delta); + r->getLegTimeAfter(after); + r->getLegPlaces(place); + + r->getLegTimeAfterAcc(afterAcc); + r->getLegPlacesAcc(placeAcc); + + string out; + for (size_t k = 0; k0) + out+= " +" + getTimeMS(after[k]); + + if (k0) + out+= " (+" + getTimeMS(afterAcc[k]) + ")"; + + if (delta[k]>0) + out+= " B: " + getTimeMS(delta[k]); + + out += " | "; + + } + gdi.restore("fantom", false); + gdi.setRestorePoint("fantom"); + gdi.addStringUT(0, out); + gdi.refresh(); +#endif + + if (gdi.hasField("MultiR")) { + int numMulti=parent->getNumMulti(); + if (numMulti==0) { + gdi.clearList("MultiR"); + gdi.disableInput("MultiR"); + lastRace=0; + } + else { + char bf[32]; + gdi.clearList("MultiR"); + gdi.enableInput("MultiR"); + + for (int k=0;kgetRaceNo()); + } + } + oe->fillCourses(gdi, "RCourse", true); + string crsName = r->getCourse(false) ? r->getCourse(false)->getName() + " " : ""; + gdi.addItem("RCourse", crsName + lang.tl("[Klassens bana]"), 0); + gdi.selectItemByData("RCourse", r->getCourseId()); + updateNumShort(gdi, r->getCourse(false), r); + + int cno = parent->getCardNo(); + gdi.setText("CardNo", cno>0 ? itos(cno) : ""); + + warnDuplicateCard(gdi, cno, r); + + gdi.check("RentCard", parent->getDI().getInt("CardFee") != 0); + bool hasFee = gdi.hasField("Fee"); + + if (hasFee) + gdi.setText("Fee", oe->formatCurrency(parent->getDI().getInt("Fee"))); + + if (parent != r) { + gdi.disableInput("CardNo"); + gdi.disableInput("RentCard"); + if (hasFee) + gdi.disableInput("Fee"); + gdi.disableInput("RClass"); + } + else { + gdi.enableInput("CardNo"); + gdi.enableInput("RentCard"); + if (hasFee) + gdi.enableInput("Fee"); + gdi.enableInput("RClass"); + } + + enableControlButtons(gdi, true, r->isVacant()); + + gdi.setText("Start", r->getStartTimeS()); + gdi.setInputStatus("Start", canSetStart(r)); + + gdi.setText("Finish", r->getFinishTimeS()); + gdi.setInputStatus("Finish", canSetFinish(r)); + + gdi.setText("Time", r->getRunningTimeS()); + gdi.setText("Points", itos(r->getRogainingPoints(false))); + + gdi.selectItemByData("Status", r->getStatus()); + gdi.setText("RunnerInfo", lang.tl(r->getProblemDescription()), true); + + if (gdi.hasField("StatusIn")) { + gdi.selectItemByData("StatusIn", r->getInputStatus()); + int ip = r->getInputPlace(); + if (ip > 0) + gdi.setText("PlaceIn", ip); + else + gdi.setText("PlaceIn", MakeDash("-")); + + gdi.setText("TimeIn", r->getInputTimeS()); + if (gdi.hasField("PointIn")) + gdi.setText("PointIn", r->getInputPoints()); + } + + pCard pc=r->getCard(); + + pCourse pcourse=r->getCourse(true); + + if (pc) { + gdi.setTabStops("Punches", 70); + pc->fillPunches(gdi, "Punches", pcourse); + } + else gdi.clearList("Punches"); + + if (pcourse) { + pcourse->synchronize(); + gdi.setTabStops("Course", 50); + pcourse->fillCourse(gdi, "Course"); + autoGrowCourse(gdi); + gdi.enableInput("AddAllC"); + } + else { + gdi.clearList("Course"); + gdi.disableInput("AddAllC"); + } +} + +int RunnerCB(gdioutput *gdi, int type, void *data) +{ + TabRunner &tc = dynamic_cast(*gdi->getTabs().get(TRunnerTab)); + + return tc.runnerCB(*gdi, type, data); +} + +int PunchesCB(gdioutput *gdi, int type, void *data) +{ + TabRunner &tc = dynamic_cast(*gdi->getTabs().get(TRunnerTab)); + return tc.punchesCB(*gdi, type, data); +} + +int VacancyCB(gdioutput *gdi, int type, void *data) +{ + TabRunner &tc = dynamic_cast(*gdi->getTabs().get(TRunnerTab)); + + return tc.vacancyCB(*gdi, type, data); +} + +int runnerSearchCB(gdioutput *gdi, int type, void *data) +{ + TabRunner &tc = dynamic_cast(*gdi->getTabs().get(TRunnerTab)); + + return tc.searchCB(*gdi, type, data); +} + +int TabRunner::searchCB(gdioutput &gdi, int type, void *data) { + static DWORD editTick = 0; + string expr; + bool showNow = false; + bool filterMore = false; + + if (type == GUI_INPUTCHANGE) { + inputId++; + InputInfo &ii = *(InputInfo *)(data); + expr = trim(ii.text); + filterMore = expr.length() > lastSearchExpr.length() && + expr.substr(0, lastSearchExpr.length()) == lastSearchExpr; + editTick = GetTickCount(); + if (expr != lastSearchExpr) { + int nr = oe->getNumRunners(); + if (timeToFill < 50 || (filterMore && (timeToFill * lastFilter.size())/nr < 50)) + showNow = true; + else {// Delay filter + gdi.addTimeoutMilli(500, "Search: " + expr, runnerSearchCB).setExtra((void *)inputId); + } + } + } + else if (type == GUI_TIMER) { + + TimerInfo &ti = *(TimerInfo *)(data); + + if (inputId != int(ti.getExtra())) + return 0; + + expr = ti.id.substr(8); + filterMore = expr.length() > lastSearchExpr.length() && + expr.substr(0, lastSearchExpr.length()) == lastSearchExpr; + showNow = true; + } + else if (type == GUI_EVENT) { + EventInfo &ev = *(EventInfo *)(data); + if (ev.getKeyCommand() == KC_FIND) { + gdi.setInputFocus("SearchText", true); + } + else if (ev.getKeyCommand() == KC_FINDBACK) { + gdi.setInputFocus("SearchText", false); + } + } + else if (type == GUI_FOCUS) { + InputInfo &ii = *(InputInfo *)(data); + + if (ii.text == getSearchString()) { + ((InputInfo *)gdi.setText("SearchText", ""))->setFgColor(colorDefault); + } + } + + if (showNow) { + stdext::hash_set filter; + + if (type == GUI_TIMER) + gdi.setWaitCursor(true); + + if (filterMore) { + + oe->findRunner(expr, 0, lastFilter, filter); + lastSearchExpr = expr; + // Filter more + if (filter.empty()) { + vector< pair > runners; + runners.push_back(make_pair(lang.tl("Ingen matchar 'X'#" + expr), -1)); + gdi.addItem("Runners", runners); + } + else + gdi.filterOnData("Runners", filter); + + filter.swap(lastFilter); + } + else { + lastFilter.clear(); + oe->findRunner(expr, 0, lastFilter, filter); + lastSearchExpr = expr; + + bool formMode = currentMode == 0; + + vector< pair > runners; + oe->fillRunners(runners, !formMode, formMode ? 0 : oEvent::RunnerFilterShowAll, filter); + + if (filter.size() == runners.size()){ + } + else if (filter.empty()) { + runners.clear(); + runners.push_back(make_pair(lang.tl("Ingen matchar 'X'#" + expr), -1)); + } + + filter.swap(lastFilter); + gdi.addItem("Runners", runners); + } + + if (lastFilter.size() == 1) { + pRunner r = oe->getRunner(*lastFilter.begin(), 0); + selectRunner(gdi, r); + } + if (type == GUI_TIMER) + gdi.setWaitCursor(false); + } + + return 0; +} + +pRunner TabRunner::save(gdioutput &gdi, int runnerId, bool willExit) { + oe->synchronizeList(oLCardId, true, true); + TabSI &tsi = dynamic_cast(*gdi.getTabs().get(TSITab)); + tsi.storedInfo.clear(); + + bool create=(runnerId==0); + + if (create) + return 0; + + string name=gdi.getText("Name"); + + if (name.empty()) + throw std::exception("Alla deltagare måste ha ett namn."); + + int cardNo = gdi.getTextNo("CardNo"); + + ListBoxInfo lbi; + gdi.getSelectedItem("Club", lbi); + + int clubId = 0; + if (!lbi.text.empty()) { + pClub pc = oe->getClub(lbi.text); + if (!pc) + pc=oe->addClub(lbi.text); + pc->synchronize(); + + clubId = pc->getId(); + } + + gdi.getSelectedItem("RClass", lbi); + + int classId = 0; + if (signed(lbi.data)<=0 && oe->getNumClasses() == 0) { + if (gdi.ask("Vill du skapa en ny klass?")) { + pClass pc=oe->addClass(oe->getAutoClassName()); + pc->synchronize(); + classId = pc->getId(); + } + } + else + classId = lbi.data; + + int year = 0; + pRunner r; + bool cardNoChanged = false; + if (runnerId==0) { + cardNoChanged = true; + r = oe->addRunner(name, clubId, classId, cardNo, year, true); + r->setCardNo(0, false, false); // Reset to get auto card match + } + else { + r = oe->getRunner(runnerId, 0); + if (r==0) + throw meosException("Internal error runner index"); + + cardNoChanged = r->getCardNo() != cardNo; + if (r->getName() != name || (r->getClubId() != clubId && clubId != 0)) + r->updateFromDB(name, clubId, classId, cardNo, r->getBirthYear()); + } + + if (cardNoChanged && cardNo>0) { + pRunner warnCardDupl = warnDuplicateCard(cardNo, r); + if (warnCardDupl) { + gdi.alert("Varning: Brickan X används redan av Y.#" + itos(cardNo) + "#" + warnCardDupl->getCompleteIdentification()); + } + } + + if (r) { + runnerId=r->getId(); + RunnerStatus originalStatus = r->getStatus(); + r->setName(name, true); + + if (gdi.hasField("Bib")) { + const string &bib = gdi.getText("Bib"); + char pat[32]; + int num = oClass::extractBibPattern(bib, pat); + r->setBib(bib, num, num>0, false); + } + + bool noSetStatus = false; + if (cardNo > 0 && r->getCard() && + r->getCard()->getCardNo() != cardNo && r->getCardNo() != cardNo) { + if (gdi.ask("Vill du koppla isär X från inläst bricka Y?#" + r->getName() + + "#" + r->getCard()->getCardNoString())) { + r->setStatus(StatusUnknown, true, false, false); + r->setCard(0); + r->setFinishTime(0); + r->synchronize(true); + gdi.setText("Finish", ""); + noSetStatus = true; + } + } + + if (cardNo > 0 && cardNo != r->getCardNo() && oe->hasNextStage()) { + if (gdi.ask("Vill du använda den nya brickan till alla etapper?")) { + r->setTransferCardNoNextStage(true); + } + } + + r->setCardNo(cardNo, true); + if (gdi.isChecked("RentCard")) + r->getDI().setInt("CardFee", oe->getDI().getInt("CardFee")); + else + r->getDI().setInt("CardFee", 0); + + if (gdi.hasField("Fee")) + r->getDI().setInt("Fee", oe->interpretCurrency(gdi.getText("Fee"))); + + r->setStartTimeS(gdi.getText("Start")); + r->setFinishTimeS(gdi.getText("Finish")); + + if (gdi.hasField("NumShort")) { + r->setNumShortening(gdi.getSelectedItem("NumShort").first); + } + + if (gdi.hasField("TimeAdjust")) { + int t = convertAbsoluteTimeMS(gdi.getText("TimeAdjust")); + if (t != NOTIME) + r->setTimeAdjustment(t); + } + if (gdi.hasField("PointAdjust")) { + r->setPointAdjustment(-gdi.getTextNo("PointAdjust")); + } + + r->setClubId(clubId); + + if (!willExit) { + oe->fillClubs(gdi, "Club"); + gdi.setText("Club", r->getClub()); + } + + pClass pNewCls = oe->getClass(classId); + if (pNewCls && pNewCls->getClassType() == oClassRelay) { + if (!r->getTeam()) { + gdi.alert("För att delta i en lagklass måste deltagaren ingå i ett lag."); + classId = 0; + } + else if (r->getTeam()->getClassId() != classId && r->getClassId() != classId) { + gdi.alert("Deltagarens klass styrs av laget."); + classId = r->getTeam()->getClassId(); + } + } + + bool readStatusIn = true; + if (r->getClassId() != classId && r->getInputStatus() != StatusNotCompetiting && r->hasInputData()) { + if (gdi.ask("Vill du sätta resultatet från tidigare etapper till ?")) { + r->resetInputData(); + readStatusIn = false; + } + } + + r->setClassId(classId, true); + + r->setCourseId(gdi.getSelectedItem("RCourse").first); + + RunnerStatus sIn = (RunnerStatus)gdi.getSelectedItem("Status").first; + bool checkStatus = sIn != originalStatus; + if (r->getStatus() != sIn && !noSetStatus) { + r->setStatus(sIn, true, false); + } + r->addClassDefaultFee(false); + vector mp; + r->evaluateCard(true, mp, 0, true); + + if (r->getClassId() != classId) { + gdi.alert("Deltagarens klass styrs av laget."); + } + + if (checkStatus && sIn != r->getStatus()) + gdi.alert("Status matchar inte data i löparbrickan."); + + if (gdi.hasField("StatusIn") && readStatusIn) { + r->setInputStatus(RunnerStatus(gdi.getSelectedItem("StatusIn").first)); + r->setInputPlace(gdi.getTextNo("PlaceIn")); + r->setInputTime(gdi.getText("TimeIn")); + if (gdi.hasField("PointIn")) + r->setInputPoints(gdi.getTextNo("PointIn")); + } + + r->synchronizeAll(); + + if (r->getClassRef() && r->getClassRef()->hasClassGlobalDependance()) { + set cls; + cls.insert(r->getClassId()); + oe->reEvaluateAll(cls, false); + } + } + else + runnerId=0; + + if (!willExit) { + fillRunnerList(gdi); + + if (create) + selectRunner(gdi, 0); + else + selectRunner(gdi, r); + } + return r; +} + +int TabRunner::runnerCB(gdioutput &gdi, int type, void *data) +{ + if (type==GUI_BUTTON){ + ButtonInfo bi=*(ButtonInfo *)data; + + if (bi.id=="Search") { + ListBoxInfo lbi; + gdi.getSelectedItem("Runners", lbi); + string searchText = gdi.getText("SearchText"); + bool formMode = currentMode == 0; + stdext::hash_set foo; + fillRunnerList(gdi); + //oe->fillRunners(gdi, "Runners", !formMode, formMode ? 0 : oEvent::RunnerFilterShowAll); + pRunner r=oe->findRunner(searchText, lbi.data, foo, foo); + + if (r) { + if (formMode) + selectRunner(gdi, r); + gdi.selectItemByData("Runners", r->getId()); + } + else + gdi.alert("Löparen hittades inte"); + } + else if (bi.id == "ShowAll") { + fillRunnerList(gdi); + } + else if (bi.id=="Pair") { + ListBoxInfo lbi; + pRunner r=0; + if (gdi.getSelectedItem("Runners", lbi) && + (r=oe->getRunner(lbi.data, 0))!=0) { + int cid = bi.getExtraInt(); + pCard card = oe->getCard(cid); + if (!card) + throw meosException("Internal error"); + card->synchronize(); + if (card->isRemoved()) + throw meosException("Card was removed"); + + int newCardId=card->getId(); + + int oldCardId=r->setCard(newCardId); + gdi.restore("CardTable"); + Table &t=gdi.getTable(); + t.reloadRow(newCardId); + if (oldCardId) + t.reloadRow(oldCardId); + gdi.enableTables(); + gdi.refresh(); + } + } + else if (bi.id == "Window") { + gdioutput *gdi_new = createExtraWindow(uniqueTag("kiosk"), MakeDash("MeOS - " + oe->getName()), gdi.getWidth() + 64 + gdi.scaleLength(120)); + if (gdi_new) { + TabRunner &tr = dynamic_cast(*gdi_new->getTabs().get(TRunnerTab)); + tr.currentMode = currentMode; + tr.runnerId = runnerId; + tr.ownWindow = true; + tr.loadPage(*gdi_new); + } + } + else if (bi.id == "Kiosk") { + if (gdi.ask("ask:kiosk")) { + oe->setReadOnly(); + oe->updateTabs(); + loadPage(gdi); + } + } + else if (bi.id == "ListenReadout") { + listenToPunches = gdi.isChecked(bi.id); + } + else if (bi.id=="Unpair") { + ListBoxInfo lbi; + int cid = bi.getExtraInt(); + pCard c = oe->getCard(cid); + + if (c->getOwner()) + c->getOwner()->setCard(0); + + gdi.restore("CardTable"); + Table &t=gdi.getTable(); + t.reloadRow(c->getId()); + gdi.enableTables(); + gdi.refresh(); + } + else if (bi.id=="TableMode") { + gdi.canClear(); + currentMode = 1; + loadPage(gdi); + } + else if (bi.id=="FormMode") { + if (currentMode != 0) { + currentMode = 0; + gdi.canClear(); + gdi.enableTables(); + loadPage(gdi); + } + } + else if (bi.id=="Vacancy") { + if (currentMode != 4) { + gdi.canClear(); + showVacancyList(gdi, "add"); + } + } + else if (bi.id == "ReportMode") { + if (currentMode != 5) { + gdi.canClear(); + showRunnerReport(gdi); + } + } + else if (bi.id=="Cards") { + if (currentMode != 3) { + gdi.canClear(); + showCardsList(gdi); + } + } + else if (bi.id=="InForest") { + if (currentMode != 2) { + gdi.canClear(); + showInForestList(gdi); + } + } + else if (bi.id=="CancelInForest") { + clearInForestData(); + loadPage(gdi); + } + else if (bi.id=="CancelReturn") { + loadPage(gdi); + } + else if (bi.id=="SetDNS") { + for (size_t k=0; kgetStatus()==StatusUnknown) + unknown[k]->setStatus(StatusDNS, true, false); + + //Reevaluate and synchronize all + oe->reEvaluateAll(set(), true); + clearInForestData(); + showInForestList(gdi); + } + else if (bi.id=="SetUnknown") { + for (size_t k=0; kgetStatus()==StatusDNS) + known_dns[k]->setStatus(StatusUnknown, true, false); + + //Reevaluate and synchronize all + oe->reEvaluateAll(set(), true); + clearInForestData(); + showInForestList(gdi); + } + else if (bi.id == "RemoveVacant") { + if (gdi.ask("Vill du radera alla vakanser från tävlingen?")) { + oe->removeVacanies(0); + gdi.disableInput(bi.id.c_str()); + } + } + else if (bi.id=="Cancel") { + gdi.restore("CardTable"); + gdi.enableTables(); + gdi.refresh(); + } + else if (bi.id=="SplitPrint") { + if (!runnerId) + return 0; + pRunner r=oe->getRunner(runnerId, 0); + if (!r) return 0; + + gdioutput gdiprint(2.0, gdi.getEncoding(), gdi.getHWND(), splitPrinter); + if (bi.getExtraInt() == 0) + r->printSplits(gdiprint); + else + r->printStartInfo(gdiprint); + gdiprint.print(oe, 0, false, true); + gdiprint.fetchPrinterSettings(splitPrinter); + } + else if (bi.id == "PrintSettings") { + if (runnerId) + save(gdi, runnerId, true); + TabList::splitPrintSettings(*oe, gdi, false, TRunnerTab, (TabList::PrintSettingsSelection)bi.getExtraInt()); + } + else if (bi.id == "EditTeam") { + pRunner r = oe->getRunner(runnerId, 0); + if (r && r->getTeam()) { + save(gdi, runnerId, true); + + TabTeam *tt = (TabTeam *)gdi.getTabs().get(TTeamTab); + tt->loadPage(gdi, r->getTeam()->getId()); + } + } + else if (bi.id=="Save") { + save(gdi, runnerId, false); + return true; + } + else if (bi.id=="Undo") { + selectRunner(gdi, oe->getRunner(runnerId, 0)); + return true; + } + else if (bi.id=="Add") { + if (runnerId>0) { + string name = gdi.getText("Name"); + pRunner r = oe->getRunner(runnerId, 0); + if (!name.empty() && r && r->getName() != name && r->getNameRaw() != name) { + if (gdi.ask("Vill du lägga till deltagaren 'X'?#" + name)) { + r = oe->addRunner(name, 0, 0, 0,0, false); + runnerId = r->getId(); + } + save(gdi, runnerId, false); + return true; + } + + save(gdi, runnerId, true); + } + ListBoxInfo lbi; + gdi.getSelectedItem("RClass", lbi); + + pRunner r = oe->addRunner(oe->getAutoRunnerName(), 0,0,0,0, false); + if (signed(lbi.data)>0) + r->setClassId(lbi.data, true); + else + r->setClassId(oe->getFirstClassId(false), true); + + fillRunnerList(gdi); + oe->fillClubs(gdi, "Club"); + selectRunner(gdi, r); + gdi.setInputFocus("Name", true); + } + else if (bi.id=="Remove") { + if (!runnerId) + return 0; + + if (gdi.ask("Vill du verkligen ta bort löparen?")) { + if (oe->isRunnerUsed(runnerId)) + gdi.alert("Löparen ingår i ett lag och kan inte tas bort."); + else { + pRunner r = oe->getRunner(runnerId, 0); + if (r) + r->remove(); + fillRunnerList(gdi); + //oe->fillRunners(gdi, "Runners"); + selectRunner(gdi, 0); + } + } + } + else if (bi.id=="NoStart") { + if (!runnerId) + return 0; + pRunner r = oe->getRunner(runnerId, 0); + r = r->getMultiRunner(0); + + if (r && gdi.ask("Bekräfta att deltagaren har lämnat återbud.")) { + if (r->getStartTime()>0) { + pRunner newRunner = oe->addRunnerVacant(r->getClassId()); + newRunner->cloneStartTime(r); + newRunner->setStartNo(r->getStartNo(), false); + if (r->getCourseId()) + newRunner->setCourseId(r->getCourseId()); + newRunner->synchronizeAll(); + } + + for (int k=0;kgetNumMulti()+1; k++) { + pRunner rr = r->getMultiRunner(k); + if (rr) { + rr->setStartTime(0, true, false); + rr->setStartNo(0, false); + rr->setStatus(StatusDNS, true, false); + rr->setCardNo(0, false); + } + } + r->synchronizeAll(); + selectRunner(gdi, r); + } + } + else if (bi.id == "Move") { + pRunner r = oe->getRunner(runnerId, 0); + + if (!runnerId || !r) + return 0; + gdi.clearPage(true); + + gdi.pushX(); + gdi.fillRight(); + gdi.addString("", boldLarge, "Klassbyte"); + gdi.addStringUT(boldLarge, r->getName()).setColor(colorDarkRed); + + //gdi.fillRight(); + //gdi.addString("", 0, "Deltagare:"); + gdi.fillDown(); + gdi.dropLine(2); + gdi.popX(); + gdi.addString("", 0, "Välj en vakant plats nedan."); + + oe->generateVacancyList(gdi, RunnerCB); + + gdi.dropLine(); + gdi.addButton("CancelReturn", "Avbryt", RunnerCB); + } + else if (bi.id == "RemoveC") { + ListBoxInfo lbi; + gdi.getSelectedItem("Punches", lbi); + + DWORD rid=runnerId; + if (!rid) + return 0; + + pRunner r=oe->getRunner(rid, 0); + + if (!r) return 0; + + pCard card=r->getCard(); + + if (!card) return 0; + + card->deletePunch(card->getPunchByIndex(lbi.data)); + card->synchronize(); + //Update runner + vector mp; + r->evaluateCard(true, mp, 0, true); + + card->fillPunches(gdi, "Punches", r->getCourse(true)); + + gdi.setText("Time", r->getRunningTimeS()); + gdi.selectItemByData("Status", r->getStatus()); + } + else if (bi.id=="Check") { + } + } + else if (type==GUI_INPUT) { + InputInfo ii=*(InputInfo *)data; + + if (ii.id=="CardNo") { + int cardNo = gdi.getTextNo("CardNo"); + if (runnerId) { + pRunner r = oe->getRunner(runnerId, 0); + if (r) { + warnDuplicateCard(gdi, cardNo, r); + } + } + } + } + else if (type==GUI_LISTBOX) { + ListBoxInfo bi=*(ListBoxInfo *)data; + + if (bi.id=="Runners") { + if (gdi.isInputChanged("")) { + pRunner r = oe->getRunner(runnerId, 0); + bool newName = r && r->getName() != gdi.getText("Name"); + + save(gdi, runnerId, true); + + if (newName) + fillRunnerList(gdi); + } + + if (bi.data == -1) { + fillRunnerList(gdi); + return 0; + } + + pRunner r=oe->getRunner(bi.data, 0); + + if (r==0) + throw meosException("Internal error runner index"); + + if (lastRace<=r->getNumMulti()) + r=r->getMultiRunner(lastRace); + + oe->fillClubs(gdi, "Club"); + selectRunner(gdi, r); + } + else if (bi.id=="ReportRunner") { + if (bi.data == -1) { + fillRunnerList(gdi); + return 0; + } + runnerId = bi.data; + //loadPage(gdi); + PostMessage(gdi.getTarget(), WM_USER + 2, TRunnerTab, 0); + } + else if (bi.id=="RClass") { + gdi.selectItemByData("RCourse", 0); + pCourse crsToUse = 0; + + if (bi.data==0) { + gdi.clearList("Course"); + } + else { + pClass Class=oe->getClass(bi.data); + + if (Class) { + crsToUse = Class->getCourse(); + + pRunner rTmp; + if (crsToUse == 0 && (rTmp = oe->getRunner(runnerId, 0)) != 0) { + crsToUse = Class->getCourse(rTmp->getLegNumber(), rTmp->getStartNo()); + } + } + + string crsName; + if (crsToUse) { + crsToUse->fillCourse(gdi, "Course"); + autoGrowCourse(gdi); + crsName = crsToUse->getName() + " "; + } + else { + gdi.clearList("Course"); + } + + ListBoxInfo rcrs; + gdi.getSelectedItem("RCourse", rcrs); + oe->fillCourses(gdi, "RCourse", true); + gdi.addItem("RCourse", crsName + lang.tl("[Klassens bana]"), 0); + gdi.selectItemByData("RCourse", rcrs.data); + } + + updateNumShort(gdi, crsToUse, oe->getRunner(runnerId, 0)); + } + else if (bi.id=="RCourse") { + pCourse crsToUse = 0; + pRunner r=oe->getRunner(runnerId, 0); + + if (bi.data==0) { + gdi.clearList("Course"); + if (r) { //Fix for multi classes, course depends on runner. + ListBoxInfo lbi; + gdi.getSelectedItem("RClass", lbi); + if (signed(lbi.data)>0) { + r->setClassId(lbi.data, true); + r = oe->getRunner(runnerId, 0); + if (r) { + r->synchronize(true); + crsToUse = r->getCourse(true); + } + } + } + if (!r) { + pClass Class=oe->getClass(gdi.getSelectedItem("RClass").first); + if (Class) + crsToUse = Class->getCourse(); + } + } + else { + crsToUse=oe->getCourse(bi.data); + } + if (crsToUse) { + crsToUse->fillCourse(gdi, "Course"); + autoGrowCourse(gdi); + updateNumShort(gdi, crsToUse, r); + } + } + else if (bi.id=="MultiR") { + pRunner r=oe->getRunner(runnerId, 0); + lastRace=bi.data; + if (r) + selectRunner(gdi, r->getMultiRunner(bi.data)); + } + } + else if (type==GUI_EVENT) { + EventInfo ei=*(EventInfo *)data; + + if (ei.id=="LoadRunner") { + pRunner r=oe->getRunner(ei.getData(), 0); + if (r) { + selectRunner(gdi, r); + gdi.selectItemByData("Runners", r->getId()); + } + } + else if (ei.id=="CellAction") { + //oBase *b=static_cast(ei.getExtra()); + oBase *b = oe->getCard(ei.getExtraInt()); + + cellAction(gdi, ei.getData(), b); + } + else if ((ei.id == "DataUpdate") && listenToPunches && currentMode == 5) { + if (ei.getData() > 0) { + runnerId = ei.getData(); + } + loadPage(gdi); + } + else if ((ei.id == "ReadCard") && + (listenToPunches || oe->isReadOnly()) && currentMode == 5) { + if (ei.getData() > 0) { + vector rs; + oe->getRunnersByCard(ei.getData(), rs); + if (!rs.empty()) { + runnersToReport.resize(rs.size()); + for (size_t k = 0; kgetId(), false); + } + runnerId = 0; + } + loadPage(gdi); + } + } + else if (type==GUI_CLEAR) { + if (runnerId>0 && currentMode == 0) + save(gdi, runnerId, true); + + return true; + } + else if (type == GUI_LINK) { + int id = static_cast(data)->getExtraInt(); + oRunner *vacancy = oe->getRunner(id, 0); + + if (vacancy==0 || vacancy->getClassId()==0) + return -1; + + pRunner r = oe->getRunner(runnerId, 0); + + vacancy->synchronize(); + r->synchronize(); + + if (r==0) + return -1; + + char bf[1024]; + sprintf_s(bf, lang.tl("Bekräfta att %s byter klass till %s.").c_str(), + r->getName().c_str(), vacancy->getClass().c_str()); + if (gdi.ask(string("#") + bf)) { + + vacancy->synchronize(); + if (!vacancy->isVacant()) + throw std::exception("Starttiden är upptagen."); + + oRunner temp(oe, 0); + temp.setTemporary(); + temp.setBib(r->getBib(), 0, false, false); + temp.setStartNo(r->getStartNo(), false); + temp.setClassId(r->getClassId(), true); + temp.apply(false, 0, false); + temp.cloneStartTime(r); + + r->setClassId(vacancy->getClassId(), true); + // Remove or create multi runners + r->createMultiRunner(true, true); + r->apply(false, 0, false); + r->cloneStartTime(vacancy); + r->setBib(vacancy->getBib(), 0, false, false); + r->setStartNo(vacancy->getStartNo(), false); + + if (oe->hasPrevStage()) { + if (gdi.ask("Vill du sätta resultatet från tidigare etapper till ?")) + r->resetInputData(); + } + + vacancy->setClassId(temp.getClassId(), true); + // Remove or create multi runners + vacancy->createMultiRunner(true, true); + vacancy->apply(false, 0, false); + vacancy->cloneStartTime(&temp); + vacancy->setBib(temp.getBib(), 0, false, false); + vacancy->setStartNo(temp.getStartNo(), false); + + r->synchronizeAll(); + vacancy->synchronizeAll(); + + loadPage(gdi); + selectRunner(gdi, r); + } + } + return 0; +} + +void TabRunner::showCardsList(gdioutput &gdi) +{ + currentMode = 3; + gdi.clearPage(false); + gdi.dropLine(0.5); + gdi.addString("", boldLarge, "Hantera löparbrickor"); + gdi.addString("", 10, "help:14343"); + addToolbar(gdi); + gdi.dropLine(); + cardModeStartY=gdi.getCY(); + Table *t=oe->getCardsTB(); + gdi.addTable(t,gdi.getCX(),gdi.getCY()+15); + gdi.registerEvent("CellAction", RunnerCB); + gdi.refresh(); +} + +int TabRunner::vacancyCB(gdioutput &gdi, int type, void *data) +{ + if (type == GUI_BUTTON) { + ButtonInfo bi=*(ButtonInfo *)data; + TabSI &tsi = dynamic_cast(*gdi.getTabs().get(TSITab)); + + + if (bi.id == "VacancyAdd") { + showVacancyList(gdi, "add"); + } + else if (bi.id == "PrinterSetup") { + tsi.setPrintStartInfo(true); + TabList::splitPrintSettings(*oe, gdi, true, TRunnerTab, TabList::StartInfo); + } + else if (bi.id == "CancelVacant") { + tsi.storedInfo.clear(); + loadPage(gdi); + } + } + else if (type == GUI_LINK) { + int id = static_cast(data)->getExtraInt(); + oRunner *r = oe->getRunner(id, 0); + + if (r==0) + return -1; + + r->synchronize(); + if (!r->isVacant()) + throw std::exception("Starttiden är upptagen."); + + string name = gdi.getText("Name"); + + if (name.empty()) + throw std::exception("Alla deltagare måste ha ett namn."); + + int cardNo = gdi.getTextNo("CardNo"); + + if (cardNo!=r->getCardNo() && oe->checkCardUsed(gdi, *r, cardNo)) + return 0; + + string club = gdi.getText("Club"); + int birthYear = 0; + pClub pc = oe->getClubCreate(0, club); + + r->updateFromDB(name, pc->getId(), r->getClassId(), cardNo, birthYear); + + r->setName(name, true); + r->setCardNo(cardNo, true); + + r->setClub(club); + int fee = 0; + if (gdi.hasField("Fee")) { + ListBoxInfo lbi; + if (gdi.getSelectedItem("Fee", lbi) && lbi.data == -1) { + lastFee = "@"; + // Use class default fee + } + else { + r->setFlag(oRunner::FlagFeeSpecified, true); + fee = oe->interpretCurrency(gdi.getText("Fee")); + lastFee = oe->formatCurrency(fee); + r->getDI().setInt("Fee", fee); + } + } + + r->getDI().setDate("EntryDate", getLocalDate()); + r->addClassDefaultFee(false); + int cardFee = 0; + + if (gdi.isChecked("RentCard")) { + cardFee = oe->getDI().getInt("CardFee"); + r->getDI().setInt("CardFee", cardFee); + } + else + r->getDI().setInt("CardFee", 0); + + + + if (cardFee < 0) + cardFee = 0; + fee = r->getDCI().getInt("Fee"); + + TabSI::writePayMode(gdi, fee + cardFee, *r); + + if (gdi.hasField("AllStages")) { + r->setFlag(oRunner::FlagTransferSpecified, true); + r->setFlag(oRunner::FlagTransferNew, gdi.isChecked("AllStages")); + } + + if (oe->hasPrevStage()) { + if (gdi.ask("Vill du sätta resultatet från tidigare etapper till ?")) + r->resetInputData(); + } + + r->synchronizeAll(); + + TabSI &tsi = dynamic_cast(*gdi.getTabs().get(TSITab)); + + // Print start certificate + tsi.generateStartInfo(gdi, *r); + + showVacancyList(gdi, "", r->getClassId()); + } + else if (type==GUI_INPUT) { + InputInfo ii=*(InputInfo *)data; + + if (ii.id=="CardNo") { + int cardNo = gdi.getTextNo("CardNo"); + if (gdi.getText("Name").empty()) + setCardNo(gdi, cardNo); + } + } + else if (type==GUI_POSTCLEAR) { + // Clear out SI-link + TabSI &tsi = dynamic_cast(*gdi.getTabs().get(TSITab)); + tsi.setCardNumberField(""); + + return true; + } + else if (type == GUI_CLEAR) { + TabSI &tsi = dynamic_cast(*gdi.getTabs().get(TSITab)); + tsi.storedInfo.clear(); + tsi.storedInfo.storedName = gdi.getText("Name"); + tsi.storedInfo.storedCardNo = gdi.getText("CardNo"); + tsi.storedInfo.storedClub = gdi.getText("Club"); + ListBoxInfo lbi; + if (gdi.getSelectedItem("Fee", lbi) && lbi.data == -1) { + tsi.storedInfo.storedFee = "@"; + // Use class default fee + } + else + tsi.storedInfo.storedFee = gdi.getText("Fee", true); + + tsi.storedInfo.allStages = gdi.isChecked("AllStages"); + tsi.storedInfo.rentState = gdi.isChecked("RentCard"); + tsi.storedInfo.hasPaid = gdi.isChecked("Paid"); + tsi.storedInfo.payMode = gdi.hasField("PayMode") ? gdi.getSelectedItem("PayMode").first : 0; + return 1; + } + return 0; +} + +void TabRunner::setCardNo(gdioutput &gdi, int cardNo) +{ + pRunner db_r=oe->dbLookUpByCard(cardNo); + + if (db_r) { + gdi.setText("Name", db_r->getName()); + gdi.setText("Club", db_r->getClub()); + } +} + +void TabRunner::showRunnerReport(gdioutput &gdi) +{ + gdi.clearPage(true); + currentMode = 5; + + if (!ownWindow && !oe->isReadOnly()) + addToolbar(gdi); + else if (oe->isReadOnly()) + gdi.addString("", fontLarge, MakeDash("MeOS - Resultatkiosk")).setColor(colorDarkBlue); + + gdi.dropLine(); + + gdi.pushX(); + gdi.fillRight(); + + gdi.addSelection("ReportRunner", 300, 300, RunnerCB); + oe->fillRunners(gdi, "ReportRunner", true, oEvent::RunnerFilterShowAll|oEvent::RunnerCompactMode); + gdi.selectItemByData("ReportRunner", runnerId); + + if (!oe->isReadOnly()) { + if (!ownWindow) { + gdi.addButton("Kiosk", "Resultatkiosk", RunnerCB); + gdi.addButton("Window", "Eget fönster", RunnerCB, "Öppna i ett nytt fönster."); + } + gdi.dropLine(0.2); + gdi.addCheckbox("ListenReadout", "Visa senast inlästa deltagare", RunnerCB, listenToPunches); + } + + gdi.dropLine(3); + gdi.popX(); + gdi.registerEvent("DataUpdate", RunnerCB); + gdi.registerEvent("ReadCard", RunnerCB); + + gdi.fillDown(); + oe->calculateResults(oEvent::RTClassResult); + + if (runnerId > 0) { + runnersToReport.resize(1); + runnersToReport[0] = make_pair(runnerId, false); + } + + cTeam t = 0; + for (size_t k = 0; k < runnersToReport.size(); k++) { + pRunner r = oe->getRunner(runnersToReport[k].first, 0); + if (r && r->getTeam()) { + pClass cls = oe->getClass(r->getClassId()); + if (cls && cls->getClassType() == oClassPatrol) + continue; + + if (t == 0) + t = r->getTeam(); + } + } + + if (runnersToReport.size() == 1) + runnerId = runnersToReport[0].first; + + if (t == 0) { + for (size_t k = 0; k < runnersToReport.size(); k++) + runnerReport(gdi, runnersToReport[k].first, runnersToReport[k].second); + } + else { + oe->calculateTeamResults(false); + + set selectedRunners; + bool selHasRes = false; + for (size_t k = 0; k < runnersToReport.size(); k++) { + selectedRunners.insert(runnersToReport[k].first); + pRunner r = oe->getRunner(runnersToReport[k].first, 0); + if (r->getStatus() != StatusUnknown) + selHasRes = true; + } + + string tInfo = t->getName(); + if (t->statusOK()) { + tInfo += ", " + t->getRunningTimeS() + lang.tl(".S Placering: ") + t->getPlaceS(); + if (t->getTimeAfter(-1) > 0) + tInfo += ", +" + formatTime(t->getTimeAfter(-1)); + } + else if (t->getStatus() != StatusUnknown) { + tInfo += " " + t->getStatusS(); + } + + gdi.addStringUT(fontMediumPlus, t->getClass()); + gdi.addStringUT(boldLarge, tInfo); + gdi.dropLine(); + + bool visitedSelected = false; + for (int leg = 0; leg < t->getNumRunners(); leg++) { + if (selHasRes && visitedSelected) + break; + + pRunner r = t->getRunner(leg); + pRunner nextR = t->getRunner(leg + 1); + bool nextSelected = nextR && selectedRunners.count(nextR->getId()); + + if (r) { + bool selected = selectedRunners.count(r->getId()) > 0; + + if (selHasRes) { + runnerReport(gdi, r->getId(), !selected); + } + else { + runnerReport(gdi, r->getId(), !nextSelected); + } + + visitedSelected |= selected; + } + } + } +} + +void TabRunner::runnerReport(gdioutput &gdi, int id, bool compact) { + pRunner r = oe->getRunner(id, 0); + if (!r || ! r->getClassRef()) + return; + + gdi.pushX(); + gdi.fillDown(); + if (r->getTeam() == 0) { + gdi.addStringUT(fontMediumPlus, r->getClass()); + gdi.addStringUT(boldLarge, r->getCompleteIdentification()); + } + else { + string s; + if (r->getTeam()) + s += r->getClassRef()->getLegNumber(r->getLegNumber()); + + s += ": " + r->getName(); + gdi.addStringUT(boldText, s); + } + + string str; + if (r->getTeam() == 0) { + str = oe->formatListString(lRunnerTimeStatus, r); + } + else { + str = oe->formatListString(lTeamLegTimeStatus, r); + str += " (" + oe->formatListString(lRunnerTimeStatus, r) + ")"; + } + + gdi.dropLine(0.3); + + if (r->statusOK()) { + int total, finished, dns; + oe->getNumClassRunners(r->getClassId(), r->getLegNumber(), total, finished, dns); + + if (r->getTeam() == 0) { + gdi.addString("", fontMediumPlus, "Tid: X, nuvarande placering Y/Z.#" + str + "#" + r->getPlaceS() + "#" + itos(finished)); + } + else { + int place = r->getTeam()->getLegPlace(r->getLegNumber(), false); + if (place > 0 && place < 10000) { + gdi.addString("", fontMediumPlus, "Tid: X, nuvarande placering Y/Z.#" + str + "#" + itos(place) + "#" + itos(finished)); + } + else { + gdi.addStringUT(fontMediumPlus, str).setColor(colorRed); + } + } + } + else if (r->getStatus() != StatusUnknown) { + gdi.addStringUT(fontMediumPlus, str).setColor(colorRed); + } + + gdi.popX(); + gdi.fillRight(); + + if (r->getStartTime() > 0) + gdi.addString("", fontMedium, "Starttid: X #" + r->getStartTimeCompact()); + + if (r->getFinishTime() > 0) + gdi.addString("", fontMedium, "Måltid: X #" + r->getFinishTimeS()); + + const string &after = oe->formatListString(lRunnerTimeAfter, r); + if (!after.empty()) { + gdi.addString("", fontMedium, "Tid efter: X #" + after); + } + + const string &lost = oe->formatListString(lRunnerMissedTime, r); + if (!lost.empty()) { + gdi.addString("", fontMedium, "Bomtid: X #" + lost).setColor(colorDarkRed); + } + + gdi.popX(); + gdi.dropLine(2.5); + gdi.fillDown(); + + if (compact) + return; + + pCourse crs = r->getCourse(true); + + int xp = gdi.getCX(); + int yp = gdi.getCY(); + int xw = gdi.scaleLength(130); + int cx = xp; + int limit = (9*xw)/10; + int lh = gdi.getLineHeight(); + + if (crs && r->getStatus() != StatusUnknown) { + int nc = crs->getNumControls(); + vector delta; + vector place; + vector after; + vector placeAcc; + vector afterAcc; + + r->getSplitAnalysis(delta); + r->getLegTimeAfter(after); + r->getLegPlaces(place); + + r->getLegTimeAfterAcc(afterAcc); + r->getLegPlacesAcc(placeAcc); + int end = crs->useLastAsFinish() ? nc - 1 : nc; + int start = crs->useFirstAsStart() ? 1 : 0; + for (int k = start; k<=end; k++) { + string name = crs->getControlOrdinal(k); + if ( k < end) { + pControl ctrl = crs->getControl(k); + if (ctrl && ctrl->getFirstNumber() > 0) + name += " (" + itos(ctrl->getFirstNumber()) + ")"; + gdi.addString("", yp, cx, boldText, "Kontroll X#" + name, limit); + } + else + gdi.addStringUT(yp, cx, boldText, name, limit); + + string split = r->getSplitTimeS(k, false); + + int bestTime = 0; + if ( k < int(after.size()) && after[k] >= 0) + bestTime = r->getSplitTime(k, false) - after[k]; + + GDICOLOR color = colorDefault; + if (k < int(after.size()) ) { + if (after[k] > 0) + split += " (" + itos(place[k]) + ", +" + getTimeMS(after[k]) + ")"; + else if (place[k] == 1) + split += lang.tl(" (sträckseger)"); + else if (place[k] > 0) + split += " " + itos(place[k]); + + if (after[k] >= 0 && after[k]<=int(bestTime * 0.03)) + color = colorLightGreen; + } + gdi.addStringUT(yp + lh, cx, fontMedium, split, limit); + + if (k>0 && k < int(placeAcc.size())) { + split = r->getPunchTimeS(k, false); + string pl = placeAcc[k] > 0 ? itos(placeAcc[k]) : "-"; + if (k < int(afterAcc.size()) ) { + if (afterAcc[k] > 0) + split += " (" + pl + ", +" + getTimeMS(afterAcc[k]) + ")"; + else if (placeAcc[k] == 1) + split += lang.tl(" (ledare)"); + else if (placeAcc[k] > 0) + split += " " + pl; + } + gdi.addStringUT(yp + 2*lh, cx, fontMedium, split, limit).setColor(colorDarkBlue); + } + + if (k < int(delta.size()) && delta[k] > 0 ) { + gdi.addString("", yp + 3*lh, cx, fontMedium, "Bomtid: X#" + getTimeMS(delta[k])); + + color = (delta[k] > bestTime * 0.5 && delta[k]>60 ) ? + colorMediumDarkRed : colorMediumRed; + } + + RECT rc; + rc.top = yp - 2; + rc.bottom = yp + lh*5 - 4; + rc.left = cx - 4; + rc.right = cx + xw - 8; + + gdi.addRectangle(rc, color); + + cx += xw; + + if (k % 6 == 5) { + cx = xp; + yp += lh * 5; + } + } + } + else { + vector punches; + oe->getPunchesForRunner(r->getId(), punches); + + int lastT = r->getStartTime(); + for (size_t k = 0; k < punches.size(); k++) { + + string name = punches[k]->getType(); + string realName; + if (atoi(name.c_str()) > 0) { + const pCourse rCrs = r->getCourse(false); + if (rCrs) { + vector crsCtrl; + rCrs->getControls(crsCtrl); + for(size_t j = 0; j < crsCtrl.size(); j++) { + if (crsCtrl[j]->hasNumber(atoi(name.c_str()))) { + if (crsCtrl[j]->hasName()) + realName = crsCtrl[j]->getName(); + + break; + } + } + } + if (realName.empty()) + gdi.addString("", yp, cx, boldText, "Kontroll X#" + name, limit); + else + gdi.addStringUT(yp, cx, boldText, realName, limit); + } + else + gdi.addStringUT(yp, cx, boldText, name, limit); + + int t = punches[k]->getAdjustedTime(); + if (t>0) { + int st = r->getStartTime(); + gdi.addString("", yp + lh, cx, normalText, "Klocktid: X#" + oe->getAbsTime(t), limit); + if (st > 0 && t > st) { + string split = formatTimeHMS(t-st); + if (lastT>0 && st != lastT && lastT < t) + split += " (" + getTimeMS(t-lastT) + ")"; + gdi.addStringUT(yp + 2*lh, cx, normalText, split, limit); + } + } + + if (punches[k]->isStart() || punches[k]->getControlNumber() >= 30) { + lastT = t; + } + + GDICOLOR color = colorDefault; + + RECT rc; + rc.top = yp - 2; + rc.bottom = yp + lh*5 - 4; + rc.left = cx - 4; + rc.right = cx + xw - 8; + + gdi.addRectangle(rc, color); + cx += xw; + if (k % 6 == 5) { + cx = xp; + yp += lh * 5; + } + } + } + + gdi.dropLine(3); + gdi.popX(); +} + + +void TabRunner::showVacancyList(gdioutput &gdi, const string &method, int classId) +{ + gdi.clearPage(true); + currentMode = 4; + + if (method == "") { + gdi.dropLine(0.5); + gdi.addString("", boldLarge, "Tillsatte vakans"); + addToolbar(gdi); + TabSI &tsi = dynamic_cast(*gdi.getTabs().get(TSITab)); + tsi.storedInfo.clear(); + + gdi.dropLine(); + + gdi.fillRight(); + gdi.pushX(); + gdi.addButton("VacancyAdd", "Tillsätt ytterligare vakans", VacancyCB); + //gdi.addButton("Cancel", "Återgå", VacancyCB); + gdi.popX(); + gdi.fillDown(); + gdi.dropLine(2); + + if (classId==0) + oe->generateVacancyList(gdi, 0); + else { + oListParam par; + par.selection.insert(classId); + oListInfo info; + par.listCode = EStdStartList; + oe->generateListInfo(par, gdi.getLineHeight(), info); + oe->generateList(gdi, false, info, true); + } + } + else if (method == "add") { + gdi.dropLine(0.5); + gdi.addString("", boldLarge, "Tillsätt vakans"); + addToolbar(gdi); + + gdi.dropLine(); + + gdi.fillRight(); + + int bx = gdi.getCX(); + int by = gdi.getCY(); + + gdi.setCX(bx + gdi.scaleLength(10)); + gdi.setCY(by + gdi.scaleLength(10)); + gdi.pushX(); + + TabSI &tsi = dynamic_cast(*gdi.getTabs().get(TSITab)); + tsi.storedInfo.checkAge(); + + gdi.addInput("CardNo", tsi.storedInfo.storedCardNo, 8, VacancyCB, "Bricka:"); + tsi.setCardNumberField("CardNo"); + + //Remember to clear SI-link when page is cleared. + gdi.setPostClearCb(VacancyCB); + gdi.setOnClearCb(VacancyCB); + + gdi.dropLine(1.2); + gdi.addCheckbox("RentCard", "Hyrd", 0, tsi.storedInfo.rentState); + gdi.dropLine(-1.2); + + gdi.addInput("Name", tsi.storedInfo.storedName, 16, 0, "Namn:"); + + gdi.addCombo("Club", 220, 300, 0, "Klubb:"); + oe->fillClubs(gdi, "Club"); + gdi.setText("Club", tsi.storedInfo.storedClub); + + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Economy)) { + if (!tsi.storedInfo.storedFee.empty()) + lastFee = tsi.storedInfo.storedFee; + + gdi.addCombo("Fee", 60, 150, SportIdentCB, "Avgift:"); + oe->fillFees(gdi, "Fee", true); + gdi.autoGrow("Fee"); + + if (!lastFee.empty() && lastFee != "@") { + gdi.setText("Fee", lastFee); + } + else { + gdi.selectFirstItem("Fee"); + } + gdi.dropLine(1.2); + + //gdi.addCheckbox("Paid", "Kontant betalning", 0, tsi.storedInfo.hasPaid); + tsi.generatePayModeWidget(gdi); + gdi.dropLine(-0.2); + } + else { + gdi.dropLine(); + } + + gdi.dropLine(2.8); + gdi.popX(); + gdi.addCheckbox("StartInfo", "Skriv ut startbevis", SportIdentCB, tsi.hasPrintStartInfo(), "Skriv ut startbevis för deltagaren"); + + if (oe->hasNextStage()) + gdi.addCheckbox("AllStages", "Anmäl till efterföljande etapper", 0, tsi.storedInfo.allStages); + + gdi.dropLine(-0.2); + gdi.addButton("PrinterSetup", "Skrivarinställningar...", VacancyCB, "Skrivarinställningar för sträcktider och startbevis"); + gdi.setCX(gdi.getCX() + gdi.scaleLength(40)); + gdi.addButton("CancelVacant", "Avbryt", VacancyCB); + + gdi.fillDown(); + gdi.dropLine(2.5); + RECT rc = {bx, by, gdi.getWidth(), gdi.getCY() + gdi.scaleLength(20)}; + gdi.addRectangle(rc, colorLightCyan); + + gdi.setCX(bx); + gdi.pushX(); + gdi.dropLine(); + + gdi.addString("", fontMediumPlus, "Välj klass och starttid nedan"); + oe->generateVacancyList(gdi, VacancyCB); + gdi.setInputFocus("CardNo"); + } + else if (method == "move") { + + } +} + + +void TabRunner::clearInForestData() +{ + unknown_dns.clear(); + known_dns.clear(); + known.clear(); + unknown.clear(); +} + +void TabRunner::showInForestList(gdioutput &gdi) +{ + gdi.clearPage(false); + currentMode = 2; + gdi.dropLine(0.5); + gdi.addString("", boldLarge, "Hantera kvar-i-skogen"); + addToolbar(gdi); + gdi.dropLine(); + gdi.setRestorePoint("Help"); + gdi.addString("", 10, "help:425188"); + gdi.dropLine(); + gdi.pushX(); + gdi.fillRight(); + gdi.addButton("Import", "Importera stämplingar...", SportIdentCB).setExtra(1); + + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Vacancy)) { + vector rr; + oe->getRunners(0, 0, rr, false); + bool hasVac = false; + for (size_t k = 0; k < rr.size(); k++) { + if (rr[k]->isVacant()) { + hasVac = true; + break; + } + } + if (hasVac) { + gdi.addButton("RemoveVacant", "Radera vakanser", RunnerCB); + } + } + gdi.addButton("SetDNS", "Sätt okända löpare utan registrering till ", RunnerCB); + gdi.fillDown(); + gdi.addButton("SetUnknown", "Återställ löpare med registrering till ", RunnerCB); + gdi.dropLine(); + gdi.popX(); + + clearInForestData(); + oe->analyseDNS(unknown_dns, known_dns, known, unknown); + oe->setupCardHash(false); + if (!unknown.empty()) { + gdi.dropLine(); + gdi.dropLine(0.5); + gdi.addString("", 1, "Löpare, Status Okänd, som saknar registrering"); + listRunners(gdi, unknown, true); + } + else { + gdi.disableInput("SetDNS"); + } + + if (!known.empty()) { + gdi.dropLine(); + gdi.addString("", 1, "Löpare, Status Okänd, med registrering (kvar-i-skogen)"); + gdi.dropLine(0.5); + listRunners(gdi, known, false); + } + + if (!known_dns.empty()) { + gdi.dropLine(); + gdi.addString("", 1, "Löpare, Ej Start, med registrering (kvar-i-skogen!?)"); + gdi.dropLine(0.5); + listRunners(gdi, known_dns, false); + } + else + gdi.disableInput("SetUnknown"); + + oe->setupCardHash(true); + + if (known.empty() && unknown.empty() && known_dns.empty()) { + gdi.addString("", 10, "inforestwarning"); + } + + gdi.refresh(); +} + +void TabRunner::listRunners(gdioutput &gdi, const vector &r, bool filterVacant) const +{ + char bf[64]; + int yp = gdi.getCY(); + int xp = gdi.getCX(); + vector out; + for (size_t k=0; kisVacant()) + continue; + sprintf_s(bf, "%d.", k+1); + gdi.addStringUT(yp, xp, 0, bf); + gdi.addStringUT(yp, xp+40, 0, r[k]->getNameAndRace(true), 190); + gdi.addStringUT(yp, xp+200, 0, r[k]->getClass(), 140); + gdi.addStringUT(yp, xp+350, 0, r[k]->getClub(), 190); + int c = r[k]->getCardNo(); + if (c>0) { + oe->getRunnersByCardNo(c, true, true, out); + if (out.size() <= 1) { + gdi.addStringUT(yp, xp+550, 0, "(" + itos(c) + ")", 190); + } + else { + TextInfo &ti = gdi.addStringUT(yp, xp+550, 0, "(" + itos(c) + ", " + lang.tl("reused card") + ")", 100); + string tt; + for (size_t j = 0; j < out.size(); j++) { + if (out[j] == r[k]->getMultiRunner(0)) + continue; + if (!tt.empty()) + tt += ", "; + tt += out[j]->getName(); + } + gdi.addToolTip(ti.id, tt, 0, &ti.textRect); + } + } + yp += gdi.getLineHeight(); + } +} + +void TabRunner::cellAction(gdioutput &gdi, DWORD id, oBase *obj) +{ + if (id==TID_RUNNER || id==TID_CARD) { + gdi.disableTables(); + pCard c=dynamic_cast(obj); + if (c) { + gdi.setRestorePoint("CardTable"); + int orgx=gdi.getCX(); + gdi.dropLine(1); + gdi.setCY(cardModeStartY); + gdi.scrollTo(orgx, cardModeStartY); + gdi.addString("", fontMediumPlus, "Para ihop bricka X med en deltagare#" + itos(c->getCardNo())).setColor(colorDarkGreen); + gdi.dropLine(0.5); + + string name = c->getOwner() ? c->getOwner()->getName() : MakeDash("-"); + gdi.addString("", 0, "Nuvarande innehavare: X.#" + name); + + gdi.dropLine(1); + gdi.pushX(); + gdi.fillRight(); + gdi.addListBox("Card", 150, 300, 0, "Vald bricka:"); + c->fillPunches(gdi, "Card", 0); + gdi.disableInput("Card"); + + gdi.pushX(); + gdi.fillRight(); + gdi.popX(); + + gdi.fillDown(); + gdi.addListBox("Runners", 350, 300, 0, "Deltagare:"); + gdi.setTabStops("Runners", 200, 300); + oe->fillRunners(gdi, "Runners", true, oEvent::RunnerFilterShowAll); + if (c->getOwner()) + gdi.selectItemByData("Runners", c->getOwner()->getId()); + + gdi.popX(); + gdi.fillRight(); + gdi.addInput("SearchText", "", 15).setBgColor(colorLightCyan); + gdi.addButton("Search", "Sök deltagare", RunnerCB, "Sök på namn, bricka eller startnummer."); + + gdi.popX(); + gdi.dropLine(3); + gdi.addButton("Pair", "Para ihop", RunnerCB).setExtra(c->getId()); + gdi.addButton("Unpair", "Sätt som oparad", RunnerCB).setExtra(c->getId()); + gdi.addButton("Cancel", "Avbryt", RunnerCB); + gdi.fillDown(); + gdi.popX(); + gdi.refresh(); + } + } +} + +void disablePunchCourseAdd(gdioutput &gdi) +{ + gdi.disableInput("AddC"); + gdi.disableInput("AddAllC"); + gdi.selectItemByData("Course", -1); +} + +const string &TabRunner::getSearchString() const { + return lang.tl("Sök (X)#Ctrl+F"); +} + +void disablePunchCourseChange(gdioutput &gdi) +{ + gdi.disableInput("SaveC"); + gdi.disableInput("RemoveC"); + gdi.disableInput("PTime"); + gdi.setText("PTime", ""); + gdi.selectItemByData("Punches", -1); + +} + +void disablePunchCourse(gdioutput &gdi) +{ + disablePunchCourseAdd(gdi); + disablePunchCourseChange(gdi); +} + +void UpdateStatus(gdioutput &gdi, pRunner r) +{ + if (!r) return; + + gdi.setText("Start", r->getStartTimeS()); + gdi.setText("Finish", r->getFinishTimeS()); + gdi.setText("Time", r->getRunningTimeS()); + gdi.selectItemByData("Status", r->getStatus()); + gdi.setText("RunnerInfo", lang.tl(r->getProblemDescription()), true); +} + +int TabRunner::punchesCB(gdioutput &gdi, int type, void *data) +{ + DWORD rid=runnerId; + if (!rid) + return 0; + + pRunner r=oe->getRunner(rid, 0); + + if (!r){ + gdi.alert("Deltagaren måste sparas innan stämplingar kan hanteras."); + return 0; + } + + + if (type==GUI_LISTBOX){ + ListBoxInfo bi=*(ListBoxInfo *)data; + + if (bi.id=="Punches") { + if (bi.data != -1) { + pCard card=r->getCard(); + if (!card) return 0; + pPunch punch = card->getPunchByIndex(bi.data); + if (!punch) + throw meosException("Punch not found."); + + string ptime=punch->getTime();//;card->getPunchTime(punch); + + if (ptime!="") { + gdi.enableInput("SaveC"); + gdi.setText("PTime", ptime); + } + gdi.enableInput("RemoveC"); + gdi.enableInput("PTime"); + } + else { + gdi.disableInput("SaveC"); + gdi.disableInput("RemoveC"); + gdi.setText("PTime", ""); + } + disablePunchCourseAdd(gdi); + } + else if (bi.id=="Course") { + if (signed(bi.data)>=0) { + pCourse pc=r->getCourse(true); + + if (!pc) return 0; + + gdi.enableInput("AddC"); + gdi.enableInput("AddAllC"); + } + else{ + gdi.disableInput("AddC"); + gdi.disableInput("AddAllC"); + } + disablePunchCourseChange(gdi); + } + } + else if (type==GUI_BUTTON){ + ButtonInfo bi=*(ButtonInfo *)data; + pCard card=r->getCard(); + + if (!card){ + if (!gdi.ask("ask:addpunches")) + return 0; + + card=oe->allocateCard(r); + + card->setCardNo(r->getCardNo()); + vector mp; + r->addPunches(card, mp); + + } + + if (bi.id=="AddC"){ + vector mp; + r->evaluateCard(true, mp); + + pCourse pc=r->getCourse(true); + + if (!pc) return 0; + + ListBoxInfo lbi; + + if (!gdi.getSelectedItem("Course", lbi)) + return 0; + + oControl *oc=pc->getControl(lbi.data); + + if (!oc) return 0; + vector nmp; + + if (oc->getStatus() == oControl::StatusRogaining) { + r->evaluateCard(true, nmp, oc->getFirstNumber()); //Add this punch + } + else { + for (size_t k = 0; khasNumber(mp[k])) + r->evaluateCard(true, nmp, mp[k]); //Add this punch + } + } + //synchronize SQL + card->synchronize(); + r->synchronize(true); + r->evaluateCard(true, mp); + card->fillPunches(gdi, "Punches", pc); + UpdateStatus(gdi, r); + } + else if (bi.id=="AddAllC"){ + vector mp; + r->evaluateCard(true, mp); + vector::iterator it=mp.begin(); + + + while(it!=mp.end()){ + vector nmp; + r->evaluateCard(true, nmp, *it); //Add this punch + ++it; + if (nmp.empty()) + break; + } + + //synchronize SQL + card->synchronize(); + r->synchronize(true); + r->evaluateCard(true, mp); + card->fillPunches(gdi, "Punches", r->getCourse(true)); + UpdateStatus(gdi, r); + } + else if (bi.id=="SaveC"){ + //int time=oe->GetRelTime(); + + ListBoxInfo lbi; + + if (!gdi.getSelectedItem("Punches", lbi)) + return 0; + + pCard pc=r->getCard(); + + if (!pc) return 0; + + pPunch pp = pc->getPunchByIndex(lbi.data); + + if (!pp) + throw meosException("Punch not found."); + + pc->setPunchTime(pp, gdi.getText("PTime")); + + vector mp; + r->evaluateCard(true, mp); + + //synchronize SQL + card->synchronize(); + r->synchronize(); + r->evaluateCard(true, mp); + card->fillPunches(gdi, "Punches", r->getCourse(true)); + UpdateStatus(gdi, r); + gdi.selectItemByData("Punches", lbi.data); + } + } + return 0; +} + +bool TabRunner::loadPage(gdioutput &gdi) +{ + oe->reEvaluateAll(set(), true); + + if (oe->isReadOnly()) + currentMode = 5; // Evaluate result + else { + clearInForestData(); + gdi.selectTab(tabId); + } + gdi.clearPage(false); + int basex=gdi.getCX(); + + if (currentMode == 1) { + Table *tbl=oe->getRunnersTB(); + addToolbar(gdi); + gdi.dropLine(1); + gdi.addTable(tbl, basex, gdi.getCY()); + return true; + } + else if (currentMode == 2) { + showInForestList(gdi); + return true; + } + else if (currentMode == 3) { + showCardsList(gdi); + return true; + } + else if (currentMode == 4) { + showVacancyList(gdi, "add"); + return true; + } + else if (currentMode == 5) { + showRunnerReport(gdi); + return true; + } + + currentMode = 0; + + gdi.pushX(); + gdi.dropLine(0.5); + gdi.addString("", boldLarge, "Deltagare"); + gdi.fillRight(); + gdi.registerEvent("SearchRunner", runnerSearchCB).setKeyCommand(KC_FIND); + gdi.registerEvent("SearchRunnerBack", runnerSearchCB).setKeyCommand(KC_FINDBACK); + + gdi.addInput("SearchText", getSearchString(), 13, runnerSearchCB, "", + "Sök på namn, bricka eller startnummer.").isEdit(false) + .setBgColor(colorLightCyan).ignore(true); + gdi.dropLine(-0.2); + //gdi.addButton("Search", "Sök", RunnerCB, "Sök på namn, bricka eller startnummer."); + gdi.addButton("ShowAll", "Visa alla", RunnerCB).isEdit(false); + gdi.dropLine(2); + gdi.popX(); + + gdi.fillDown(); + gdi.addListBox("Runners", 206, 420, RunnerCB).isEdit(false).ignore(true); + gdi.setInputFocus("Runners"); + fillRunnerList(gdi); + + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Vacancy)) { + gdi.fillRight(); + gdi.addButton("Move", "Klassbyte", RunnerCB); + gdi.addButton("NoStart", "Återbud", RunnerCB); + } + + gdi.newColumn(); + gdi.fillDown(); + + gdi.dropLine(1); + gdi.fillRight(); + gdi.pushX(); + gdi.addInput("Name", "", 16, 0, "Namn:"); + + if (oe->hasBib(true, false)) { + gdi.addInput("Bib", "", 4, 0, "Nr", "Nummerlapp"); + } + gdi.popX(); + gdi.dropLine(3); + + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Clubs)) { + gdi.fillDown(); + gdi.addCombo("Club", 220, 300, 0, "Klubb:"); + oe->fillClubs(gdi, "Club"); + gdi.pushX(); + } + + if (oe->hasTeam()) { + gdi.fillRight(); + gdi.addInput("Team", "", 16, 0, "Lag:").isEdit(false); + gdi.disableInput("Team"); + gdi.fillDown(); + gdi.dropLine(0.9); + gdi.addButton("EditTeam", "...", RunnerCB, "Hantera laget"); + gdi.popX(); + } + + gdi.fillRight(); + gdi.addSelection("RClass", 150, 300, RunnerCB, "Klass:"); + oe->fillClasses(gdi, "RClass", oEvent::extraNone, oEvent::filterNone); + gdi.addItem("RClass", lang.tl("Ingen klass"), 0); + + gdi.fillDown(); + + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Economy)) + gdi.addInput("Fee", "", 6, 0, "Avgift:"); + else + gdi.dropLine(3); + + gdi.dropLine(0.4); + + if (oe->hasMultiRunner()) { + gdi.fillRight(); + gdi.popX(); + gdi.addString("", 0, "Välj lopp:"); + gdi.fillDown(); + gdi.dropLine(-0.2); + gdi.addSelection("MultiR", 160, 100, RunnerCB); + } + + gdi.popX(); + + int numSL = numShorteningLevels(); + if (numSL > 0) + gdi.fillRight(); + + gdi.addSelection("RCourse", numSL == 0 ? 220 : 180, 300, RunnerCB, "Bana:"); + oe->fillCourses(gdi, "RCourse", true); + gdi.addItem("RCourse", lang.tl("[Klassens bana]"), 0); + + if (numSL > 0) { + gdi.fillDown(); + gdi.addSelection("NumShort", 60, 300, RunnerCB, "Avkortning:"); + vector< pair > data; + if (numSL == 1) { + data.push_back(make_pair(lang.tl("Nej"), 0)); + data.push_back(make_pair(lang.tl("Ja"), 1)); + } + else { + data.push_back(make_pair(lang.tl("Nej"), 0)); + for (int i = 1; i <= numSL; i++) { + data.push_back(make_pair(itos(i), i)); + } + } + gdi.addItem("NumShort", data); + gdi.popX(); + } + + gdi.pushX(); + gdi.fillRight(); + gdi.addInput("CardNo", "", 8, RunnerCB, "Bricka:"); + gdi.dropLine(1); + gdi.addCheckbox("RentCard", "Hyrd", 0, false); + + gdi.dropLine(2); + gdi.popX(); + + gdi.addInput("Start", "", 8, 0, "Starttid:"); + gdi.addInput("Finish", "", 8, 0, "Måltid:"); + + const bool timeAdjust = oe->getMeOSFeatures().hasFeature(MeOSFeatures::TimeAdjust); + const bool pointAdjust = oe->getMeOSFeatures().hasFeature(MeOSFeatures::PointAdjust); + + if (timeAdjust || pointAdjust) { + gdi.dropLine(3); + gdi.popX(); + if (timeAdjust) { + gdi.addInput("TimeAdjust", "", 8, 0, "Tidstillägg:"); + } + if (pointAdjust) { + gdi.addInput("PointAdjust", "", 8, 0, "Poängavdrag:"); + } + } + gdi.dropLine(3); + gdi.popX(); + + gdi.addInput("Time", "", 8, 0, "Tid:").isEdit(false).ignore(true); + gdi.disableInput("Time"); + + if (oe->hasRogaining()) { + gdi.addInput("Points", "", 5, 0, "Poäng:").isEdit(false).ignore(true); + gdi.disableInput("Points"); + } + + gdi.fillDown(); + gdi.addSelection("Status", 100, 80, 0, "Status:", "tooltip_explain_status"); + oe->fillStatus(gdi, "Status"); + gdi.autoGrow("Status"); + gdi.popX(); + gdi.selectItemByData("Status", 0); + + gdi.addString("RunnerInfo", 1, "").setColor(colorRed); + + const bool multiDay = oe->hasPrevStage(); + + if (multiDay) { + gdi.dropLine(1.2); + + int xx = gdi.getCX(); + int yy = gdi.getCY(); + gdi.dropLine(0.5); + gdi.fillDown(); + int dx = int(gdi.getLineHeight()*0.7); + int ccx = xx + dx; + gdi.setCX(ccx); + gdi.addString("", 1, "Resultat från tidigare etapper"); + gdi.dropLine(0.3); + gdi.fillRight(); + + gdi.addSelection("StatusIn", 100, 160, 0, "Status:", "tooltip_explain_status"); + oe->fillStatus(gdi, "StatusIn"); + gdi.selectItemByData("Status", 0); + gdi.addInput("PlaceIn", "", 5, 0, "Placering:"); + int xmax = gdi.getCX() + dx; + gdi.setCX(ccx); + gdi.dropLine(3); + gdi.addInput("TimeIn", "", 5, 0, "Tid:"); + if (oe->hasRogaining()) { + gdi.addInput("PointIn", "", 5, 0, "Poäng:"); + } + gdi.dropLine(3); + RECT rc; + rc.right = xx; + rc.top = yy; + rc.left = max(xmax, gdi.getWidth()-dx); + rc.bottom = gdi.getCY(); + + gdi.addRectangle(rc, colorLightGreen, true, false); + gdi.dropLine(); + gdi.popX(); + } + else + gdi.dropLine(1.0); + + gdi.fillRight(); + gdi.addButton("Save", "Spara", RunnerCB, "help:save").setDefault(); + gdi.addButton("Undo", "Ångra", RunnerCB); + gdi.dropLine(2.2); + gdi.popX(); + gdi.addButton("Remove", "Radera", RunnerCB); + gdi.addButton("Add", "Ny deltagare", RunnerCB); + enableControlButtons(gdi, false, false); + gdi.fillDown(); + + gdi.newColumn(); + int hx = gdi.getCX(); + int hy = gdi.getCY(); + gdi.setCX(hx + gdi.scaleLength(5)); + + gdi.dropLine(2.5); + gdi.addListBox("Punches", 150, 300, PunchesCB, "Stämplingar:").ignore(true); + gdi.addButton("RemoveC", "Ta bort stämpling >>", RunnerCB); + + gdi.pushX(); + gdi.fillRight(); + gdi.addInput("PTime", "", 8, 0, "", "Stämplingstid"); + gdi.fillDown(); + gdi.addButton("SaveC", "Spara tid", PunchesCB); + gdi.popX(); + gdi.dropLine(); + int contX = gdi.getCX(); + int contY = gdi.getCY(); + + gdi.newColumn(); + gdi.dropLine(2.5); + gdi.fillDown(); + gdi.addListBox("Course", 140, 300, PunchesCB, "Banmall:").ignore(true); + gdi.addButton("AddC", "<< Lägg till stämpling", PunchesCB); + gdi.addButton("AddAllC", "<< Lägg till alla", PunchesCB); + + gdi.synchronizeListScroll("Punches", "Course"); + disablePunchCourse(gdi); + + gdi.setCX(contX); + gdi.setCY(contY); + gdi.addString("", fontMediumPlus, "Utskrift"); + + gdi.dropLine(0.2); + gdi.fillRight(); + gdi.addButton(gdi.getCX(), gdi.getCY(), gdi.scaleLength(120), "SplitPrint", + "Skriv ut sträcktider", RunnerCB, "", false, false).isEdit(true).setExtra(0); + gdi.addButton("PrintSettings", "...", RunnerCB, "Inställningar").isEdit(true).setExtra(0); + + gdi.dropLine(2.5); + gdi.setCX(contX); + gdi.addButton(gdi.getCX(), gdi.getCY(), gdi.scaleLength(120), "SplitPrint", + "Skriv ut startbevis", RunnerCB, "", false, false).isEdit(true).setExtra(1); + gdi.addButton("PrintSettings", "...", RunnerCB, "Inställningar").isEdit(true).setExtra(1); + gdi.pushY(); + + int by = gdi.getHeight(); + int bx = gdi.getWidth(); + RECT box = {hx-gdi.scaleLength(5), hy, bx + gdi.scaleLength(5), by}; + gdi.addString("", hy + gdi.scaleLength(5), hx + gdi.scaleLength(5), fontMediumPlus, "Brickhantering"); + gdi.addRectangle(box, colorLightBlue, true, false).set3D(true).id = "CardRect"; + + gdi.fillDown(); + gdi.setCY(gdi.getHeight()); + gdi.setCX(gdi.scaleLength(100)); + + //gdi.addString("", 10, "help:41072"); + + gdi.registerEvent("LoadRunner", RunnerCB); + + gdi.setOnClearCb(RunnerCB); + + addToolbar(gdi); + + selectRunner(gdi, oe->getRunner(runnerId, 0)); + gdi.refresh(); + return true; +} + +void TabRunner::addToolbar(gdioutput &gdi) { + + const int button_w=gdi.scaleLength(130); + int dx = 2; + + gdi.addButton(dx, 2, button_w, "FormMode", + "Formulärläge", RunnerCB, "", false, true).fixedCorner(); + gdi.check("FormMode", currentMode==0); + dx += button_w; + + gdi.addButton(dx, 2, button_w, "TableMode", + "Tabelläge", RunnerCB, "", false, true).fixedCorner(); + gdi.check("TableMode", currentMode==1); + dx += button_w; + + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::InForest)) { + gdi.addButton(dx, 2, button_w, "InForest", + "Kvar-i-skogen", RunnerCB, "", false, true).fixedCorner(); + gdi.check("InForest", currentMode==2); + dx += button_w; + } + + gdi.addButton(dx, 2 ,button_w, "Cards", + "Hantera brickor", RunnerCB, "", false, true).fixedCorner(); + gdi.check("Cards", currentMode==3); + dx += button_w; + + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Vacancy)) { + gdi.addButton(dx, 2 ,button_w, "Vacancy", + "Vakanser", RunnerCB, "", false, true).fixedCorner(); + gdi.check("Vacancy", currentMode==4); + dx += button_w; + } + + gdi.addButton(dx, 2 ,button_w, "ReportMode", + "Rapportläge", RunnerCB, "", false, true).fixedCorner(); + gdi.check("ReportMode", currentMode==5); + dx += button_w; + +} + +void TabRunner::fillRunnerList(gdioutput &gdi) { + bool formMode = currentMode == 0; + timeToFill = GetTickCount(); + oe->fillRunners(gdi, "Runners", !formMode, formMode ? 0 : oEvent::RunnerFilterShowAll); + timeToFill = GetTickCount() - timeToFill; + if (formMode) { + lastSearchExpr = ""; + ((InputInfo *)gdi.setText("SearchText", getSearchString()))->setFgColor(colorGreyBlue); + lastFilter.clear(); + } +} + +bool TabRunner::canSetStart(pRunner r) const { + pClass pc = r->getTeam() ? r->getTeam()->getClassRef() : r->getClassRef(); + + if (pc && pc->getNumStages() > 0) { + StartTypes st = pc->getStartType(r->getLegNumber()); + if (st != STDrawn) + return false; + } + if (pc && !pc->ignoreStartPunch()) { + int startType = oPunch::PunchStart; + if (r->getCourse(false)) + startType = r->getCourse(false)->getStartPunchType(); + + pCard c = r->getCard(); + if (c && c->getPunchByType(startType)) + return false; + } + return true; +} + +bool TabRunner::canSetFinish(pRunner r) const { + pCard c = r->getCard(); + int finishPunch = oPunch::PunchFinish; + if (r->getCourse(false)) + finishPunch = r->getCourse(false)->getFinishPunchType(); + if (c && c->getPunchByType(finishPunch)) + return false; + + return true; +} + +pRunner TabRunner::warnDuplicateCard(int cno, pRunner r) { + pRunner warnCardDupl = 0; + + if (!r->getCard()) { + vector allR; + oe->getRunners(0, 0, allR, false); + for (size_t k = 0; k < allR.size(); k++) { + if (!r->canShareCard(allR[k], cno)) { + warnCardDupl = allR[k]; + break; + } + } + } + return warnCardDupl; +} + +void TabRunner::warnDuplicateCard(gdioutput &gdi, int cno, pRunner r) { + pRunner warnCardDupl = warnDuplicateCard(cno, r); + + InputInfo &cardNo = dynamic_cast(gdi.getBaseInfo("CardNo")); + if (warnCardDupl) { + cardNo.setBgColor(colorLightRed); + gdi.updateToolTip("CardNo", "Brickan används av X.#" + warnCardDupl->getCompleteIdentification()); + cardNo.refresh(); + } + else { + if (cardNo.getBgColor() != colorDefault) { + cardNo.setBgColor(colorDefault); + gdi.updateToolTip("CardNo", ""); + cardNo.refresh(); + } + } +} + +int TabRunner::numShorteningLevels() const { + vector allCrs; + oe->getCourses(allCrs); + set touch; + map known; + int res = 0; + for (size_t k = 0; k < allCrs.size(); k++) { + pCourse sh = allCrs[k]->getShorterVersion(); + touch.clear(); + int count = 0; + while (sh && !touch.count(sh->getId())) { + count++; + map::iterator r = known.find(sh->getId()); + if (r != known.end()) { + count += r->second; + break; + } + touch.insert(sh->getId()); + sh = sh->getShorterVersion(); + } + known[allCrs[k]->getId()] = count; + res = max(res, count); + } + return res; +} + +void TabRunner::updateNumShort(gdioutput &gdi, pCourse crs, pRunner r) { + if (gdi.hasField("NumShort")) { + if (crs && crs->getShorterVersion()) { + gdi.enableInput("NumShort"); + if (r) + gdi.selectItemByData("NumShort", r->getNumShortening()); + else + gdi.selectFirstItem("NumShort"); + } + else { + gdi.disableInput("NumShort"); + gdi.selectFirstItem("NumShort"); + } + } +} + +void TabRunner::clearCompetitionData() { + inputId = 0; + lastRace=0; + currentMode = 0; + runnerId=0; + timeToFill = 0; + ownWindow = false; + listenToPunches = false; +} + +void TabRunner::autoGrowCourse(gdioutput &gdi) { + ListBoxInfo &crsCtrl = dynamic_cast(gdi.getBaseInfo("Course")); + int wInit = crsCtrl.getWidth(); + if (gdi.autoGrow("Course")) { + RectangleInfo &rc = gdi.getRectangle("CardRect"); + int wAfter = crsCtrl.getWidth(); + rc.changeDimension(gdi, wAfter - wInit, 0); + gdi.refresh(); + } +} diff --git a/code/TabRunner.h b/code/TabRunner.h new file mode 100644 index 0000000..0df591d --- /dev/null +++ b/code/TabRunner.h @@ -0,0 +1,114 @@ +#pragma once +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ +#include "tabbase.h" +#include "Printer.h" + +class Table; + +class TabRunner : + public TabBase +{ +private: + void addToolbar(gdioutput &gdi); + + const string &getSearchString() const; + + void setCardNo(gdioutput &gdi, int cardNo); + + void enableControlButtons(gdioutput &gdi, bool enable, bool vacant); + + void cellAction(gdioutput &gdi, DWORD id, oBase *obj); + + void selectRunner(gdioutput &gdi, pRunner r); + + string lastSearchExpr; + stdext::hash_set lastFilter; + DWORD timeToFill; + int inputId; + int searchCB(gdioutput &gdi, int type, void *data); + + int runnerCB(gdioutput &gdi, int type, void *data); + int punchesCB(gdioutput &gdi, int type, void *data); + int vacancyCB(gdioutput &gdi, int type, void *data); + + int currentMode; + pRunner save(gdioutput &gdi, int runnerId, bool dontReloadRunners); + void listRunners(gdioutput &gdi, const vector &r, bool filterVacant) const; + + void fillRunnerList(gdioutput &gdi); + + int cardModeStartY; + int lastRace; + string lastFee; + int runnerId; + bool ownWindow; + bool listenToPunches; + vector< pair > runnersToReport; + + vector unknown_dns; + vector known_dns; + vector known; + vector unknown; + void clearInForestData(); + + PrinterObject splitPrinter; + + void showRunnerReport(gdioutput &gdi); + void runnerReport(gdioutput &gdi, int id, bool compactReport); + + void showVacancyList(gdioutput &gdi, const string &method="", int classId=0); + void showCardsList(gdioutput &gdi); + + bool canSetStart(pRunner r) const; + bool canSetFinish(pRunner r) const; + + void warnDuplicateCard(gdioutput &gdi, int cno, pRunner r); + pRunner warnDuplicateCard(int cno, pRunner r); + + int numShorteningLevels() const; + + void updateNumShort(gdioutput &gdi, pCourse crs, pRunner r); + + static void autoGrowCourse(gdioutput &gdi); + +protected: + void clearCompetitionData(); + +public: + + const char * getTypeStr() const {return "TRunnerTab";} + TabType getType() const {return TRunnerTab;} + + void showInForestList(gdioutput &gdi); + + bool loadPage(gdioutput &gdi); + bool loadPage(gdioutput &gdi, int runnerId); + + TabRunner(oEvent *oe); + ~TabRunner(void); + + friend int runnerSearchCB(gdioutput *gdi, int type, void *data); + friend int RunnerCB(gdioutput *gdi, int type, void *data); + friend int PunchesCB(gdioutput *gdi, int type, void *data); + friend int VacancyCB(gdioutput *gdi, int type, void *data); +}; diff --git a/code/TabSI.cpp b/code/TabSI.cpp new file mode 100644 index 0000000..024ea54 --- /dev/null +++ b/code/TabSI.cpp @@ -0,0 +1,3584 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" + +#include "resource.h" + +#include +#include +#include + +#include "oEvent.h" +#include "xmlparser.h" +#include "gdioutput.h" +#include "gdifonts.h" +#include "gdiconstants.h" + +#include "csvparser.h" + +#include "TabSI.h" +#include "TabAuto.h" +#include "TabList.h" +#include "meos_util.h" +#include +#include "TabRunner.h" +#include "meosexception.h" +#include "MeOSFeatures.h" +#include "RunnerDB.h" +#include "recorder.h" + +TabSI::TabSI(oEvent *poe):TabBase(poe) { + editCardData.tabSI = this; + interactiveReadout=poe->getPropertyInt("Interactive", 1)!=0; + useDatabase=poe->useRunnerDb() && poe->getPropertyInt("Database", 1)!=0; + printSplits = false; + printStartInfo = false; + savedCardUniqueId = 1; + + manualInput = poe->getPropertyInt("ManualInput", 0) == 1; + + mode=ModeReadOut; + currentAssignIndex=0; + + lastClubId=0; + lastClassId=0; + logger = 0; + + minRunnerId = 0; + inputId = 0; + printErrorShown = false; + NC = 8; +} + +TabSI::~TabSI(void) +{ + if (logger!=0) + delete logger; + logger = 0; +} + + +static void entryTips(gdioutput &gdi) { + gdi.fillDown(); + gdi.addString("", 10, "help:21576"); + gdi.dropLine(1); + gdi.setRestorePoint("EntryLine"); +} + + +void TabSI::logCard(const SICard &card) +{ + if (logger == 0) { + logger = new csvparser; + string readlog = "sireadlog_" + getLocalTimeFileName() + ".csv"; + char file[260]; + string subfolder = makeValidFileName(oe->getName(), true); + const char *sf = subfolder.empty() ? 0 : subfolder.c_str(); + getDesktopFile(file, readlog.c_str(), sf); + logger->openOutput(file); + vector head = SICard::logHeader(); + logger->OutputRow(head); + logcounter = 0; + } + + vector log = card.codeLogData(++logcounter); + logger->OutputRow(log); +} + +extern SportIdent *gSI; +extern pEvent gEvent; + +void LoadRunnerPage(gdioutput &gdi); + + +int SportIdentCB(gdioutput *gdi, int type, void *data) +{ + TabSI &tsi = dynamic_cast(*gdi->getTabs().get(TSITab)); + + return tsi.siCB(*gdi, type, data); +} + +int TabSI::siCB(gdioutput &gdi, int type, void *data) +{ + if (type==GUI_BUTTON) { + ButtonInfo bi=*(ButtonInfo *)data; + + if (bi.id == "ClearMemory") { + if (gdi.ask("Do you want to clear the card memory?")) { + savedCards.clear(); + loadPage(gdi); + } + } + else if (bi.id == "SaveMemory") { + vector< pair > ext; + ext.push_back(make_pair("Semikolonseparerad (csv)", "*.csv")); + + int filterIx = 0; + string file = gdi.browseForSave(ext, "csv", filterIx); + if (!file.empty()) { + csvparser saver; + saver.openOutput(file.c_str()); + vector head = SICard::logHeader(); + saver.OutputRow(head); + int count = 0; + for (list< pair >::const_iterator it = savedCards.begin(); it != savedCards.end(); ++it) { + vector log = it->second.codeLogData(++count); + saver.OutputRow(log); + } + } + } + else if (bi.id == "CreateCompetition") { + createCompetitionFromCards(gdi); + } + else if (bi.id=="SIPassive") { + string port=gdi.getText("ComPortName"); + if (gSI->OpenComListen(port.c_str(), gdi.getTextNo("BaudRate"))) { + gSI->StartMonitorThread(port.c_str()); + loadPage(gdi); + gdi.addString("", 1, "Lyssnar på X.#"+port).setColor(colorDarkGreen); + } + else + gdi.addString("", 1, "FEL: Porten kunde inte öppnas").setColor(colorRed); + gdi.dropLine(); + gdi.refresh(); + } + else if (bi.id=="CancelTCP") + gdi.restore("TCP"); + else if (bi.id=="StartTCP") { + gSI->tcpAddPort(gdi.getTextNo("tcpPortNo"), 0); + gdi.restore("TCP"); + gSI->StartMonitorThread("TCP"); + + printSIInfo(gdi, "TCP"); + + gdi.dropLine(0.5); + refillComPorts(gdi); + gdi.refresh(); + } + else if (bi.id=="StartSI") { + char bf[64]; + ListBoxInfo lbi; + if (gdi.getSelectedItem("ComPort", lbi)) { + + sprintf_s(bf, 64, "COM%d", lbi.data); + string port=bf; + + if (lbi.text.substr(0, 3)=="TCP") + port="TCP"; + + if (gSI->IsPortOpen(port)) { + gSI->CloseCom(port.c_str()); + gdi.addStringUT(0, lang.tl("Kopplar ifrån SportIdent på ") + port + lang.tl("... OK")); + gdi.popX(); + gdi.dropLine(); + refillComPorts(gdi); + } + else { + gdi.fillDown(); + if (port=="TCP") { + gdi.setRestorePoint("TCP"); + gdi.dropLine(); + gdi.pushX(); + gdi.fillRight(); + gdi.addInput("tcpPortNo", "10000", 8,0, "Port för TCP:"); + gdi.dropLine(); + gdi.addButton("StartTCP", "Starta", SportIdentCB); + gdi.addButton("CancelTCP", "Avbryt", SportIdentCB); + gdi.dropLine(2); + gdi.popX(); + gdi.fillDown(); + gdi.addString("", 10, "help:14070"); + gdi.scrollToBottom(); + gdi.refresh(); + return 0; + } + + gdi.addStringUT(0, lang.tl("Startar SI på")+" "+ port + "..."); + gdi.refresh(); + if (gSI->OpenCom(port.c_str())){ + gSI->StartMonitorThread(port.c_str()); + gdi.addStringUT(0, lang.tl("SI på")+" "+ port + ": "+lang.tl("OK")); + printSIInfo(gdi, port); + + SI_StationInfo *si = gSI->findStation(port); + if (si && !si->extended()) + gdi.addString("", boldText, "warn:notextended").setColor(colorDarkRed); + } + else{ + //Retry... + Sleep(300); + if (gSI->OpenCom(port.c_str())) { + gSI->StartMonitorThread(port.c_str()); + gdi.addStringUT(0, lang.tl("SI på") + " " + port + ": " + lang.tl("OK")); + printSIInfo(gdi, port); + + SI_StationInfo *si = gSI->findStation(port); + if (si && !si->extended()) + gdi.addString("", boldText, "warn:notextended").setColor(colorDarkRed); + } + else { + gdi.setRestorePoint(); + gdi.addStringUT(1, lang.tl("SI på") +" "+ port + ": " + lang.tl("FEL, inget svar.")).setColor(colorRed); + gdi.dropLine(); + gdi.refresh(); + + if (gdi.ask("help:9615")) { + + gdi.pushX(); + gdi.fillRight(); + gdi.addInput("ComPortName", port, 10, 0, "COM-Port:"); + //gdi.addInput("BaudRate", "4800", 10, 0, "help:baudrate"); + gdi.fillDown(); + gdi.addCombo("BaudRate", 130, 100, 0, "help:baudrate"); + gdi.popX(); + gdi.addItem("BaudRate", "4800", 4800); + gdi.addItem("BaudRate", "38400", 38400); + gdi.selectItemByData("BaudRate", 38400); + + + gdi.fillRight(); + gdi.addButton("SIPassive", "Lyssna...", SportIdentCB).setDefault(); + gdi.fillDown(); + gdi.addButton("Cancel", "Avbryt", SportIdentCB).setCancel(); + gdi.popX(); + } + } + } + gdi.popX(); + gdi.dropLine(); + refillComPorts(gdi); + } + gdi.refresh(); + } + } + else if (bi.id=="SIInfo") { + char bf[64]; + ListBoxInfo lbi; + if (gdi.getSelectedItem("ComPort", lbi)) + { + if (lbi.text.substr(0,3)=="TCP") + sprintf_s(bf, 64, "TCP"); + else + sprintf_s(bf, 64, "COM%d", lbi.data); + gdi.fillDown(); + gdi.addStringUT(0, lang.tl("Hämtar information om")+" "+string(bf)+"."); + printSIInfo(gdi, bf); + gdi.refresh(); + } + } + else if (bi.id=="AutoDetect") + { + gdi.fillDown(); + gdi.addString("", 0, "Söker efter SI-enheter... "); + gdi.refresh(); + list ports; + if (!gSI->AutoDetect(ports)) { + gdi.addString("SIInfo", 0, "help:5422"); + gdi.refresh(); + return 0; + } + char bf[128]; + gSI->CloseCom(0); + + while(!ports.empty()) { + int p=ports.front(); + sprintf_s(bf, 128, "COM%d", p); + + gdi.addString((string("SIInfo")+bf).c_str(), 0, "#" + lang.tl("Startar SI på") + " " + string(bf) + "..."); + gdi.refresh(); + if (gSI->OpenCom(bf)) { + gSI->StartMonitorThread(bf); + gdi.addStringUT(0, lang.tl("SI på") + " " + string(bf) + ": " + lang.tl("OK")); + printSIInfo(gdi, bf); + + SI_StationInfo *si = gSI->findStation(bf); + if (si && !si->extended()) + gdi.addString("", boldText, "warn:notextended").setColor(colorDarkRed); + } + else if (gSI->OpenCom(bf)) { + gSI->StartMonitorThread(bf); + gdi.addStringUT(0, lang.tl("SI på") + " " + string(bf) + ": " + lang.tl("OK")); + printSIInfo(gdi, bf); + + SI_StationInfo *si = gSI->findStation(bf); + if (si && !si->extended()) + gdi.addString("", boldText, "warn:notextended").setColor(colorDarkRed); + } + else gdi.addStringUT(0, lang.tl("SI på") + " " + string(bf) + ": " +lang.tl("FEL, inget svar")); + + gdi.refresh(); + gdi.popX(); + gdi.dropLine(); + ports.pop_front(); + } + } + else if (bi.id == "PrinterSetup") { + if (mode == ModeEntry) { + printStartInfo = true; + TabList::splitPrintSettings(*oe, gdi, true, TSITab, TabList::StartInfo); + } + else { + printSplits = true; + TabList::splitPrintSettings(*oe, gdi, true, TSITab, TabList::Splits); + } + } + else if (bi.id == "AutoTie") { + gEvent->setProperty("AutoTie", gdi.isChecked("AutoTie")); + } + else if (bi.id == "RentCardTie") { + gEvent->setProperty("RentCard", gdi.isChecked(bi.id)); + } + else if (bi.id == "TieOK") { + tieCard(gdi); + } + else if (bi.id=="Interactive") { + interactiveReadout=gdi.isChecked(bi.id); + gEvent->setProperty("Interactive", interactiveReadout); + + if (mode == ModeAssignCards) { + gdi.restore("ManualTie", false); + showAssignCard(gdi, false); + } + } + else if (bi.id=="Database") { + useDatabase=gdi.isChecked(bi.id); + gEvent->setProperty("Database", useDatabase); + } + else if (bi.id=="PrintSplits") { + printSplits=gdi.isChecked(bi.id); + } + else if (bi.id=="StartInfo") { + printStartInfo = gdi.isChecked(bi.id); + } + else if (bi.id == "UseManualInput") { + manualInput = gdi.isChecked("UseManualInput"); + oe->setProperty("ManualInput", manualInput ? 1 : 0); + gdi.restore("ManualInput"); + if (manualInput) + showManualInput(gdi); + } + else if (bi.id=="Import") { + int origin = bi.getExtraInt(); + + vector< pair > ext; + ext.push_back(make_pair("Semikolonseparerad (csv)", "*.csv")); + + string file = gdi.browseForOpen(ext, "csv"); + if (!file.empty()) { + gdi.restore("Help"); + csvparser csv; + csv.importCards(*oe, file.c_str(), cards); + if (cards.empty()) { + csv.importPunches(*oe, file.c_str(), punches); + if (!punches.empty()) { + gdi.dropLine(2); + gdi.addString("", 1, "Inlästa stämplar"); + set dates; + showReadPunches(gdi, punches, dates); + + filterDate.clear(); + filterDate.push_back(lang.tl("Inget filter")); + for (set::iterator it = dates.begin(); it!=dates.end(); ++it) + filterDate.push_back(*it); + + gdi.dropLine(2); + gdi.scrollToBottom(); + gdi.fillRight(); + gdi.pushX(); + gdi.addSelection("ControlType", 150, 300, 0, "Enhetstyp:"); + + vector< pair > d; + oe->fillControlTypes(d); + gdi.addItem("ControlType", d); + // oe->fillControlTypes(gdi, "ControlType"); + gdi.selectItemByData("ControlType", oPunch::PunchCheck); + + gdi.addSelection("Filter", 150, 300, 0, "Datumfilter:"); + for (size_t k = 0; k0; + string filter = lbi.data < filterDate.size() ? filterDate[lbi.data] : ""; + + gdi.restore("Help"); + for (size_t k=0;kaddFreePunch(punches[k].time, type, punches[k].card, true); + } + punches.clear(); + if (origin==1) { + TabRunner &tc = dynamic_cast(*gdi.getTabs().get(TRunnerTab)); + tc.showInForestList(gdi); + } + } + else if (bi.id=="SaveCards") { + int origin = bi.getExtraInt(); + gdi.restore("Help"); + oe->synchronizeList(oLCardId, true, false); + oe->synchronizeList(oLRunnerId, false, true); + for (size_t k=0;kreEvaluateAll(set(), true); + cards.clear(); + if (origin==1) { + TabRunner &tc = dynamic_cast(*gdi.getTabs().get(TRunnerTab)); + tc.showInForestList(gdi); + } + } + else if (bi.id=="Save") { + SICard sic; + sic.clear(0); + sic.CheckPunch.Code = -1; + sic.CardNumber=gdi.getTextNo("SI"); + int f = convertAbsoluteTimeHMS(gdi.getText("Finish"), oe->getZeroTimeNum()); + int s = convertAbsoluteTimeHMS(gdi.getText("Start"), oe->getZeroTimeNum()); + sic.FinishPunch.Time= f % (24*3600); + sic.StartPunch.Time = f % (24*3600); + if (!gdi.isChecked("HasFinish")) { + sic.FinishPunch.Code = -1; + sic.FinishPunch.Time = 0; + } + + if (!gdi.isChecked("HasStart")) { + sic.StartPunch.Code = -1; + sic.StartPunch.Time = 0; + } + + double t = 0.1; + for (sic.nPunch = 0; sic.nPunchaddCard(sic); + } + else if (bi.id=="SaveP") { + SICard sic; + sic.clear(0); + sic.FinishPunch.Code = -1; + sic.CheckPunch.Code = -1; + sic.StartPunch.Code = -1; + + sic.CardNumber=gdi.getTextNo("SI"); + int f=convertAbsoluteTimeHMS(gdi.getText("Finish"), oe->getZeroTimeNum()); + if (f > 0) { + sic.FinishPunch.Time = f; + sic.FinishPunch.Code = 1; + sic.PunchOnly = true; + gSI->addCard(sic); + return 0; + } + + int s=convertAbsoluteTimeHMS(gdi.getText("Start"), oe->getZeroTimeNum()); + if (s > 0) { + sic.StartPunch.Time = s; + sic.StartPunch.Code = 1; + sic.PunchOnly = true; + gSI->addCard(sic); + return 0; + } + + sic.Punch[sic.nPunch].Code=gdi.getTextNo("C1"); + sic.Punch[sic.nPunch].Time=convertAbsoluteTimeHMS(gdi.getText("C2"), oe->getZeroTimeNum()); + sic.nPunch = 1; + sic.PunchOnly = true; + gSI->addCard(sic); + } + else if (bi.id=="Cancel") { + int origin = bi.getExtraInt(); + activeSIC.clear(0); + punches.clear(); + if (origin==1) { + TabRunner &tc = dynamic_cast(*gdi.getTabs().get(TRunnerTab)); + tc.showInForestList(gdi); + return 0; + } + loadPage(gdi); + + checkMoreCardsInQueue(gdi); + return 0; + } + else if (bi.id=="OK1") { + string name=gdi.getText("Runners"); + string club=gdi.getText("Club", true); + + if (name.length()==0){ + gdi.alert("Alla deltagare måste ha ett namn."); + return 0; + } + + pRunner r=0; + DWORD rid; + bool lookup = true; + + if (gdi.getData("RunnerId", rid) && rid>0) { + r = gEvent->getRunner(rid, 0); + + if (r && r->getCard()) { + if (!askOverwriteCard(gdi, r)) { + r = 0; + lookup = false; + } + } + + if (r && stringMatch(r->getName(), name)) { + gdi.restore(); + //We have a match! + SICard copy = activeSIC; + activeSIC.clear(&activeSIC); + processCard(gdi, r, copy); + return 0; + } + } + + if (lookup) { + r = gEvent->getRunnerByName(name, club); + if (r && r->getCard()) { + if (!askOverwriteCard(gdi, r)) + r = 0; + } + } + + if (r) { + //We have a match! + gdi.setData("RunnerId", r->getId()); + + gdi.restore(); + SICard copy = activeSIC; + activeSIC.clear(&activeSIC); + processCard(gdi, r, copy); + return 0; + } + + //We have a new runner in our system + gdi.fillRight(); + gdi.pushX(); + + SICard si_copy=activeSIC; + gEvent->convertTimes(si_copy); + + //Find matching class... + vector classes; + int dist = gEvent->findBestClass(activeSIC, classes); + + if (classes.size()==1 && dist == 0 && si_copy.StartPunch.Time>0 && classes[0]->getType()!="tmp") { + //We have a match! + string club = gdi.getText("Club", true); + + if (club.length()==0 && oe->getMeOSFeatures().hasFeature(MeOSFeatures::Clubs)) + club=lang.tl("Klubblös"); + int year = 0; + pRunner r=gEvent->addRunner(gdi.getText("Runners"), club, + classes[0]->getId(), activeSIC.CardNumber, year, true); + + gdi.setData("RunnerId", r->getId()); + + gdi.restore(); + SICard copy = activeSIC; + activeSIC.clear(&activeSIC); + processCard(gdi, r, copy); + r->synchronize(); + return 0; + } + + + gdi.restore("restOK1", false); + gdi.popX(); + gdi.dropLine(2); + + gdi.addInput("StartTime", gEvent->getAbsTime(si_copy.StartPunch.Time), 8, 0, "Starttid:"); + + gdi.addSelection("Classes", 200, 300, 0, "Klass:"); + gEvent->fillClasses(gdi, "Classes", oEvent::extraNone, oEvent::filterNone); + gdi.setInputFocus("Classes"); + + if (classes.size()>0) + gdi.selectItemByData("Classes", classes[0]->getId()); + + gdi.dropLine(); + + gdi.setRestorePoint("restOK2"); + + gdi.addButton("Cancel", "Avbryt", SportIdentCB).setCancel(); + if (oe->getNumClasses() > 0) + gdi.addButton("OK2", "OK", SportIdentCB).setDefault(); + gdi.fillDown(); + + gdi.addButton("NewClass", "Skapa ny klass", SportIdentCB); + + gdi.popX(); + if (classes.size()>0) + gdi.addString("FindMatch", 0, "Press Enter to continue").setColor(colorGreen); + gdi.dropLine(); + + gdi.refresh(); + return 0; + } + else if (bi.id=="OK2") + { + //New runner in existing class... + + ListBoxInfo lbi; + gdi.getSelectedItem("Classes", lbi); + + if (lbi.data==0 || lbi.data==-1) { + gdi.alert("Du måste välja en klass"); + return 0; + } + pClass pc = oe->getClass(lbi.data); + if (pc && pc->getType()== "tmp") + pc->setType(""); + + string club = gdi.getText("Club", true); + + if (club.empty() && oe->getMeOSFeatures().hasFeature(MeOSFeatures::Clubs)) + club = lang.tl("Klubblös"); + + int year = 0; + pRunner r=gEvent->addRunner(gdi.getText("Runners"), club, + lbi.data, activeSIC.CardNumber, year, true); + + r->setStartTimeS(gdi.getText("StartTime")); + r->setCardNo(activeSIC.CardNumber, false); + + gdi.restore(); + SICard copy = activeSIC; + activeSIC.clear(&activeSIC); + processCard(gdi, r, copy); + } + else if (bi.id=="NewClass") { + gdi.restore("restOK2", false); + gdi.popX(); + gdi.dropLine(2); + gdi.fillRight(); + gdi.pushX(); + + gdi.addInput("ClassName", gEvent->getAutoClassName(), 10,0, "Klassnamn:"); + + gdi.dropLine(); + gdi.addButton("Cancel", "Avbryt", SportIdentCB).setCancel(); + gdi.fillDown(); + gdi.addButton("OK3", "OK", SportIdentCB).setDefault(); + gdi.setInputFocus("ClassName", true); + gdi.refresh(); + gdi.popX(); + } + else if (bi.id=="OK3") { + pCourse pc = 0; + pClass pclass = 0; + + if (oe->getNumClasses() == 1 && oe->getClass(1) != 0 && + oe->getClass(1)->getType() == "tmp" && + oe->getClass(1)->getNumRunners(false, false, false) == 0) { + pclass = oe->getClass(1); + pclass->setType(""); + pclass->setName(gdi.getText("ClassName")); + pc = pclass->getCourse(); + if (pc) + pc->setName(gdi.getText("ClassName")); + } + + if (pc == 0) { + pc=gEvent->addCourse(gdi.getText("ClassName")); + for(unsigned i=0;iaddControl(activeSIC.Punch[i].Code); + } + if (pclass == 0) { + pclass=gEvent->addClass(gdi.getText("ClassName"), pc->getId()); + } + else + pclass->setCourse(pc); + int year = 0; + pRunner r=gEvent->addRunner(gdi.getText("Runners"), gdi.getText("Club", true), + pclass->getId(), activeSIC.CardNumber, year, true); + + r->setStartTimeS(gdi.getText("StartTime")); + r->setCardNo(activeSIC.CardNumber, false); + gdi.restore(); + SICard copy_sic = activeSIC; + activeSIC.clear(&activeSIC); + processCard(gdi, r, copy_sic); + } + else if (bi.id=="OK4") { + //Existing runner in existing class... + + ListBoxInfo lbi; + gdi.getSelectedItem("Classes", lbi); + + if (lbi.data==0 || lbi.data==-1) + { + gdi.alert("Du måste välja en klass"); + return 0; + } + + DWORD rid; + pRunner r; + + if (gdi.getData("RunnerId", rid) && rid>0) + r = gEvent->getRunner(rid, 0); + else r = gEvent->addRunner(lang.tl("Oparad bricka"), lang.tl("Okänd"), 0, 0, 0, false); + + r->setClassId(lbi.data, true); + + gdi.restore(); + SICard copy = activeSIC; + activeSIC.clear(&activeSIC); + processCard(gdi, r, copy); + } + else if (bi.id=="EntryOK") { + storedInfo.clear(); + oe->synchronizeList(oLRunnerId, true, false); + oe->synchronizeList(oLCardId, false, true); + + string name=gdi.getText("Name"); + if (name.empty()) { + gdi.alert("Alla deltagare måste ha ett namn."); + return 0; + } + int rid = bi.getExtraInt(); + pRunner r = oe->getRunner(rid, 0); + int cardNo = gdi.getTextNo("CardNo"); + + pRunner cardRunner = oe->getRunnerByCardNo(cardNo, 0, true); + if (cardNo>0 && cardRunner!=0 && cardRunner!=r) { + gdi.alert("Bricknummret är upptaget (X).#" + cardRunner->getName() + ", " + cardRunner->getClass()); + return 0; + } + + ListBoxInfo lbi; + gdi.getSelectedItem("Class", lbi); + + if (signed(lbi.data)<=0) { + pClass pc = oe->getClassCreate(0, lang.tl("Öppen klass")); + lbi.data = pc->getId(); + pc->setAllowQuickEntry(true); + pc->synchronize(); + } + bool updated = false; + int year = 0; + + if (r==0) { + r = oe->addRunner(name, gdi.getText("Club", true), lbi.data, cardNo, year, true); + r->setCardNo(0, false, false); // Clear to match below + } + else { + int clubId = 0; + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Clubs)) { + string cname = gdi.getText("Club", true); + + if (cname.empty()) { + pClub club = oe->getClubCreate(0, cname); + clubId = club->getId(); + } + } + int birthYear = 0; + r->updateFromDB(name, clubId, lbi.data, cardNo, birthYear); + r->setName(name, true); + r->setClubId(clubId); + r->setClassId(lbi.data, true); + updated = true; + } + + lastClubId=r->getClubId(); + lastClassId=r->getClassId(); + lastFee = gdi.getText("Fee", true); + int lastFeeNum = oe->interpretCurrency(lastFee); + + r->setCardNo(cardNo, true);//XXX + + oDataInterface di=r->getDI(); + + int cardFee = gdi.isChecked("RentCard") ? oe->getDI().getInt("CardFee") : 0; + di.setInt("CardFee", cardFee); + di.setInt("Fee", lastFeeNum); + r->setFlag(oRunner::FlagFeeSpecified, true); + + writePayMode(gdi, lastFeeNum + (cardFee > 0 ? cardFee : 0), *r); + + di.setString("Phone", gdi.getText("Phone")); + r->setFlag(oRunner::FlagTransferSpecified, gdi.hasField("AllStages")); + r->setFlag(oRunner::FlagTransferNew, gdi.isChecked("AllStages")); + + r->setStartTimeS(gdi.getText("StartTime")); + + string bib = ""; + if (r->autoAssignBib()) + bib = ", " + lang.tl("Nummerlapp: ") + r->getBib(); + + r->synchronize(); + + gdi.restore("EntryLine"); + + char bf[256]; + if (r->getClubId() != 0) { + sprintf_s(bf, "(%d), %s, %s", r->getCardNo(), r->getClub().c_str(), + r->getClass().c_str()); + } + else { + sprintf_s(bf, "(%d), %s", r->getCardNo(), r->getClass().c_str()); + } + + string info(bf); + if (r->getDI().getInt("CardFee") != 0) + info+=lang.tl(", Hyrbricka"); + + vector< pair > modes; + oe->getPayModes(modes); + string pm; + if (modes.size() > 1 && size_t(r->getPaymentMode()) < modes.size()) + pm = " (" + modes[r->getPaymentMode()].first + ")"; + if (r->getDI().getInt("Paid")>0) + info += lang.tl(", Betalat") + pm; + + if (bib.length()>0) + info+=bib; + + if (updated) + info += lang.tl(" [Uppdaterad anmälan]"); + + gdi.pushX(); + gdi.fillRight(); + gdi.addString("ChRunner", 0, "#" + r->getName(), SportIdentCB).setColor(colorGreen).setExtra(r->getId()); + gdi.fillDown(); + gdi.addStringUT(0, info, 0); + gdi.popX(); + + generateStartInfo(gdi, *r); + + gdi.setRestorePoint("EntryLine"); + generateEntryLine(gdi, 0); + } + else if (bi.id=="EntryCancel") { + gdi.restore("EntryLine"); + storedInfo.clear(); + generateEntryLine(gdi, 0); + } + else if (bi.id=="RentCard" || bi.id=="Paid" || bi.id == "AllStages") { + updateEntryInfo(gdi); + } + else if (bi.id == "ManualOK") { + if (runnerMatchedId == -1) + throw meosException("Löparen hittades inte"); + + bool useNow = gdi.getExtraInt("FinishTime") == 1; + string time = useNow ? getLocalTimeOnly() : gdi.getText("FinishTime"); + + int relTime = oe->getRelativeTime(time); + if (relTime <= 0) { + throw meosException("Ogiltig tid."); + } + bool ok = gdi.isChecked("StatusOK"); + bool dnf = gdi.isChecked("StatusDNF"); + + pRunner r = oe->getRunner(runnerMatchedId, 0); + if (r==0) + throw meosException("Löparen hittades inte"); + + if (r->getStatus() != StatusUnknown) { + if (!gdi.ask("X har redan ett resultat. Vi du fortsätta?#" + r->getCompleteIdentification())) + return 0; + } + + gdi.restore("ManualInput", false); + + SICard sic; + sic.runnerId = runnerMatchedId; + sic.relativeFinishTime = relTime; + sic.statusOK = ok; + sic.statusDNF = dnf; + + gSI->addCard(sic); + } + else if (bi.id == "StatusOK") { + bool ok = gdi.isChecked(bi.id); + if (ok) { + gdi.check("StatusDNF", false); + } + } + else if (bi.id == "StatusDNF") { + bool dnf = gdi.isChecked(bi.id); + gdi.setInputStatus("StatusOK", !dnf); + gdi.check("StatusOK", !dnf); + } + else if (bi.id == "CCSClear") { + if (gdi.ask("Vill du göra om avbockningen från början igen?")) { + checkedCardFlags.clear(); + gdi.restore("CCSInit", false); + showCheckCardStatus(gdi, "fillrunner"); + showCheckCardStatus(gdi, "stat"); + gdi.refresh(); + } + } + else if (bi.id == "CCSReport") { + gdi.restore("CCSInit", false); + showCheckCardStatus(gdi, "stat"); + showCheckCardStatus(gdi, "report"); + gdi.refresh(); + } + else if (bi.id == "CCSPrint") { + //gdi.print(oe); + gdioutput gdiPrint("print", gdi.getScale(), gdi.getEncoding()); + gdiPrint.clearPage(false); + + int tCardPosX = cardPosX; + int tCardPosY = cardPosY; + int tCardOffsetX = cardOffsetX; + int tCardCurrentCol = cardCurrentCol; + + showCheckCardStatus(gdiPrint, "stat"); + showCheckCardStatus(gdiPrint, "report"); + showCheckCardStatus(gdiPrint, "tickoff"); + + cardPosX = tCardPosX; + cardPosY = tCardPosY; + cardOffsetX = tCardOffsetX; + cardCurrentCol = tCardCurrentCol; + + gdiPrint.refresh(); + gdiPrint.print(oe); + } + } + else if (type==GUI_LISTBOX) { + ListBoxInfo bi=*(ListBoxInfo *)data; + + if (bi.id=="Runners") { + pRunner r = gEvent->getRunner(bi.data, 0); + if (r) { + gdi.setData("RunnerId", bi.data); + if (gdi.hasField("Club")) + gdi.setText("Club", r->getClub()); + gdi.setText("FindMatch", lang.tl("Press Enter to continue"), true); + } + } + else if (bi.id == "PayMode") { + updateEntryInfo(gdi); + } + else if (bi.id=="ComPort") { + char bf[64]; + + if (bi.text.substr(0,3)!="TCP") + sprintf_s(bf, 64, "COM%d", bi.data); + else + strcpy_s(bf, "TCP"); + + if (gSI->IsPortOpen(bf)) + gdi.setText("StartSI", lang.tl("Koppla ifrån")); + else + gdi.setText("StartSI", lang.tl("Aktivera")); + } + else if (bi.id=="ReadType") { + gdi.restore("SIPageLoaded"); + mode = SIMode(bi.data); + gdi.setInputStatus("StartInfo", mode == ModeEntry); + + if (mode==ModeAssignCards || mode==ModeEntry) { + if (mode==ModeAssignCards) { + gdi.dropLine(1); + showAssignCard(gdi, true); + } + else { + entryTips(gdi); + generateEntryLine(gdi, 0); + } + gdi.setInputStatus("Interactive", mode == ModeAssignCards); + gdi.setInputStatus("Database", mode != ModeAssignCards, true); + gdi.disableInput("PrintSplits"); + + gdi.disableInput("UseManualInput"); + } + else if (mode==ModeReadOut) { + gdi.enableInput("Interactive"); + gdi.enableInput("Database", true); + gdi.enableInput("PrintSplits"); + gdi.enableInput("UseManualInput"); + gdi.fillDown(); + gdi.addButton("Import", "Importera från fil...", SportIdentCB); + + if (gdi.isChecked("UseManualInput")) + showManualInput(gdi); + } + else if (mode == ModeCardData) { + showModeCardData(gdi); + } + else if (mode == ModeCheckCards) { + showCheckCardStatus(gdi, "init"); + } + gdi.refresh(); + } + else if (bi.id=="Fee") { + updateEntryInfo(gdi); + } + else if (bi.id == "NC") { + NC = bi.data; + PostMessage(gdi.getTarget(), WM_USER + 2, TSITab, 0); + } + } + else if (type == GUI_LINK) { + TextInfo ti = *(TextInfo *)data; + if (ti.id == "ChRunner") { + pRunner r = oe->getRunner(ti.getExtraInt(), 0); + generateEntryLine(gdi, r); + } + else if (ti.id == "EditAssign") { + int id = ti.getExtraInt(); + pRunner r = oe->getRunner(id, 0); + if (r) { + gdi.setText("CardNo", r->getCardNo()); + gdi.setText("RunnerId", r->getRaceIdentifier()); + gdi.setText("FindMatch", r->getCompleteIdentification(), true); + runnerMatchedId = r->getId(); + } + } + } + else if (type == GUI_COMBO) { + ListBoxInfo bi=*(ListBoxInfo *)data; + + if (bi.id=="Fee") { + updateEntryInfo(gdi); + } + else if (bi.id == "Runners") { + DWORD rid; + if ((gdi.getData("RunnerId", rid) && rid>0) || !gdi.getText("Club", true).empty()) + return 0; // Selected from list + + if (!bi.text.empty() && useDatabase) { + pRunner db_r = oe->dbLookUpByName(bi.text, 0, 0, 0); + if (!db_r && lastClubId) + db_r = oe->dbLookUpByName(bi.text, lastClubId, 0, 0); + + if (db_r && gdi.hasField("Club")) { + gdi.setText("Club", db_r->getClub()); + } + } + gdi.setText("FindMatch", lang.tl("Press Enter to continue"), true); + + } + } + else if (type == GUI_COMBOCHANGE) { + ListBoxInfo bi=*(ListBoxInfo *)data; + if (bi.id == "Runners") { + inputId++; + gdi.addTimeoutMilli(300, "AddRunnerInteractive", SportIdentCB).setExtra((void *)inputId); + } + } + else if (type == GUI_EVENT) { + EventInfo ev = *(EventInfo *)data; + if (ev.id == "AutoComplete") { + pRunner r = oe->getRunner(runnerMatchedId, 0); + if (r) { + gdi.setInputFocus("OK1"); + gdi.setText("Runners", r->getName()); + gdi.setData("RunnerId", runnerMatchedId); + if (gdi.hasField("Club")) + gdi.setText("Club", r->getClub()); + inputId = -1; + gdi.setText("FindMatch", lang.tl("Press Enter to continue"), true); + + } + } + } + else if (type == GUI_FOCUS) { + InputInfo &ii=*(InputInfo *)data; + + if (ii.id == "FinishTime") { + if (ii.getExtraInt() == 1) { + ii.setExtra(0); + ii.setFgColor(colorDefault); + //gdi.refreshFast(); + gdi.setText(ii.id, "", true); + } + } + } + else if (type == GUI_TIMER) { + TimerInfo &ti = *(TimerInfo *)(data); + + if (ti.id == "TieCard") { + runnerMatchedId = ti.getExtraInt(); + tieCard(gdi); + return 0; + } + + if (inputId != ti.getExtraInt()) + return 0; + + if (ti.id == "RunnerId") { + const string &text = gdi.getText(ti.id); + int nr = atoi(text.c_str()); + + pRunner r = 0; + if (nr > 0) { + r = getRunnerByIdentifier(nr); + if (r == 0) { + r = oe->getRunnerByBibOrStartNo(text, true); + if (r == 0) { + // Seek where a card is already defined + r = oe->getRunnerByBibOrStartNo(text, false); + } + } + } + + if (nr == 0 && text.size() > 2) { + stdext::hash_set f1, f2; + r = oe->findRunner(text, 0, f1, f2); + } + if (r != 0) { + gdi.setText("FindMatch", r->getCompleteIdentification(), true); + runnerMatchedId = r->getId(); + } + else { + gdi.setText("FindMatch", "", true); + runnerMatchedId = -1; + } + + gdi.setInputStatus("TieOK", runnerMatchedId != -1); + + if (runnerMatchedId != -1 && gdi.getTextNo("CardNo") > 0 && gdi.isChecked("AutoTie")) + tieCard(gdi); + } + else if (ti.id == "Manual") { + const string &text = gdi.getText(ti.id); + int nr = atoi(text.c_str()); + + pRunner r = 0; + if (nr > 0) { + r = oe->getRunnerByBibOrStartNo(text, false); + if (r == 0) + r = oe->getRunnerByCardNo(nr, 0, true, true); + } + + if (nr == 0 && text.size() > 2) { + stdext::hash_set f1, f2; + r = oe->findRunner(text, 0, f1, f2); + } + if (r != 0) { + gdi.setText("FindMatch", r->getCompleteIdentification(), true); + runnerMatchedId = r->getId(); + } + else { + gdi.setText("FindMatch", "", true); + runnerMatchedId = -1; + } + } + else if (ti.id == "AddRunnerInteractive") { + const string &text = gdi.getText("Runners"); + int nr = atoi(text.c_str()); + + pRunner r = 0; + if (nr > 0) { + r = oe->getRunnerByBibOrStartNo(text, true); + } + + if (nr == 0 && text.size() > 2) { + stdext::hash_set f1, f2; + r = oe->findRunner(text, 0, f1, f2); + } + if (r != 0) { + gdi.setText("FindMatch", lang.tl("X (press Ctrl+Space to confirm)#" + r->getCompleteIdentification()), true); + runnerMatchedId = r->getId(); + } + else { + gdi.setText("FindMatch", "", true); + runnerMatchedId = -1; + } + } + } + else if (type==GUI_INPUTCHANGE) { + + InputInfo ii=*(InputInfo *)data; + if (ii.id == "RunnerId") { + inputId++; + gdi.addTimeoutMilli(300, ii.id, SportIdentCB).setExtra((void *)inputId); + } + else if (ii.id == "Manual") { + inputId++; + gdi.addTimeoutMilli(300, ii.id, SportIdentCB).setExtra((void *)inputId); + } + else if (ii.id == "CardNo" && mode == ModeAssignCards) { + gdi.setInputStatus("TieOK", runnerMatchedId != -1); + } + else if (ii.id == "SI") { + pRunner r = oe->getRunnerByCardNo(atoi(ii.text.c_str()), 0, true, false); + if (r && r->getStartTime() > 0) { + gdi.setText("Start", r->getStartTimeS()); + gdi.check("HasStart", false); + int f = r->getStartTime() + 2800 + rand()%1200; + gdi.setText("Finish", oe->getAbsTime(f)); + pCourse pc = r->getCourse(false); + if (pc) { + for (int n = 0; n < pc->getNumControls(); n++) { + if (pc->getControl(n) && n < NC) { + gdi.setText("C" + itos(n+1), pc->getControl(n)->getFirstNumber()); + } + } + } + } + } + } + else if (type==GUI_INPUT) { + InputInfo &ii=*(InputInfo *)data; + if (ii.id == "FinishTime") { + if (ii.text.empty()) { + ii.setExtra(1); + ii.setFgColor(colorGreyBlue); + gdi.setText(ii.id, lang.tl("Aktuell tid"), true); + } + } + else if (ii.id=="CardNo") { + int cardNo = gdi.getTextNo("CardNo"); + + if (mode == ModeAssignCards) { + if (runnerMatchedId != -1 && gdi.isChecked("AutoTie") && cardNo>0) + gdi.addTimeoutMilli(50, "TieCard", SportIdentCB).setExtra((void *)runnerMatchedId); + } + else if (cardNo>0 && gdi.getText("Name").empty()) { + SICard sic; + sic.clear(0); + sic.CardNumber = cardNo; + + entryCard(gdi, sic); + } + } + else if (ii.id[0]=='*') { + int si=atoi(ii.text.c_str()); + + pRunner r=oe->getRunner(ii.getExtraInt(), 0); + r->synchronize(); + + if (r && r->getCardNo()!=si) { + if (si==0 || !oe->checkCardUsed(gdi,*r, si)) { + r->setCardNo(si, false); + r->getDI().setInt("CardFee", oe->getDI().getInt("CardFee")); + r->synchronize(); + } + + if (r->getCardNo()) + gdi.setText(ii.id, r->getCardNo()); + else + gdi.setText(ii.id, ""); + } + } + } + else if (type==GUI_INFOBOX) { + DWORD loaded; + if (!gdi.getData("SIPageLoaded", loaded)) + loadPage(gdi); + } + else if (type == GUI_CLEAR) { + if (mode == ModeEntry) { + storedInfo.clear(); + storedInfo.storedName = gdi.getText("Name"); + storedInfo.storedCardNo = gdi.getText("CardNo"); + storedInfo.storedClub = gdi.hasField("Club") ? gdi.getText("Club") : ""; + storedInfo.storedFee = gdi.getText("Fee", true); + + ListBoxInfo lbi; + gdi.getSelectedItem("Class", lbi); + storedInfo.storedClassId = lbi.data; + storedInfo.storedPhone = gdi.getText("Phone"); + storedInfo.storedStartTime = gdi.getText("StartTime"); + + storedInfo.allStages = gdi.isChecked("AllStages"); + storedInfo.rentState = gdi.isChecked("RentCard"); + storedInfo.hasPaid = gdi.isChecked("Paid"); + storedInfo.payMode = gdi.hasField("PayMode") ? gdi.getSelectedItem("PayMode").first : 0; + } + return 1; + } + + return 0; +} + + +void TabSI::refillComPorts(gdioutput &gdi) +{ + if (!gSI) return; + + list ports; + gSI->EnumrateSerialPorts(ports); + + gdi.clearList("ComPort"); + ports.sort(); + char bf[256]; + int active=0; + int inactive=0; + while(!ports.empty()) + { + int p=ports.front(); + sprintf_s(bf, 256, "COM%d", p); + + if (gSI->IsPortOpen(bf)){ + gdi.addItem("ComPort", string(bf)+" [OK]", p); + active=p; + } + else{ + gdi.addItem("ComPort", bf, p); + inactive=p; + } + + ports.pop_front(); + } + + if (gSI->IsPortOpen("TCP")) + gdi.addItem("ComPort", "TCP [OK]"); + else + gdi.addItem("ComPort", "TCP"); + + if (active){ + gdi.selectItemByData("ComPort", active); + gdi.setText("StartSI", lang.tl("Koppla ifrån")); + } + else{ + gdi.selectItemByData("ComPort", inactive); + gdi.setText("StartSI", lang.tl("Aktivera")); + } +} + +void TabSI::showReadPunches(gdioutput &gdi, vector &punches, set &dates) +{ + char bf[64]; + int yp = gdi.getCY(); + int xp = gdi.getCX(); + dates.clear(); + for (size_t k=0;kgetRunnerByCardNo(punches[k].card, punches[k].time); + sprintf_s(bf, "%d", punches[k].card); + gdi.addStringUT(yp, xp+40, 0, bf, 240); + + if (r!=0) + gdi.addStringUT(yp, xp+100, 0, r->getName(), 170); + + if (punches[k].date[0] != 0) { + gdi.addStringUT(yp, xp+280, 0, punches[k].date, 75); + dates.insert(punches[k].date); + } + if (punches[k].time>0) + gdi.addStringUT(yp, xp+360, 0, oe->getAbsTime(punches[k].time)); + else + gdi.addStringUT(yp, xp+360, 0, MakeDash("-")); + + yp += gdi.getLineHeight(); + } +} + +void TabSI::showReadCards(gdioutput &gdi, vector &cards) +{ + char bf[64]; + int yp = gdi.getCY(); + int xp = gdi.getCX(); + for (size_t k=0;kgetRunnerByCardNo(cards[k].CardNumber, 0); + sprintf_s(bf, "%d", cards[k].CardNumber); + gdi.addStringUT(yp, xp+40, 0, bf, 240); + + if (r!=0) + gdi.addStringUT(yp, xp+100, 0, r->getName(), 240); + + gdi.addStringUT(yp, xp+300, 0, oe->getAbsTime(cards[k].FinishPunch.Time)); + yp += gdi.getLineHeight(); + } +} + +SportIdent &TabSI::getSI(const gdioutput &gdi) { + if (!gSI) { + HWND hWnd=gdi.getMain(); + gSI = new SportIdent(hWnd, 0); + gSI->SetZeroTime(gEvent->getZeroTimeNum()); + } + return *gSI; +} + +bool TabSI::loadPage(gdioutput &gdi) { + gdi.clearPage(true); + printErrorShown = false; + gdi.pushX(); + gdi.selectTab(tabId); + oe->checkDB(); + gdi.setData("SIPageLoaded", 1); + + if (!gSI) { + getSI(gdi); + if (oe->isClient()) + interactiveReadout = false; + } +#ifdef _DEBUG + gdi.fillRight(); + gdi.pushX(); + gdi.addInput("SI", "", 10, SportIdentCB, "SI"); + int s = 3600+(rand()%60)*60; + int f = s + 1800 + rand()%900; + + gdi.setCX(gdi.getCX()+gdi.getLineHeight()); + + gdi.dropLine(1.4); + gdi.addCheckbox("HasStart", ""); + gdi.dropLine(-1.4); + gdi.setCX(gdi.getCX()-gdi.getLineHeight()); + gdi.addInput("Start", oe->getAbsTime(s), 6, 0, "Start"); + + gdi.dropLine(1.4); + gdi.addCheckbox("HasFinish", ""); + gdi.dropLine(-1.4); + gdi.setCX(gdi.getCX()-gdi.getLineHeight()); + + gdi.addInput("Finish", oe->getAbsTime(f), 6, 0, "Mål"); + gdi.addSelection("NC", 45, 200, SportIdentCB, "NC"); + const int src[11] = {33, 34, 45, 50, 36, 38, 59, 61, 62, 67, 100}; + + for (int i = 0; i < 32; i++) + gdi.addItem("NC", itos(i), i); + + gdi.selectItemByData("NC", NC); + + for (int i = 0; i < NC; i++) { + int level = min(i, NC-i)/5; + int c; + if (i < NC /2) { + int ix = i%6; + c = src[ix] + level * 10; + if (c == 100) + c = 183; + } + else { + int ix = 10-(NC-i-1)%5; + c = src[ix] + level * 10; + } + + gdi.addInput("C" + itos(i+1), itos(c), 3, 0, "#C" + itos(i+1)); + } + /* + gdi.addInput("C1", "33", 5, 0, "#C1"); + gdi.addInput("C2", "34", 5, 0, "#C2"); + gdi.addInput("C3", "45", 5, 0, "#C3"); + gdi.addInput("C4", "50", 5, 0, "#C4"); + gdi.addInput("C5", "61", 5, 0, "#C5"); + gdi.addInput("C6", "62", 5, 0, "#C6"); + gdi.addInput("C7", "67", 5, 0, "#C7"); + + gdi.addInput("C8", "100", 5, 0, "#C8"); + */ + + gdi.dropLine(); + gdi.addButton("Save", "Bricka", SportIdentCB); + gdi.fillDown(); + + gdi.addButton("SaveP", "Stämpling", SportIdentCB); + gdi.popX(); +#endif + gdi.addString("", boldLarge, "SportIdent"); + gdi.dropLine(); + + gdi.pushX(); + gdi.fillRight(); + gdi.addSelection("ComPort", 120, 200, SportIdentCB); + gdi.addButton("StartSI", "#Aktivera+++", SportIdentCB); + gdi.addButton("SIInfo", "Info", SportIdentCB); + + refillComPorts(gdi); + + gdi.addButton("AutoDetect", "Sök och starta automatiskt...", SportIdentCB); + gdi.addButton("PrinterSetup", "Skrivarinställningar...", SportIdentCB, "Skrivarinställningar för sträcktider och startbevis"); + + gdi.popX(); + gdi.fillDown(); + gdi.dropLine(2.2); + + int xb = gdi.getCX(); + int yb = gdi.getCY(); + + gdi.fillRight(); + if (!oe->empty()) { + gdi.setCX(xb + gdi.scaleLength(10)); + gdi.setCY(yb + gdi.scaleLength(10)); + gdi.addString("", fontMediumPlus, "Funktion:"); + gdi.addSelection("ReadType", 200, 200, SportIdentCB); + gdi.addItem("ReadType", lang.tl("Avläsning/radiotider"), ModeReadOut); + gdi.addItem("ReadType", lang.tl("Tilldela hyrbrickor"), ModeAssignCards); + gdi.addItem("ReadType", lang.tl("Avstämning hyrbrickor"), ModeCheckCards); + gdi.addItem("ReadType", lang.tl("Anmälningsläge"), ModeEntry); + gdi.addItem("ReadType", lang.tl("Print card data"), ModeCardData); + + gdi.selectItemByData("ReadType", mode); + gdi.dropLine(2.5); + gdi.setCX(xb + gdi.scaleLength(10)); + } + else { + mode = ModeCardData; + } + + if (!oe->empty()) + gdi.addCheckbox("Interactive", "Interaktiv inläsning", SportIdentCB, interactiveReadout); + + if (oe->empty() || oe->useRunnerDb()) + gdi.addCheckbox("Database", "Använd löpardatabasen", SportIdentCB, useDatabase); + + gdi.addCheckbox("PrintSplits", "Sträcktidsutskrift[check]", SportIdentCB, printSplits); + + if (!oe->empty()) { + gdi.addCheckbox("StartInfo", "Startbevis", SportIdentCB, printStartInfo, "Skriv ut startbevis för deltagaren"); + if (mode != ModeEntry) + gdi.disableInput("StartInfo"); + } + if (!oe->empty()) + gdi.addCheckbox("UseManualInput", "Manuell inmatning", SportIdentCB, manualInput); + + gdi.fillDown(); + + if (!oe->empty()) { + RECT rc = {xb, yb, gdi.getWidth(), gdi.getHeight()}; + gdi.addRectangle(rc, colorLightBlue); + } + gdi.popX(); + gdi.dropLine(2); + gdi.setRestorePoint("SIPageLoaded"); + + if (mode==ModeReadOut) { + gdi.addButton("Import", "Importera från fil...", SportIdentCB); + + gdi.setRestorePoint("Help"); + gdi.addString("", 10, "help:471101"); + + if (gdi.isChecked("UseManualInput")) + showManualInput(gdi); + + gdi.dropLine(); + } + else if (mode==ModeAssignCards) { + gdi.dropLine(1); + showAssignCard(gdi, true); + } + else if (mode == ModeEntry) { + entryTips(gdi); + generateEntryLine(gdi, 0); + gdi.disableInput("Interactive"); + gdi.disableInput("PrintSplits"); + gdi.disableInput("UseManualInput"); + } + else if (mode == ModeCardData) { + showModeCardData(gdi); + } + else if (mode == ModeCheckCards) { + showCheckCardStatus(gdi, "init"); + } + + + // Unconditional clear + activeSIC.clear(0); + + checkMoreCardsInQueue(gdi); + gdi.refresh(); + return true; +} + +void InsertSICard(gdioutput &gdi, SICard &sic) +{ + TabSI &tsi = dynamic_cast(*gdi.getTabs().get(TSITab)); + tsi.insertSICard(gdi, sic); +} + +pRunner TabSI::autoMatch(const SICard &sic, pRunner db_r) +{ + assert(useDatabase); + //Look up in database. + if (!db_r) + db_r = gEvent->dbLookUpByCard(sic.CardNumber); + + pRunner r=0; + + if (db_r) { + r = gEvent->getRunnerByName(db_r->getName(), db_r->getClub()); + + if ( !r ) { + vector classes; + int dist = gEvent->findBestClass(sic, classes); + + if (classes.size()==1 && dist>=-1 && dist<=1) { //Almost perfect match found. Assume it is it! + r = gEvent->addRunnerFromDB(db_r, classes[0]->getId(), true); + r->setCardNo(sic.CardNumber, false); + } + else r=0; //Do not assume too much... + } + } + if (r && r->getCard()==0) + return r; + else return 0; +} + +void TabSI::insertSICard(gdioutput &gdi, SICard &sic) +{ + string msg; + try { + insertSICardAux(gdi, sic); + } + catch(std::exception &ex) { + msg = ex.what(); + } + catch(...) { + msg = "Ett okänt fel inträffade."; + } + + if (!msg.empty()) + gdi.alert(msg); +} + +void TabSI::insertSICardAux(gdioutput &gdi, SICard &sic) +{ + if (oe->isReadOnly()) { + gdi.makeEvent("ReadCard", "insertSICard", sic.CardNumber, 0, true); + return; + } + + DWORD loaded; + bool pageLoaded=gdi.getData("SIPageLoaded", loaded); + + if (pageLoaded && manualInput) + gdi.restore("ManualInput"); + + if (!pageLoaded && !insertCardNumberField.empty()) { + if (gdi.insertText(insertCardNumberField, itos(sic.CardNumber))) + return; + } + + if (mode==ModeAssignCards) { + if (!pageLoaded) { + CardQueue.push_back(sic); + gdi.addInfoBox("SIREAD", "Inläst bricka ställd i kö"); + } + else assignCard(gdi, sic); + return; + } + else if (mode==ModeEntry) { + if (!pageLoaded) { + CardQueue.push_back(sic); + gdi.addInfoBox("SIREAD", "Inläst bricka ställd i kö"); + } + else entryCard(gdi, sic); + return; + } + if (mode==ModeCheckCards) { + if (!pageLoaded) { + CardQueue.push_back(sic); + gdi.addInfoBox("SIREAD", "Inläst bricka ställd i kö"); + } + else + checkCard(gdi, sic, true); + return; + } + else if (mode == ModeCardData) { + savedCards.push_back(make_pair(savedCardUniqueId++, sic)); + + if (printSplits) { + generateSplits(savedCards.back().first, gdi); + } + if (savedCards.size() > 1 && pageLoaded) { + RECT rc = {30, gdi.getCY(), gdi.scaleLength(250), gdi.getCY() + 3}; + gdi.addRectangle(rc); + } + + if (pageLoaded) { + gdi.enableInput("CreateCompetition", true); + printCard(gdi, savedCards.back().first, false); + gdi.dropLine(); + gdi.refreshFast(); + gdi.scrollToBottom(); + } + return; + } + gEvent->synchronizeList(oLCardId, true, false); + gEvent->synchronizeList(oLRunnerId, false, true); + + if (sic.PunchOnly) { + processPunchOnly(gdi, sic); + return; + } + pRunner r; + if (sic.runnerId == 0) + r = gEvent->getRunnerByCardNo(sic.CardNumber, 0, false); + else { + r = gEvent->getRunner(sic.runnerId, 0); + sic.CardNumber = r->getCardNo(); + } + + bool readBefore = sic.runnerId == 0 ? gEvent->isCardRead(sic) : false; + + bool sameCardNewRace = !readBefore && r && r->getCard(); + + if (!pageLoaded) { + if (sic.runnerId != 0) + throw meosException("Internal error"); + //SIPage not loaded... + + if (!r && useDatabase) + r=autoMatch(sic, 0); + + // Assign a class if not already done + autoAssignClass(r, sic); + + if (interactiveReadout) { + if (r && r->getClassId() && !readBefore && !sameCardNewRace) { + //We can do a silent read-out... + processCard(gdi, r, sic, true); + return; + } + else { + CardQueue.push_back(sic); + gdi.addInfoBox("SIREAD", "info:readout_action#" + gEvent->getCurrentTimeS()+"#"+itos(sic.CardNumber), 0, SportIdentCB); + return; + } + } + else { + if (!readBefore) { + if (r && r->getClassId() && !sameCardNewRace) + processCard(gdi, r, sic, true); + else + processUnmatched(gdi, sic, true); + } + else + gdi.addInfoBox("SIREAD", "Brickan redan inläst.", 0, SportIdentCB); + } + return; + } + else if (activeSIC.CardNumber) { + //We are already in interactive mode... + + // Assign a class if not already done + autoAssignClass(r, sic); + + if (r && r->getClassId() && !readBefore && !sameCardNewRace) { + //We can do a silent read-out... + processCard(gdi, r, sic, true); + return; + } + + string name; + if (r) + name = " ("+r->getName()+")"; + + //char bf[256]; + //sprintf_s(bf, 256, "SI-%d inläst%s.\nBrickan har ställts i kö.", sic.CardNumber, name.c_str()); + name = itos(sic.CardNumber) + name; + CardQueue.push_back(sic); + //gdi.addInfoBox("SIREAD", gEvent->getCurrentTimeS()+": "+bf); + gdi.addInfoBox("SIREAD", "info:readout_queue#" + gEvent->getCurrentTimeS()+ "#" + name); + return; + } + + if (readBefore) { + //We stop processing of new cards, while working... + // Thus cannot be in interactive mode + activeSIC=sic; + char bf[256]; + + if (interactiveReadout) { + sprintf_s(bf, 256, "SI X är redan inläst. Ska den läsas in igen?#%d", sic.CardNumber); + + if (!gdi.ask(bf)) { + if (printSplits) { + pRunner runner = oe->getRunnerByCardNo(sic.CardNumber, 0); + if (runner) + generateSplits(runner, gdi); + } + activeSIC.clear(0); + if (manualInput) + showManualInput(gdi); + checkMoreCardsInQueue(gdi); + return; + } + } + else { + if (printSplits) { + pRunner runner = oe->getRunnerByCardNo(sic.CardNumber, 0); + if (runner) + generateSplits(runner, gdi); + } + + gdi.dropLine(); + sprintf_s(bf, 256, "SI X är redan inläst. Använd interaktiv inläsning om du vill läsa brickan igen.#%d", sic.CardNumber); + gdi.addString("", 0, bf).setColor(colorRed); + gdi.dropLine(); + gdi.scrollToBottom(); + gdi.refresh(); + activeSIC.clear(0); + checkMoreCardsInQueue(gdi); + return; + } + } + + pRunner db_r = 0; + if (sic.runnerId == 0) { + r = gEvent->getRunnerByCardNo(sic.CardNumber, 0, !readBefore); + + if (!r && useDatabase) { + //Look up in database. + db_r = gEvent->dbLookUpByCard(sic.CardNumber); + if (db_r) + r = autoMatch(sic, db_r); + } + } + + // If there is no class, auto create + if (interactiveReadout && oe->getNumClasses()==0) { + gdi.fillDown(); + gdi.dropLine(); + gdi.addString("", 1, "Skapar saknad klass").setColor(colorGreen); + gdi.dropLine(); + pCourse pc=gEvent->addCourse(lang.tl("Okänd klass")); + for(unsigned i=0;iaddControl(sic.Punch[i].Code); + gEvent->addClass(lang.tl("Okänd klass"), pc->getId())->setType("tmp"); + } + + // Assign a class if not already done + autoAssignClass(r, sic); + + if (r && r->getClassId() && !r->getCard()) { + SICard copy = sic; + activeSIC.clear(0); + processCard(gdi, r, copy); //Everyting is OK + if (gdi.isChecked("UseManualInput")) + showManualInput(gdi); + } + else { + if (interactiveReadout) { + startInteractive(gdi, sic, r, db_r); + } + else { + SICard copy = sic; + activeSIC.clear(0); + processUnmatched(gdi, sic, !pageLoaded); + } + } +} + +void TabSI::startInteractive(gdioutput &gdi, const SICard &sic, pRunner r, pRunner db_r) +{ + if (!r) { + gdi.setRestorePoint(); + gdi.fillDown(); + gdi.dropLine(); + char bf[256]; + sprintf_s(bf, 256, "SI X inläst. Brickan är inte knuten till någon löpare (i skogen).#%d", sic.CardNumber); + + gdi.dropLine(); + gdi.addString("", 1, bf); + gdi.dropLine(); + gdi.fillRight(); + gdi.pushX(); + + gdi.addCombo("Runners", 200, 300, SportIdentCB, "Namn:"); + gEvent->fillRunners(gdi, "Runners", false, oEvent::RunnerFilterOnlyNoResult); + + if (db_r){ + gdi.setText("Runners", db_r->getName()); //Data from DB + } + else if (sic.FirstName[0] || sic.LastName[0]){ //Data from SI-card + gdi.setText("Runners", string(sic.FirstName)+" "+sic.LastName); + } + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Clubs)) { + gdi.addCombo("Club", 200, 300, 0, "Klubb:"); + gEvent->fillClubs(gdi, "Club"); + + if (db_r) + gdi.setText("Club", db_r->getClub()); //Data from DB + } + if (gdi.getText("Runners").empty() || !gdi.hasField("Club")) + gdi.setInputFocus("Runners"); + else + gdi.setInputFocus("Club"); + + //Process this card. + activeSIC=sic; + gdi.dropLine(); + gdi.setRestorePoint("restOK1"); + gdi.addButton("OK1", "OK", SportIdentCB).setDefault(); + gdi.fillDown(); + gdi.addButton("Cancel", "Avbryt", SportIdentCB).setCancel(); + gdi.popX(); + gdi.addString("FindMatch", 0, "").setColor(colorGreen); + gdi.registerEvent("AutoComplete", SportIdentCB).setKeyCommand(KC_AUTOCOMPLETE); + gdi.dropLine(); + gdi.scrollToBottom(); + gdi.refresh(); + } + else { + //Process this card. + activeSIC=sic; + + //No class. Select... + gdi.setRestorePoint(); + + char bf[256]; + sprintf_s(bf, 256, "SI X inläst. Brickan tillhör Y som saknar klass.#%d#%s", + sic.CardNumber, r->getName().c_str()); + + gdi.dropLine(); + gdi.addString("", 1, bf); + + gdi.fillRight(); + gdi.pushX(); + + gdi.addSelection("Classes", 200, 300, 0, "Klass:"); + gEvent->fillClasses(gdi, "Classes", oEvent::extraNone, oEvent::filterNone); + gdi.setInputFocus("Classes"); + //Find matching class... + vector classes; + gEvent->findBestClass(sic, classes); + if (classes.size() > 0) + gdi.selectItemByData("Classes", classes[0]->getId()); + + gdi.dropLine(); + + gdi.addButton("OK4", "OK", SportIdentCB).setDefault(); + gdi.fillDown(); + + gdi.popX(); + gdi.setData("RunnerId", r->getId()); + gdi.scrollToBottom(); + gdi.refresh(); + } +} + +// Insert card without converting times and with/without runner +void TabSI::processInsertCard(const SICard &sic) +{ + if (oe->isCardRead(sic)) + return; + + pRunner runner = oe->getRunnerByCardNo(sic.CardNumber, 0, true); + pCard card = oe->allocateCard(runner); + card->setReadId(sic); + card->setCardNo(sic.CardNumber); + + if (sic.CheckPunch.Code!=-1) + card->addPunch(oPunch::PunchCheck, sic.CheckPunch.Time, 0); + + if (sic.StartPunch.Code!=-1) + card->addPunch(oPunch::PunchStart, sic.StartPunch.Time, 0); + + for(unsigned i=0;iaddPunch(sic.Punch[i].Code, sic.Punch[i].Time, 0); + + if (sic.FinishPunch.Code!=-1) + card->addPunch(oPunch::PunchFinish, sic.FinishPunch.Time,0 ); + + //Update to SQL-source + card->synchronize(); + + if (runner) { + vector mp; + runner->addPunches(card, mp); + } +} + +bool TabSI::processUnmatched(gdioutput &gdi, const SICard &csic, bool silent) +{ + SICard sic(csic); + pCard card=gEvent->allocateCard(0); + + card->setReadId(csic); + card->setCardNo(csic.CardNumber); + + char bf[16]; + _itoa_s(sic.CardNumber, bf, 16, 10); + string cardno(bf); + + string info=lang.tl("Okänd bricka ") + cardno + "."; + string warnings; + + // Write read card to log + logCard(sic); + + // Convert punch times to relative times. + gEvent->convertTimes(sic); + + if (sic.CheckPunch.Code!=-1) + card->addPunch(oPunch::PunchCheck, sic.CheckPunch.Time, 0); + + if (sic.StartPunch.Code!=-1) + card->addPunch(oPunch::PunchStart, sic.StartPunch.Time, 0); + + for(unsigned i=0;iaddPunch(sic.Punch[i].Code, sic.Punch[i].Time, 0); + + if (sic.FinishPunch.Code!=-1) + card->addPunch(oPunch::PunchFinish, sic.FinishPunch.Time, 0); + else + warnings+=lang.tl("Målstämpling saknas."); + + //Update to SQL-source + card->synchronize(); + + RECT rc; + rc.left=15; + rc.right=gdi.getWidth()-10; + rc.top=gdi.getCY()+gdi.getLineHeight()-5; + rc.bottom=rc.top+gdi.getLineHeight()*2+14; + + if (!silent) { + gdi.fillDown(); + //gdi.dropLine(); + gdi.addRectangle(rc, colorLightRed, true); + gdi.addStringUT(rc.top+6, rc.left+20, 1, info); + //gdi.dropLine(); + if (gdi.isChecked("UseManualInput")) + showManualInput(gdi); + + gdi.scrollToBottom(); + } + else { + gdi.addInfoBox("SIINFO", "#" + info, 10000); + } + gdi.makeEvent("DataUpdate", "sireadout", 0, 0, true); + + checkMoreCardsInQueue(gdi); + return true; +} + +void TabSI::rentCardInfo(gdioutput &gdi, int width) +{ + RECT rc; + rc.left=15; + rc.right=rc.left+width; + rc.top=gdi.getCY()-7; + rc.bottom=rc.top+gdi.getLineHeight()+5; + + gdi.addRectangle(rc, colorYellow, true); + gdi.addString("", rc.top+2, rc.left+width/2, 1|textCenter, "Vänligen återlämna hyrbrickan."); +} + +bool TabSI::processCard(gdioutput &gdi, pRunner runner, const SICard &csic, bool silent) +{ + if (!runner) + return false; + if (runner->getClubId()) + lastClubId = runner->getClubId(); + + runner = runner->getMatchedRunner(csic); + + int lh=gdi.getLineHeight(); + //Update from SQL-source + runner->synchronize(); + + if (!runner->getClassId()) + runner->setClassId(gEvent->addClass(lang.tl("Okänd klass"))->getId(), true); + + // Choose course from pool + pClass cls=gEvent->getClass(runner->getClassId()); + if (cls && cls->hasCoursePool()) { + unsigned leg=runner->legToRun(); + + if (leggetNumStages()) { + pCourse c = cls->selectCourseFromPool(leg, csic); + if (c) + runner->setCourseId(c->getId()); + } + } + + if (cls && cls->hasUnorderedLegs()) { + pCourse crs = cls->selectParallelCourse(*runner, csic); + if (crs) { + runner->setCourseId(crs->getId()); + runner->synchronize(true); + } + } + + pClass pclass=gEvent->getClass(runner->getClassId()); + if (!runner->getCourse(false) && !csic.isManualInput()) { + + if (pclass && !pclass->hasMultiCourse() && !pclass->hasDirectResult()) { + pCourse pcourse=gEvent->addCourse(runner->getClass()); + pclass->setCourse(pcourse); + + for(unsigned i=0;iaddControl(csic.Punch[i].Code); + + char msg[256]; + + sprintf_s(msg, lang.tl("Skapade en bana för klassen %s med %d kontroller från brickdata (SI-%d)").c_str(), + pclass->getName().c_str(), csic.nPunch, csic.CardNumber); + + if (silent) + gdi.addInfoBox("SIINFO", string("#") + msg, 15000); + else + gdi.addStringUT(0, msg); + } + else { + if (!(pclass && pclass->hasDirectResult())) { + const char *msg="Löpare saknar klass eller bana"; + + if (silent) + gdi.addInfoBox("SIINFO", msg, 15000); + else + gdi.addString("", 0, msg); + } + } + } + + pCourse pcourse=runner->getCourse(false); + + if (pcourse) + pcourse->synchronize(); + else if (pclass && pclass->hasDirectResult()) + runner->setStatus(StatusOK, true, false, false); + //silent=true; + SICard sic(csic); + string info, warnings, cardno; + vector MP; + + if (!csic.isManualInput()) { + pCard card=gEvent->allocateCard(runner); + + card->setReadId(csic); + card->setCardNo(sic.CardNumber); + + char bf[16]; + _itoa_s(sic.CardNumber, bf, 16, 10); + cardno = bf; + + info=runner->getName() + " (" + cardno + "), " + runner->getClub() + ", " + runner->getClass(); + + // Write read card to log + logCard(sic); + + // Convert punch times to relative times. + oe->convertTimes(sic); + pCourse prelCourse = runner->getCourse(false); + const int finishPT = prelCourse ? prelCourse->getFinishPunchType() : oPunch::PunchFinish; + bool hasFinish = false; + + if (sic.CheckPunch.Code!=-1) + card->addPunch(oPunch::PunchCheck, sic.CheckPunch.Time,0); + + if (sic.StartPunch.Code!=-1) + card->addPunch(oPunch::PunchStart, sic.StartPunch.Time,0); + + for(unsigned i=0;iaddPunch(sic.Punch[i].Code, sic.Punch[i].Time,0); + } + if (sic.FinishPunch.Code!=-1) { + card->addPunch(oPunch::PunchFinish, sic.FinishPunch.Time,0); + if (finishPT == oPunch::PunchFinish) + hasFinish = true; + } + + if (!hasFinish) + warnings+=lang.tl("Målstämpling saknas."); + + card->synchronize(); + runner->addPunches(card, MP); + runner->hasManuallyUpdatedTimeStatus(); + } + else { + //Manual input + info = runner->getName() + ", " + runner->getClub() + ", " + runner->getClass(); + runner->setCard(0); + + if (csic.statusOK) { + runner->setStatus(StatusOK, true, false); + runner->setFinishTime(csic.relativeFinishTime); + } + else if (csic.statusDNF) { + runner->setStatus(StatusDNF, true, false); + runner->setFinishTime(0); + } + else { + runner->setStatus(StatusMP, true, false); + runner->setFinishTime(csic.relativeFinishTime); + } + + cardno = MakeDash("-"); + runner->evaluateCard(true, MP, false, false); + runner->hasManuallyUpdatedTimeStatus(); + } + + //Update to SQL-source + runner->synchronize(); + + RECT rc; + rc.left=15; + rc.right=gdi.getWidth()-10; + rc.top=gdi.getCY()+gdi.getLineHeight()-5; + rc.bottom=rc.top+gdi.getLineHeight()*2+14; + + if (!warnings.empty()) + rc.bottom+=gdi.getLineHeight(); + + if (runner->getStatus()==StatusOK) { + gEvent->calculateResults(oEvent::RTClassResult); + if (runner->getTeam()) + gEvent->calculateTeamResults(runner->getLegNumber(), false); + string placeS = runner->getTeam() ? runner->getTeam()->getLegPlaceS(runner->getLegNumber(), false) : runner->getPlaceS(); + + if (!silent) { + gdi.fillDown(); + //gdi.dropLine(); + gdi.addRectangle(rc, colorLightGreen, true); + + gdi.addStringUT(rc.top+6, rc.left+20, 1, info); + if (!warnings.empty()) + gdi.addStringUT(rc.top+6+2*lh, rc.left+20, 0, warnings); + + string statusline = lang.tl("Status OK, ") + + lang.tl("Tid: ") + runner->getRunningTimeS() + + lang.tl(", Prel. placering: ") + placeS; + + + statusline += lang.tl(", Prel. bomtid: ") + runner->getMissedTimeS(); + gdi.addStringUT(rc.top+6+lh, rc.left+20, 0, statusline); + + if (runner->getDI().getInt("CardFee") != 0) + rentCardInfo(gdi, rc.right-rc.left); + gdi.scrollToBottom(); + } + else { + string msg="#" + runner->getName() + " (" + cardno + ")\n"+ + runner->getClub()+". "+runner->getClass() + + "\n" + lang.tl("Tid: ") + runner->getRunningTimeS() + lang.tl(", Plats ") + placeS; + + gdi.addInfoBox("SIINFO", msg, 10000); + } + } + else { + string msg=lang.tl("Status")+": "+ lang.tl(runner->getStatusS()); + + if (!MP.empty()) { + msg=msg+", ("; + vector::iterator it; + char bf[32]; + + for(it=MP.begin(); it!=MP.end(); ++it){ + _itoa_s(*it, bf, 32, 10); + msg=msg+bf+" "; + } + msg+=" "+lang.tl("saknas")+".)"; + } + + if (!silent) { + gdi.fillDown(); + gdi.dropLine(); + gdi.addRectangle(rc, colorLightRed, true); + + gdi.addStringUT(rc.top+6, rc.left+20, 1, info); + if (!warnings.empty()) + gdi.addStringUT(rc.top+6+lh*2, rc.left+20, 1, warnings); + + gdi.addStringUT(rc.top+6+lh, rc.left+20, 0, msg); + + if (runner->getDI().getInt("CardFee") != 0) + rentCardInfo(gdi, rc.right-rc.left); + + gdi.scrollToBottom(); + } + else { + string statusmsg="#" + runner->getName() + " (" + cardno + ")\n"+ + runner->getClub()+". "+runner->getClass() + + "\n" + msg; + + gdi.addInfoBox("SIINFO", statusmsg, 10000); + } + } + + tabForceSync(gdi, gEvent); + gdi.makeEvent("DataUpdate", "sireadout", runner ? runner->getId() : 0, 0, true); + + // Print splits + if (printSplits) + generateSplits(runner, gdi); + + activeSIC.clear(&csic); + + checkMoreCardsInQueue(gdi); + return true; +} + +void TabSI::processPunchOnly(gdioutput &gdi, const SICard &csic) +{ + SICard sic=csic; + DWORD loaded; + gEvent->convertTimes(sic); + oFreePunch *ofp=0; + + if (sic.nPunch==1) + ofp=gEvent->addFreePunch(sic.Punch[0].Time, sic.Punch[0].Code, sic.CardNumber, true); + else if (sic.FinishPunch.Time > 0) + ofp=gEvent->addFreePunch(sic.FinishPunch.Time, oPunch::PunchFinish, sic.CardNumber, true); + else if (sic.StartPunch.Time > 0) + ofp=gEvent->addFreePunch(sic.StartPunch.Time, oPunch::PunchStart, sic.CardNumber, true); + else + ofp=gEvent->addFreePunch(sic.CheckPunch.Time, oPunch::PunchCheck, sic.CardNumber, true); + + if (ofp) { + pRunner r = ofp->getTiedRunner(); + if (gdi.getData("SIPageLoaded", loaded)){ + //gEvent->getRunnerByCard(sic.CardNumber); + + if (r) { + string str=r->getName() + lang.tl(" stämplade vid ") + ofp->getSimpleString(); + gdi.addStringUT(0, str); + gdi.dropLine(); + } + else { + string str="SI " + itos(sic.CardNumber) + lang.tl(" (okänd) stämplade vid ") + ofp->getSimpleString(); + gdi.addStringUT(0, str); + gdi.dropLine(0.3); + } + gdi.scrollToBottom(); + } + + tabForceSync(gdi, gEvent); + gdi.makeEvent("DataUpdate", "sireadout", r ? r->getId() : 0, 0, true); + + } + + checkMoreCardsInQueue(gdi); + return; +} + + +void TabSI::entryCard(gdioutput &gdi, const SICard &sic) +{ + gdi.setText("CardNo", sic.CardNumber); + + string name; + string club; + if (useDatabase) { + pRunner db_r=oe->dbLookUpByCard(sic.CardNumber); + + if (db_r) { + name=db_r->getNameRaw(); + club=db_r->getClub(); + } + } + + //Else get name from card + if (name.empty() && (sic.FirstName[0] || sic.LastName[0])) + name=string(sic.LastName) + ", " + string(sic.FirstName); + + gdi.setText("Name", name); + if (gdi.hasField("Club")) + gdi.setText("Club", club); + + if (name.empty()) + gdi.setInputFocus("Name"); + else if (club.empty() && gdi.hasField("Club")) + gdi.setInputFocus("Club"); + else + gdi.setInputFocus("Class"); +} + +void TabSI::assignCard(gdioutput &gdi, const SICard &sic) +{ + + if (interactiveReadout) { + pRunner rb = oe->getRunner(runnerMatchedId, 0); + + if (rb && oe->checkCardUsed(gdi, *rb, sic.CardNumber)) + return; + + gdi.setText("CardNo", sic.CardNumber); + if (runnerMatchedId != -1 && gdi.isChecked("AutoTie")) + tieCard(gdi); + return; + } + + int storedAssigneIndex = currentAssignIndex; + //Try first current focus + BaseInfo *ii=gdi.getInputFocus(); + char sicode[32]; + sprintf_s(sicode, "%d", sic.CardNumber); + + if (ii && ii->id[0]=='*') { + currentAssignIndex=atoi(ii->id.c_str()+1); + } + else { //If not correct focus, use internal counter + char id[32]; + sprintf_s(id, "*%d", currentAssignIndex++); + + ii=gdi.setInputFocus(id); + + if (!ii) { + currentAssignIndex=0; + sprintf_s(id, "*%d", currentAssignIndex++); + ii=gdi.setInputFocus(id); + } + } + + if (ii && ii->getExtraInt()) { + pRunner r=oe->getRunner(ii->getExtraInt(), 0); + if (r) { + if (oe->checkCardUsed(gdi, *r, sic.CardNumber)) { + currentAssignIndex = storedAssigneIndex; + return; + } + if (r->getCardNo()==0 || + gdi.ask("Skriv över existerande bricknummer?")) { + + r->setCardNo(sic.CardNumber, false); + r->getDI().setInt("CardFee", oe->getDI().getInt("CardFee")); + r->synchronize(); + gdi.setText(ii->id, sicode); + } + } + gdi.TabFocus(); + } + + checkMoreCardsInQueue(gdi); +} + +void TabSI::generateEntryLine(gdioutput &gdi, pRunner r) +{ + oe->synchronizeList(oLRunnerId, true, false); + oe->synchronizeList(oLCardId, false, true); + + gdi.restore("EntryLine", false); + gdi.setRestorePoint("EntryLine"); + gdi.dropLine(1); + int xb = gdi.getCX(); + int yb = gdi.getCY(); + gdi.dropLine(); + gdi.setCX(xb + gdi.scaleLength(10)); + + gdi.fillRight(); + + gdi.pushX(); + storedInfo.checkAge(); + gdi.addInput("CardNo", storedInfo.storedCardNo, 8, SportIdentCB, "Bricka:"); + + gdi.addInput("Name", storedInfo.storedName, 16, 0, "Namn:"); + + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Clubs)) { + gdi.addCombo("Club", 180, 200, 0, "Klubb:", "Skriv första bokstaven i klubbens namn och tryck pil-ner för att leta efter klubben"); + oe->fillClubs(gdi, "Club"); + if (storedInfo.storedClub.empty()) + gdi.selectItemByData("Club", lastClubId); + else + gdi.setText("Club", storedInfo.storedClub); + } + + gdi.addSelection("Class", 150, 200, 0, "Klass:"); + oe->fillClasses(gdi, "Class", oEvent::extraNumMaps, oEvent::filterOnlyDirect); + if (storedInfo.storedClassId > 0 && gdi.selectItemByData("Class", storedInfo.storedClassId)) { + } + else if (!gdi.selectItemByData("Class", lastClassId)) { + gdi.selectFirstItem("Class"); + } + + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Economy)) { + gdi.addCombo("Fee", 60, 150, SportIdentCB, "Anm. avgift:"); + oe->fillFees(gdi, "Fee", false); + + if (!storedInfo.storedFee.empty() && storedInfo.storedFee != "@") + gdi.setText("Fee", storedInfo.storedFee); + else + gdi.setText("Fee", lastFee); + + gdi.dropLine(1.2); + generatePayModeWidget(gdi); + gdi.dropLine(-1.2); + } + + gdi.popX(); + gdi.dropLine(3.1); + + gdi.addString("",0, "Starttid:"); + gdi.dropLine(-0.2); + gdi.addInput("StartTime", storedInfo.storedStartTime, 5, 0, ""); + + gdi.setCX(gdi.getCX()+gdi.scaleLength(50)); + gdi.dropLine(0.2); + gdi.setCX(gdi.getCX()+gdi.scaleLength(5)); + + gdi.addString("", 0, "Telefon:"); + gdi.dropLine(-0.2); + gdi.addInput("Phone", storedInfo.storedPhone, 12, 0, ""); + gdi.dropLine(0.2); + + gdi.setCX(gdi.getCX()+gdi.scaleLength(50)); + + gdi.addCheckbox("RentCard", "Hyrbricka", SportIdentCB, storedInfo.rentState); + if (oe->hasNextStage()) + gdi.addCheckbox("AllStages", "Anmäl till efterföljande etapper", SportIdentCB, storedInfo.allStages); + + if (r!=0) { + if (r->getCardNo()>0) + gdi.setText("CardNo", r->getCardNo()); + + gdi.setText("Name", r->getNameRaw()); + if (gdi.hasField("Club")) { + gdi.selectItemByData("Club", r->getClubId()); + } + gdi.selectItemByData("Class", r->getClassId()); + + oDataConstInterface dci = r->getDCI(); + if (gdi.hasField("Fee")) + gdi.setText("Fee", oe->formatCurrency(dci.getInt("Fee"))); + + gdi.setText("Phone", dci.getString("Phone")); + + gdi.check("RentCard", dci.getInt("CardFee") != 0); + if (gdi.hasField("Paid")) + gdi.check("Paid", dci.getInt("Paid")>0); + else if (gdi.hasField("PayMode")) { + int paidId = dci.getInt("Paid") > 0 ? r->getPaymentMode() : 1000; + gdi.selectItemByData("PayMode", paidId); + } + + if (gdi.hasField("AllStages")) { + gdi.check("AllStages", r->hasFlag(oRunner::FlagTransferNew)); + } + } + + gdi.popX(); + gdi.dropLine(2); + gdi.addButton("EntryOK", "OK", SportIdentCB).setDefault().setExtra(r ? r->getId() : 0); + gdi.addButton("EntryCancel", "Avbryt", SportIdentCB).setCancel(); + gdi.dropLine(0.1); + gdi.addString("EntryInfo", fontMediumPlus, "").setColor(colorDarkRed); + updateEntryInfo(gdi); + gdi.setInputFocus("CardNo"); + gdi.dropLine(2); + + RECT rc = {xb, yb, gdi.getWidth(), gdi.getHeight()}; + gdi.addRectangle(rc, colorLightCyan); + gdi.scrollToBottom(); + gdi.popX(); + gdi.setOnClearCb(SportIdentCB); +} + +void TabSI::updateEntryInfo(gdioutput &gdi) +{ + int fee = oe->interpretCurrency(gdi.getText("Fee", true)); + if (gdi.isChecked("RentCard")) { + int cardFee = oe->getDI().getInt("CardFee"); + if (cardFee > 0) + fee += cardFee; + } + if (gdi.isChecked("AllStages")) { + int nums = oe->getNumStages(); + int cs = oe->getStageNumber(); + if (nums > 0 && cs <= nums) { + int np = nums - cs + 1; + fee *= np; + } + + } + + string method; + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Economy)) { + bool invoice = true; + if (gdi.hasField("PayMode")) { + invoice = gdi.getSelectedItem("PayMode").first == 1000; + } + else + invoice = !gdi.isChecked("Paid"); + + if (!invoice) + method = lang.tl("Att betala"); + else + method = lang.tl("Faktureras"); + + gdi.setText("EntryInfo", lang.tl("X: Y. Tryck för att spara#" + + method + "#" + oe->formatCurrency(fee)), true); + } + else { + gdi.setText("EntryInfo", lang.tl("Press Enter to continue"), true); + + } +} + +void TabSI::generateSplits(const pRunner r, gdioutput &gdi) +{ + const bool wideFormat = oe->getPropertyInt("WideSplitFormat", 0) == 1; + if (wideFormat) { + addToPrintQueue(r); + while(checkpPrintQueue(gdi)); + } + else { + gdioutput gdiprint(2.0, gdi.getEncoding(), gdi.getHWND(), splitPrinter); + vector mp; + r->evaluateCard(true, mp); + r->printSplits(gdiprint); + printProtected(gdi, gdiprint); + //gdiprint.print(splitPrinter, oe, false, true); + } +} + +void TabSI::generateStartInfo(gdioutput &gdi, const oRunner &r) { + if (printStartInfo) { + gdioutput gdiprint(2.0, gdi.getEncoding(), gdi.getHWND(), splitPrinter); + r.printStartInfo(gdiprint); + printProtected(gdi, gdiprint); + //gdiprint.print(splitPrinter, oe, false, true); + } +} + +void TabSI::printerSetup(gdioutput &gdi) +{ + gdi.printSetup(splitPrinter); +} + +void TabSI::checkMoreCardsInQueue(gdioutput &gdi) { + // Create a local list to avoid stack overflow + list cards = CardQueue; + CardQueue.clear(); + std::exception storedEx; + bool fail = false; + + while (!cards.empty()) { + SICard c = cards.front(); + cards.pop_front(); + try { + gdi.RemoveFirstInfoBox("SIREAD"); + insertSICard(gdi, c); + } + catch (std::exception &ex) { + fail = true; + storedEx = ex; + } + } + + if (fail) + throw storedEx; +} + +bool TabSI::autoAssignClass(pRunner r, const SICard &sic) { + if (r && r->getClassId()==0) { + vector classes; + int dist = oe->findBestClass(sic, classes); + + if (classes.size() == 1 && dist>=-1 && dist<=1) // Allow at most one wrong punch + r->setClassId(classes[0]->getId(), true); + } + + return r && r->getClassId() != 0; +} + +void TabSI::showManualInput(gdioutput &gdi) { + runnerMatchedId = -1; + gdi.setRestorePoint("ManualInput"); + gdi.fillDown(); + gdi.dropLine(0.7); + + int x = gdi.getCX(); + int y = gdi.getCY(); + + gdi.setCX(x+gdi.scaleLength(15)); + gdi.dropLine(); + gdi.addString("", 1, "Manuell inmatning"); + gdi.fillRight(); + gdi.pushX(); + gdi.dropLine(); + gdi.addInput("Manual", "", 20, SportIdentCB, "Nummerlapp, SI eller Namn:"); + gdi.addInput("FinishTime", lang.tl("Aktuell tid"), 8, SportIdentCB, "Måltid:").setFgColor(colorGreyBlue).setExtra(1); + gdi.dropLine(1.2); + gdi.addCheckbox("StatusOK", "Godkänd", SportIdentCB, true); + gdi.addCheckbox("StatusDNF", "Utgått", SportIdentCB, false); + gdi.dropLine(-0.3); + gdi.addButton("ManualOK", "OK", SportIdentCB).setDefault(); + gdi.fillDown(); + gdi.dropLine(2); + gdi.popX(); + gdi.addString("FindMatch", 0, "", 0).setColor(colorDarkGreen); + gdi.dropLine(); + + RECT rc; + rc.left=x; + rc.right=gdi.getWidth()-10; + rc.top=y; + rc.bottom=gdi.getCY()+gdi.scaleLength(5); + gdi.dropLine(); + gdi.addRectangle(rc, colorLightBlue); + //gdi.refresh(); + gdi.scrollToBottom(); +} + +void TabSI::tieCard(gdioutput &gdi) { + int card = gdi.getTextNo("CardNo"); + pRunner r = oe->getRunner(runnerMatchedId, 0); + + if (r == 0) + throw meosException("Invalid binding"); + + if (oe->checkCardUsed(gdi, *r, card)) + return; + + if (r->getCardNo() > 0 && r->getCardNo() != card) { + if (!gdi.ask("X har redan bricknummer Y. Vill du ändra det?#" + r->getName() + "#" + itos(r->getCardNo()))) + return; + } + + bool rent = gdi.isChecked("RentCardTie"); + r->setCardNo(card, true, false); + r->getDI().setInt("CardFee", rent ? oe->getDI().getInt("CardFee") : 0); + r->synchronize(true); + + gdi.restore("ManualTie"); + gdi.pushX(); + gdi.fillRight(); + gdi.addStringUT(italicText, getLocalTimeOnly()); + if (!r->getBib().empty()) + gdi.addStringUT(0, r->getBib(), 0); + gdi.addStringUT(0, r->getName(), 0); + + if (r->getTeam() && r->getTeam()->getName() != r->getName()) + gdi.addStringUT(0, "(" + r->getTeam()->getName() + ")", 0); + else if (!r->getClub().empty()) + gdi.addStringUT(0, "(" + r->getClub() + ")", 0); + + gdi.addStringUT(1, itos(r->getCardNo()), 0).setColor(colorDarkGreen); + gdi.addString("EditAssign", 0, "Ändra", SportIdentCB).setExtra(r->getId()); + gdi.dropLine(1.5); + gdi.popX(); + + showAssignCard(gdi, false); +} + +void TabSI::showAssignCard(gdioutput &gdi, bool showHelp) { + gdi.enableInput("Interactive"); + gdi.disableInput("Database", true); + gdi.disableInput("PrintSplits"); + gdi.disableInput("StartInfo"); + gdi.disableInput("UseManualInput"); + gdi.setRestorePoint("ManualTie"); + gdi.fillDown(); + if (interactiveReadout) { + if (showHelp) + gdi.addString("", 10, "Avmarkera 'X' för att hantera alla bricktildelningar samtidigt.#" + lang.tl("Interaktiv inläsning")); + } + else { + if (showHelp) + gdi.addString("", 10, "Markera 'X' för att hantera deltagarna en och en.#" + lang.tl("Interaktiv inläsning")); + gEvent->assignCardInteractive(gdi, SportIdentCB); + gdi.refresh(); + return; + } + + runnerMatchedId = -1; + gdi.fillDown(); + gdi.dropLine(0.7); + + int x = gdi.getCX(); + int y = gdi.getCY(); + + gdi.setCX(x+gdi.scaleLength(15)); + gdi.dropLine(); + gdi.addString("", 1, "Knyt bricka / deltagare"); + gdi.fillRight(); + gdi.pushX(); + gdi.dropLine(); + gdi.addInput("RunnerId", "", 20, SportIdentCB, "Nummerlapp, lopp-id eller namn:"); + gdi.addInput("CardNo", "", 8, SportIdentCB, "Bricknr:"); + gdi.dropLine(1.2); + gdi.addCheckbox("AutoTie", "Knyt automatiskt efter inläsning", SportIdentCB, oe->getPropertyInt("AutoTie", 1) != 0); + gdi.addCheckbox("RentCardTie", "Hyrd", SportIdentCB, oe->getPropertyInt("RentCard", 0) != 0); + + gdi.dropLine(-0.3); + gdi.addButton("TieOK", "OK", SportIdentCB).setDefault(); + gdi.disableInput("TieOK"); + gdi.setInputFocus("RunnerId"); + gdi.fillDown(); + gdi.dropLine(2); + gdi.popX(); + gdi.addString("FindMatch", 0, "", 0).setColor(colorDarkGreen); + gdi.dropLine(); + + RECT rc; + rc.left=x; + rc.right=gdi.getWidth()+gdi.scaleLength(5); + rc.top=y; + rc.bottom=gdi.getCY()+gdi.scaleLength(5); + gdi.dropLine(); + gdi.addRectangle(rc, colorLightBlue); + gdi.scrollToBottom(); +} + +pRunner TabSI::getRunnerByIdentifier(int identifier) const { + int id; + if (identifierToRunnerId.lookup(identifier, id)) { + pRunner r = oe->getRunner(id, 0); + if (r && r->getRaceIdentifier() == identifier) + return r; + else + minRunnerId = 0; // Map is out-of-date + } + + if (identifier < minRunnerId) + return 0; + + minRunnerId = MAXINT; + identifierToRunnerId.clear(); + + pRunner ret = 0; + vector runners; + oe->autoSynchronizeLists(false); + oe->getRunners(0, 0, runners, false); + for ( size_t k = 0; k< runners.size(); k++) { + if (runners[k]->getRaceNo() == 0) { + int i = runners[k]->getRaceIdentifier(); + identifierToRunnerId.insert(i, runners[k]->getId()); + minRunnerId = min(minRunnerId, i); + if (i == identifier) + ret = runners[k]; + } + } + return ret; +} + +bool TabSI::askOverwriteCard(gdioutput &gdi, pRunner r) const { + return gdi.ask("ask:overwriteresult#" + r->getCompleteIdentification()); +} + +void TabSI::showModeCardData(gdioutput &gdi) { + gdi.disableInput("Interactive", true); + gdi.enableInput("Database", true); + gdi.enableInput("PrintSplits"); + gdi.disableInput("StartInfo", true); + gdi.disableInput("UseManualInput", true); + + gdi.dropLine(); + gdi.fillDown(); + gdi.pushX(); + gdi.addString("", boldLarge, "Print Card Data"); + gdi.addString("", 10, "help:analyzecard"); + gdi.dropLine(); + gdi.fillRight(); + gdi.addButton("ClearMemory", "Clear Memory", SportIdentCB); + gdi.addButton("SaveMemory", "Spara...", SportIdentCB); + if (oe->empty()) { + gdi.addButton("CreateCompetition", "Create Competition", SportIdentCB); + if (savedCards.empty()) + gdi.disableInput("CreateCompetition"); + } + gdi.dropLine(3); + gdi.popX(); + bool first = true; + for (list >::iterator it = savedCards.begin(); it != savedCards.end(); ++it) { + gdi.dropLine(0.5); + if (!first) { + RECT rc = {30, gdi.getCY(), gdi.scaleLength(250), gdi.getCY() + 3}; + gdi.addRectangle(rc); + } + first = false; + + printCard(gdi, it->first, false); + } +} + +void TabSI::EditCardData::handle(gdioutput &gdi, BaseInfo &info, GuiEventType type) { + if (type == GUI_LINK) { + TextInfo &ti = dynamic_cast(info); + int cardId = ti.getExtraInt(); + SICard &card = tabSI->getCard(cardId); + ti.id = "card" + itos(cardId); + gdi.removeControl("CardName"); + gdi.removeControl("ClubName"); + gdi.removeControl("OKCard"); + gdi.removeControl("CancelCard"); + + string name, club; + if (card.FirstName[0]) + name = card.FirstName + (card.LastName[0] ? (" " + string(card.LastName)) : ""); + club = card.Club; + bool noName = name.empty(); + bool noClub = club.empty(); + if (noName) + name = lang.tl("Namn"); + if (noClub) + club = lang.tl("Klubb"); + + InputInfo &ii = gdi.addInput(ti.xp-2, ti.yp-2, "CardName", name, 18, 0); + ii.setHandler(this); + InputInfo &ii2 = gdi.addInput(ti.xp + ii.getWidth(), ti.yp-2, "ClubName", club, 22, 0); + ii2.setExtra(noClub).setHandler(this); + ButtonInfo &bi = gdi.addButton(ii2.getX() + 2 + ii2.getWidth(), ti.yp-4, "OKCard", "OK", 0); + bi.setExtra(cardId).setHandler(this); + bi.setDefault(); + int w, h; + bi.getDimension(gdi, w, h); + gdi.addButton(bi.xp + w + 4, ti.yp-4, "CancelCard", "Avbryt", 0).setCancel().setHandler(this); + gdi.setInputFocus(ii.id, noName); + } + else if (type == GUI_BUTTON) { + ButtonInfo bi = dynamic_cast(info); + //OKCard or CancelCard + if (bi.id == "OKCard") { + int cardId = bi.getExtraInt(); + SICard &card = tabSI->getCard(cardId); + string name = gdi.getText("CardName"); + string club = gdi.getBaseInfo("ClubName").getExtra() ? "" : gdi.getText("ClubName"); + string given = getGivenName(name); + string familty = getFamilyName(name); + strncpy_s(card.FirstName, given.c_str(), sizeof(card.FirstName)-1); + strncpy_s(card.LastName, familty.c_str(), sizeof(card.LastName)-1); + strncpy_s(card.Club, club.c_str(), sizeof(card.Club)-1); + + string s = name; + if (!club.empty()) + s += ", " + club; + gdi.setText("card" + itos(cardId), s, true); + } + + gdi.removeControl("CardName"); + gdi.removeControl("ClubName"); + gdi.removeControl("OKCard"); + gdi.removeControl("CancelCard"); + } + else if (type == GUI_FOCUS) { + InputInfo &ii = dynamic_cast(info); + if (ii.getExtraInt()) { + ii.setExtra(0); + gdi.setInputFocus(ii.id, true); + } + } +} + + +void TabSI::printCard(gdioutput &gdi, int cardId, bool forPrinter) const { + SICard &c = getCard(cardId); + if (c.readOutTime[0] == 0) + strcpy_s(c.readOutTime, getLocalTime().c_str()); + + gdi.pushX(); + gdi.fillRight(); + string name, clubName; + if (c.FirstName[0] != 0) { + name = string(c.FirstName) + " " + c.LastName; + clubName = c.Club; + } + else { + const RunnerDBEntry *r = oe->getRunnerDatabase().getRunnerByCard(c.CardNumber); + if (r) { + r->getName(name); + const oClub *club = oe->getRunnerDatabase().getClub(r->clubNo); + if (club) { + clubName = club->getName(); + strncpy_s(c.Club, clubName.c_str(), sizeof(c.Club)-1); + } + string given = r->getGivenName(); + string family = r->getFamilyName(); + strncpy_s(c.FirstName, given.c_str(), sizeof(c.FirstName)-1); + strncpy_s(c.LastName, family.c_str(), sizeof(c.LastName)-1); + } + } + + gdi.addString("", 1, "Bricka X#" + itos(c.CardNumber)); + + if (!forPrinter && name.empty()) + name = lang.tl("Okänd"); + + if (!name.empty()) { + if (!clubName.empty()) + name += ", " + clubName; + gdi.fillDown(); + gdi.addStringUT(0, name).setExtra(cardId).setHandler(&editCardData); + gdi.popX(); + } + gdi.fillDown(); + gdi.addStringUT(0, c.readOutTime); + gdi.popX(); + + int start = NOTIME; + if (c.CheckPunch.Code != -1) + gdi.addString("", 0, "Check: X#" + formatTimeHMS(c.CheckPunch.Time)); + + if (c.StartPunch.Code != -1) { + gdi.addString("", 0, "Start: X#" + formatTimeHMS(c.StartPunch.Time)); + start = c.StartPunch.Time; + } + int xp = gdi.getCX(); + int xp2 = xp + gdi.scaleLength(25); + int xp3 = xp2 + gdi.scaleLength(35); + int xp4 = xp3 + gdi.scaleLength(60); + int xp5 = xp4 + gdi.scaleLength(45); + + int accTime = 0; + int days = 0; + for (unsigned k = 0; k < c.nPunch; k++) { + int cy = gdi.getCY(); + gdi.addStringUT(cy, xp, 0, itos(k+1) + "."); + gdi.addStringUT(cy, xp2, 0, itos(c.Punch[k].Code)); + gdi.addStringUT(cy, xp3, 0, formatTimeHMS(c.Punch[k].Time % (24*3600))); + if (start != NOTIME) { + int legTime = analyzePunch(c.Punch[k], start, accTime, days); + if (legTime > 0) + gdi.addStringUT(cy, xp5-gdi.scaleLength(10), textRight, formatTime(legTime)); + + gdi.addStringUT(cy, xp5 + gdi.scaleLength(40), textRight, formatTime(days*3600*24 + accTime)); + } + else { + start = c.Punch[k].Time; + } + } + if (c.FinishPunch.Code != -1) { + int cy = gdi.getCY(); + gdi.addString("", cy, xp, 0, "Mål"); + gdi.addStringUT(cy, xp3, 0, formatTimeHMS(c.FinishPunch.Time % (24*3600))); + + if (start != NOTIME) { + int legTime = analyzePunch(c.FinishPunch, start, accTime, days); + if (legTime > 0) + gdi.addStringUT(cy, xp5-gdi.scaleLength(10), textRight, formatTime(legTime)); + + gdi.addStringUT(cy, xp5 + gdi.scaleLength(40), textRight, formatTime(days*3600*24 + accTime)); + } + gdi.addString("", 1, "Time: X#" + formatTime(days*3600*24 + accTime)); + } + + if (forPrinter) { + gdi.dropLine(1); + + vector< pair > lines; + oe->getExtraLines("SPExtra", lines); + + for (size_t k = 0; k < lines.size(); k++) { + gdi.addStringUT(lines[k].second, lines[k].first); + } + if (lines.size()>0) + gdi.dropLine(0.5); + + gdi.addString("", fontSmall, "Av MeOS: www.melin.nu/meos"); + } +} + +int TabSI::analyzePunch(SIPunch &p, int &start, int &accTime, int &days) { + int newAccTime = p.Time - start; + if (newAccTime < 0) { + newAccTime += 3600 * 24; + if (accTime > 12 * 3600) + days++; + } + else if (newAccTime < accTime - 12 * 3600) { + days++; + } + int legTime = newAccTime - accTime; + accTime = newAccTime; + return legTime; +} + +void TabSI::generateSplits(int cardId, gdioutput &gdi) { + gdioutput gdiprint(2.0, gdi.getEncoding(), gdi.getHWND(), splitPrinter); + printCard(gdiprint, cardId, true); + printProtected(gdi, gdiprint); +} + +void TabSI::printProtected(gdioutput &gdi, gdioutput &gdiprint) { + try { + gdiprint.print(splitPrinter, oe, false, true); + } + catch (meosException &ex) { + DWORD loaded; + if (gdi.getData("SIPageLoaded", loaded)) { + gdi.dropLine(); + gdi.fillDown(); + gdi.addString("", 0, ex.what(), 0).setColor(colorRed); + gdi.dropLine(); + gdi.scrollToBottom(); + } + else { + if (!printErrorShown) { + printErrorShown = true; + gdi.alert(ex.what()); + printErrorShown = false; + } + } + } +} + +void TabSI::createCompetitionFromCards(gdioutput &gdi) { + oe->newCompetition(lang.tl("Ny tävling")); + gdi.setWindowTitle(""); + map hashCount; + vector< pair > cards; + int zeroTime = 3600 * 24; + for (list >::iterator it = savedCards.begin(); it != savedCards.end(); ++it) { + size_t hash = 0; + if (it->second.StartPunch.Code != -1 && it->second.StartPunch.Time > 0) + zeroTime = min(zeroTime, it->second.StartPunch.Time); + + for (unsigned k = 0; k < it->second.nPunch; k++) { + hash = 997 * hash + (it->second.Punch[k].Code-30); + if (it->second.Punch[k].Code != -1 && it->second.Punch[k].Time > 0) + zeroTime = min(zeroTime, it->second.Punch[k].Time); + } + pair p(hash, &it->second); + ++hashCount[hash]; + cards.push_back(p); + } + + zeroTime -= 3600; + if (zeroTime < 0) + zeroTime += 3600 * 24; + zeroTime -= zeroTime % 1800; + oe->setZeroTime(formatTime(zeroTime)); + + int course = 0; + for (size_t k = 0; k < cards.size(); k++) { + if (!hashCount.count(cards[k].first)) + continue; + int count = hashCount[cards[k].first]; + if (count < 5 && count < int(cards.size()) /2) + continue; + + pCourse pc = oe->addCourse(lang.tl("Bana ") + itos(++course)); + for (unsigned j = 0; j < cards[k].second->nPunch; j++) { + pc->addControl(cards[k].second->Punch[j].Code); + } + oe->addClass(lang.tl("Klass ") + itos(course), pc->getId()); + hashCount.erase(cards[k].first); + } + + // Add remaining classes if suitable + for (size_t k = 0; k < cards.size(); k++) { + if (!hashCount.count(cards[k].first)) + continue; + int count = hashCount[cards[k].first]; + if (count == 1) + continue; // Don't allow singelton runner classes + + vector cls; + int dist = oe->findBestClass(*cards[k].second, cls); + + if (abs(dist) > 3) { + pCourse pc = oe->addCourse(lang.tl("Bana ") + itos(++course)); + for (unsigned j = 0; j < cards[k].second->nPunch; k++) { + pc->addControl(cards[k].second->Punch[j].Code); + } + oe->addClass(lang.tl("Klass ") + itos(course), pc->getId()); + hashCount.erase(cards[k].first); + } + } + + // Add competitors + for (size_t k = 0; k < cards.size(); k++) { + if (oe->isCardRead(*cards[k].second)) + continue; + + vector cls; + oe->findBestClass(*cards[k].second, cls); + + if (!cls.empty()) { + string name; + if (cards[k].second->FirstName[0]) + name = string(cards[k].second->FirstName); + if (cards[k].second->LastName[0]) + name += " " + string(cards[k].second->LastName); + + if (name.empty()) + name = lang.tl("Bricka X#" + itos(cards[k].second->CardNumber)); + + oe->addRunner(name, string(cards[k].second->Club), cls[0]->getId(), + cards[k].second->CardNumber, 0, true); + + processInsertCard(*cards[k].second); + } + } + + TabList &tc = dynamic_cast(*gdi.getTabs().get(TListTab)); + tc.loadPage(gdi, "ResultIndividual"); +} + +void TabSI::StoredStartInfo::checkAge() { + DWORD t = GetTickCount(); + const int minuteLimit = 3; + if (t > age && (t - age) > (1000*60*minuteLimit)) { + clear(); + } + age = t; +} + +void TabSI::StoredStartInfo::clear() { + age = GetTickCount(); + storedName.clear(); + storedCardNo.clear(); + storedClub.clear(); + storedFee.clear(); + storedPhone.clear(); + rentState = false; + storedStartTime.clear(); + hasPaid = false; + payMode = 1000; + //allStages = lastAllStages; // Always use last setting + storedClassId = 0; +} + +void TabSI::clearCompetitionData() { + savedCardUniqueId = 1; + checkedCardFlags.clear(); + currentAssignIndex = 0; +} + +SICard &TabSI::getCard(int id) const { + if (id < int(savedCards.size() / 2)) { + for (list< pair >::const_iterator it = savedCards.begin(); it != savedCards.end(); ++it){ + if (it->first==id) + return const_cast(it->second); + } + } + else { + for (list< pair >::const_reverse_iterator it = savedCards.rbegin(); it != savedCards.rend(); ++it){ + if (it->first==id) + return const_cast(it->second); + } + } + throw meosException("Interal error"); +} + +bool compareCardNo(const pRunner &r1, const pRunner &r2) { + int c1 = r1->getCardNo(); + int c2 = r2->getCardNo(); + if (c1 != c2) + return c1 < c2; + int f1 = r1->getFinishTime(); + int f2 = r2->getFinishTime(); + if (f1 != f2) + return f1 < f2; + + return false; +} + +string TabSI::getCardInfo(bool param, vector &count) const { + if (!param) { + assert(count.size() == 8); + return "Totalt antal unika avbockade brickor: X#" + itos(count[CNFCheckedAndUsed] + + count[CNFChecked] + + count[CNFCheckedNotRented] + + count[CNFCheckedRentAndNotRent]); + } + count.clear(); + count.resize(8); + for (map::const_iterator it = checkedCardFlags.begin(); + it != checkedCardFlags.end(); ++it) { + ++count[it->second]; + } + + string msg = "Uthyrda: X, Egna: Y, Avbockade uthyrda: Z#" + itos(count[CNFUsed] + count[CNFCheckedAndUsed]) + + "#" + itos(count[CNFNotRented] + count[CNFCheckedNotRented]) + + "#" + itos(count[CNFCheckedAndUsed]); + + return msg; +} + +void TabSI::showCheckCardStatus(gdioutput &gdi, const string &cmd) { + vector r; + const int cx = gdi.getCX(); + const int col1 = gdi.scaleLength(50); + const int col2 = gdi.scaleLength(200); + + if (cmd == "init") { + gdi.disableInput("Interactive"); + gdi.disableInput("Database"); + gdi.disableInput("PrintSplits"); + gdi.disableInput("UseManualInput"); + gdi.fillDown(); + gdi.addString("", 10, "help:checkcards"); + + gdi.dropLine(); + gdi.fillRight(); + gdi.pushX(); + gdi.addButton("CCSReport", "Rapport", SportIdentCB); + gdi.addButton("CCSClear", "Nollställ", SportIdentCB, + "Nollställ minnet; markera alla brickor som icke avbockade"); + gdi.addButton("CCSPrint", "Skriv ut...", SportIdentCB); + + gdi.popX(); + gdi.dropLine(3); + gdi.fillDown(); + gdi.setRestorePoint("CCSInit"); + showCheckCardStatus(gdi, "fillrunner"); + showCheckCardStatus(gdi, "stat"); + showCheckCardStatus(gdi, "tickoff"); + return; + } + else if (cmd == "fillrunner") { + oe->getRunners(0, 0, r); + + for (size_t k = 0; k < r.size(); k++) { + int cno = r[k]->getCardNo(); + if (cno == 0) + continue; + int cf = checkedCardFlags[cno]; + if (r[k]->getDI().getInt("CardFee") != 0) + checkedCardFlags[cno] = CardNumberFlags(cf | CNFUsed); + else + checkedCardFlags[cno] = CardNumberFlags(cf | CNFNotRented); + } + } + else if (cmd == "stat") { + vector count; + gdi.addString("CardInfo", fontMediumPlus, getCardInfo(true, count)); + gdi.addString("CardTicks", 0, getCardInfo(false, count)); + if (count[CNFCheckedRentAndNotRent] + count[CNFRentAndNotRent] > 0) { + oe->getRunners(0, 0, r); + stable_sort(r.begin(), r.end(), compareCardNo); + gdi.dropLine(); + string msg = "Brickor markerade som både uthyrda och egna: X#" + itos(count[CNFCheckedRentAndNotRent] + count[CNFRentAndNotRent]); + gdi.addString("", 1, msg).setColor(colorDarkRed); + gdi.dropLine(0.5); + for (size_t k = 0; k < r.size(); k++) { + int cno = r[k]->getCardNo(); + if (cno == 0 || r[k]->getRaceNo() > 0) + continue; + + if (checkedCardFlags[cno] == CNFCheckedRentAndNotRent || + checkedCardFlags[cno] == CNFRentAndNotRent) { + int yp = gdi.getCY(); + string cp = r[k]->getCompleteIdentification(); + bool rent = r[k]->getDI().getInt("CardFee") != 0; + string info = rent ? (" (" + lang.tl("Hyrd") + ")") : ""; + gdi.addStringUT(yp, cx, 0, itos(cno) + info); + gdi.addStringUT(yp, cx + col2, 0, cp); + } + } + } + } + else if (cmd == "report") { + oe->getRunners(0, 0, r); + stable_sort(r.begin(), r.end(), compareCardNo); + bool showHead = false; + int count = 0; + for (size_t k = 0; k < r.size(); k++) { + int cno = r[k]->getCardNo(); + if (cno == 0) + continue; + if (r[k]->getRaceNo() > 0) + continue; + CardNumberFlags f = checkedCardFlags[cno]; + if (f == CNFRentAndNotRent || f == CNFUsed) { + if (!showHead) { + gdi.dropLine(); + string msg = "Uthyrda brickor som inte avbockats"; + gdi.addString("", fontMediumPlus, msg); + gdi.fillDown(); + gdi.dropLine(0.5); + showHead = true; + } + int yp = gdi.getCY(); + gdi.addStringUT(yp, cx, 0, itos(++count)); + gdi.addStringUT(yp, cx + col1, 0, itos(cno)); + string cp = r[k]->getCompleteIdentification(); + + if (r[k]->getStatus() != StatusUnknown) + cp += " " + r[k]->getStatusS(); + else + cp += MakeDash(" -"); + + int s = r[k]->getStartTime(); + int f = r[k]->getFinishTime(); + if (s> 0 || f>0) { + cp += ", " + (s>0 ? r[k]->getStartTimeS() : string("?")) + MakeDash(" - ") + + (f>0 ? r[k]->getFinishTimeS() : string("?")); + } + gdi.addStringUT(yp, cx + col2, 0, cp); + } + } + + if (!showHead) { + gdi.dropLine(); + string msg = "Alla uthyrda brickor har bockats av."; + gdi.addString("", fontMediumPlus, msg).setColor(colorGreen); + } + } + else if (cmd == "tickoff") { + SICard sic; + sic.clear(0); + for (map::const_iterator it = checkedCardFlags.begin(); + it != checkedCardFlags.end(); ++it) { + int stat = it->second; + if (stat & CNFChecked) { + sic.CardNumber = it->first; + checkCard(gdi, sic, false); + } + } + gdi.refresh(); + return; + } + checkHeader = false; + gdi.dropLine(); +} + +void TabSI::checkCard(gdioutput &gdi, const SICard &card, bool updateAll) { + bool wasChecked = (checkedCardFlags[card.CardNumber] & CNFChecked) != 0 && updateAll; + + checkedCardFlags[card.CardNumber] = CardNumberFlags(checkedCardFlags[card.CardNumber] | CNFChecked); + vector count; + if (!checkHeader) { + checkHeader = true; + gdi.addString("", fontMediumPlus, "Avbockade brickor:"); + gdi.dropLine(0.5); + cardPosX = gdi.getCX(); + cardPosY = gdi.getCY(); + cardOffsetX = gdi.scaleLength(60); + cardNumCol = 12; + cardCurrentCol = 0; + } + + if (updateAll) { + gdi.setTextTranslate("CardInfo", getCardInfo(true, count)); + gdi.setTextTranslate("CardTicks", getCardInfo(false, count)); + } + TextInfo &ti = gdi.addStringUT(cardPosY, cardPosX + cardCurrentCol * cardOffsetX, 0, itos(card.CardNumber)); + if (wasChecked) + ti.setColor(colorRed); + if (++cardCurrentCol >= cardNumCol) { + cardCurrentCol = 0; + cardPosY += gdi.getLineHeight(); + } + + if (updateAll) { + gdi.scrollToBottom(); + gdi.refreshFast(); + } +} + +void TabSI::generatePayModeWidget(gdioutput &gdi) const { + vector< pair > pm; + oe->getPayModes(pm); + assert(pm.size() > 0); + if (pm.size() == 1) { + assert(pm[0].second == 0); + gdi.addCheckbox("Paid", "#" + pm[0].first, SportIdentCB, storedInfo.hasPaid); + } + else { + pm.insert(pm.begin(), make_pair(lang.tl("Faktureras"), 1000)); + gdi.addSelection("PayMode", 110, 100, SportIdentCB); + gdi.addItem("PayMode", pm); + gdi.selectItemByData("PayMode", storedInfo.payMode); + gdi.autoGrow("PayMode"); + } +} + +bool TabSI::writePayMode(gdioutput &gdi, int amount, oRunner &r) { + int paid = 0; + bool hasPaid = false; + + if (gdi.hasField("PayMode")) + hasPaid = gdi.getSelectedItem("PayMode").first != 1000; + + bool fixPay = gdi.isChecked("Paid"); + if (hasPaid || fixPay) { + paid = amount; + } + + r.getDI().setInt("Paid", paid); + if (hasPaid) { + r.setPaymentMode(gdi.getSelectedItem("PayMode").first); + } + return hasPaid || fixPay; +} + +void TabSI::addToPrintQueue(pRunner r) { + unsigned t = GetTickCount(); + printPunchRunnerIdQueue.push_back(make_pair(t, r->getId())); +} + +bool TabSI::checkpPrintQueue(gdioutput &gdi) { + if (printPunchRunnerIdQueue.empty()) + return false; + size_t printLen = oe->getPropertyInt("NumSplitsOnePage", 3); + if (printPunchRunnerIdQueue.size() < printLen) { + unsigned t = GetTickCount(); + unsigned diff = abs(int(t - printPunchRunnerIdQueue.front().first))/1000; + + if (diff < (unsigned)oe->getPropertyInt("SplitPrintMaxWait", 60)) + return false; // Wait a little longer + } + + gdioutput gdiprint(2.0, gdi.getEncoding(), gdi.getHWND(), splitPrinter); + vector mp; + for (size_t m = 0; m < printLen && !printPunchRunnerIdQueue.empty(); m++) { + int rid = printPunchRunnerIdQueue.front().second; + printPunchRunnerIdQueue.pop_front(); + pRunner r = oe->getRunner(rid, 0); + if (r) { + r->evaluateCard(true, mp); + r->printSplits(gdiprint); + } + gdiprint.dropLine(4); + } + + printProtected(gdi, gdiprint); + //gdiprint.print(splitPrinter, oe, false, true); + return true; +} + +void TabSI::printSIInfo(gdioutput &gdi, const string &port) const { + vector info; + gdi.fillDown(); + gSI->getInfoString(port, info); + for (size_t j = 0; j < info.size(); j++) + gdi.addStringUT(0, info[j]); +} diff --git a/code/TabSI.h b/code/TabSI.h new file mode 100644 index 0000000..438bb86 --- /dev/null +++ b/code/TabSI.h @@ -0,0 +1,229 @@ +#pragma once +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ +#include "tabbase.h" +#include "SportIdent.h" +#include "Printer.h" +#include "inthashmap.h" + +struct PunchInfo; +class csvparser; + +class TabSI : public TabBase { + public: + enum SIMode { + ModeReadOut, + ModeAssignCards, + ModeCheckCards, + ModeEntry, + ModeCardData + }; + +private: + /** Try to automatcally assign a class to runner (if none is given) + Return true if runner has a class on exist */ + bool autoAssignClass(pRunner r, const SICard &sic); + + void checkMoreCardsInQueue(gdioutput &gdi); + + pRunner autoMatch(const SICard &sic, pRunner db_r); + void processPunchOnly(gdioutput &gdi, const SICard &sic); + void startInteractive(gdioutput &gdi, const SICard &sic, + pRunner r, pRunner db_r); + bool processCard(gdioutput &gdi, pRunner runner, const SICard &csic, + bool silent=false); + bool processUnmatched(gdioutput &gdi, const SICard &csic, bool silent); + + void rentCardInfo(gdioutput &gdi, int width); + + bool interactiveReadout; + bool useDatabase; + bool printSplits; + bool printStartInfo; + bool manualInput; + PrinterObject splitPrinter; + list< pair > printPunchRunnerIdQueue; + void addToPrintQueue(pRunner r); + + vector punches; + vector cards; + vector filterDate; + + int runnerMatchedId; + bool printErrorShown; + void printProtected(gdioutput &gdi, gdioutput &gdiprint); + + //Interactive card assign + SIMode mode; + int currentAssignIndex; + + void printSIInfo(gdioutput &gdi, const string &port) const; + + void assignCard(gdioutput &gdi, const SICard &sic); + void entryCard(gdioutput &gdi, const SICard &sic); + + void updateEntryInfo(gdioutput &gdi); + void generateEntryLine(gdioutput &gdi, pRunner r); + int lastClassId; + int lastClubId; + string lastFee; + int inputId; + + void showCheckCardStatus(gdioutput &gdi, const string &cmd); + + string getCardInfo(bool param, vector &count) const; + // Formatting for card tick off + bool checkHeader; + int cardPosX; + int cardPosY; + int cardOffsetX; + int cardNumCol; + int cardCurrentCol; + + enum CardNumberFlags { + // Basic flags + CNFChecked = 1, + CNFUsed = 2, + CNFNotRented = 4, + + // Combinations + CNFCheckedAndUsed = 3, + CNFCheckedNotRented = 5, + CNFRentAndNotRent = 6, + CNFCheckedRentAndNotRent = 7, + }; + + map checkedCardFlags; + void checkCard(gdioutput &gdi, const SICard &sic, bool updateAll); + + void showReadPunches(gdioutput &gdi, vector &punches, set &dates); + void showReadCards(gdioutput &gdi, vector &cards); + + void showManualInput(gdioutput &gdi); + void showAssignCard(gdioutput &gdi, bool showHelp); + + pRunner getRunnerByIdentifier(int id) const; + mutable inthashmap identifierToRunnerId; + mutable int minRunnerId; + void tieCard(gdioutput &gdi); + + // Insert card without converting times and with/without runner + void processInsertCard(const SICard &csic); + + + void generateSplits(const pRunner r, gdioutput &gdi); + int logcounter; + csvparser *logger; + + string insertCardNumberField; + + void insertSICardAux(gdioutput &gdi, SICard &sic); + + // Ask if card is to be overwritten + bool askOverwriteCard(gdioutput &gdi, pRunner r) const; + + list< pair > savedCards; + int savedCardUniqueId; + SICard &getCard(int id) const; + + void showModeCardData(gdioutput &gdi); + + void printCard(gdioutput &gdi, int cardId, bool forPrinter) const; + void generateSplits(int cardId, gdioutput &gdi); + + static int analyzePunch(SIPunch &p, int &start, int &accTime, int &days); + + + void createCompetitionFromCards(gdioutput &gdi); + + int NC; + + class EditCardData : public GuiHandler { + TabSI *tabSI; + EditCardData(const EditCardData&); + EditCardData &operator=(const EditCardData&); + public: + EditCardData() : tabSI(0) {} + void handle(gdioutput &gdi, BaseInfo &info, GuiEventType type); + friend class TabSI; + }; + EditCardData editCardData; + +protected: + void clearCompetitionData(); + +public: + + // Returns true if a repeated check should be done (there is more to print) + bool checkpPrintQueue(gdioutput &gdi); + + struct StoredStartInfo { + string storedName; + string storedCardNo; + string storedClub; + string storedFee; + string storedPhone; + string storedStartTime; + bool allStages; + bool rentState; + bool hasPaid; + int payMode; + DWORD age; + int storedClassId; + + void clear(); + void checkAge(); + StoredStartInfo() : rentState(false), age(0), storedClassId(0), hasPaid(0), payMode(0), allStages(false) {} + }; + + StoredStartInfo storedInfo; + void generatePayModeWidget(gdioutput &gdi) const; + static bool writePayMode(gdioutput &gdi, int amount, oRunner &r); + + static SportIdent &getSI(const gdioutput &gdi); + void printerSetup(gdioutput &gdi); + + void generateStartInfo(gdioutput &gdi, const oRunner &r); + bool hasPrintStartInfo() const {return printStartInfo;} + void setPrintStartInfo(bool info) {printStartInfo = info;} + + int siCB(gdioutput &gdi, int type, void *data); + + void logCard(const SICard &card); + + void setCardNumberField(const string &fieldId) {insertCardNumberField=fieldId;} + + //SICard CSIC; + SICard activeSIC; + list CardQueue; + + const char * getTypeStr() const {return "TSITab";} + TabType getType() const {return TSITab;} + + void insertSICard(gdioutput &gdi, SICard &sic); + + void refillComPorts(gdioutput &gdi); + + bool loadPage(gdioutput &gdi); + TabSI(oEvent *oe); + ~TabSI(void); +}; diff --git a/code/TabSpeaker.cpp b/code/TabSpeaker.cpp new file mode 100644 index 0000000..78f5da9 --- /dev/null +++ b/code/TabSpeaker.cpp @@ -0,0 +1,1048 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" + +#include "resource.h" + +#include +#include + +#include "oEvent.h" +#include "xmlparser.h" +#include "gdioutput.h" +#include "gdifonts.h" + +#include "csvparser.h" +#include "SportIdent.h" +#include "meos_util.h" +#include "oListInfo.h" + +#include "TabSpeaker.h" +#include "TabList.h" +#include "speakermonitor.h" + +#include + +//Base position for speaker buttons +#define SPEAKER_BASE_X 40 + +TabSpeaker::TabSpeaker(oEvent *poe):TabBase(poe) +{ + classId=0; + ownWindow = false; + + lastControlToWatch = 0; + lastClassToWatch = 0; + watchLevel = oTimeLine::PMedium; + watchNumber = 5; + speakerMonitor = 0; +} + +TabSpeaker::~TabSpeaker() +{ + delete speakerMonitor; +} + + +int tabSpeakerCB(gdioutput *gdi, int type, void *data) +{ + TabSpeaker &ts = dynamic_cast(*gdi->getTabs().get(TSpeakerTab)); + + switch(type){ + case GUI_BUTTON: { + //Make a copy + ButtonInfo bu=*static_cast(data); + return ts.processButton(*gdi, bu); + } + case GUI_LISTBOX:{ + ListBoxInfo lbi=*static_cast(data); + return ts.processListBox(*gdi, lbi); + } + case GUI_EVENT: { + EventInfo ei=*static_cast(data); + return ts.handleEvent(*gdi, ei); + } + case GUI_CLEAR: + return ts.onClear(*gdi); + case GUI_TIMEOUT: + case GUI_TIMER: + ts.updateTimeLine(*gdi); + break; + } + return 0; +} + +int TabSpeaker::handleEvent(gdioutput &gdi, const EventInfo &ei) +{ + updateTimeLine(gdi); + return 0; +} + +int TabSpeaker::processButton(gdioutput &gdi, const ButtonInfo &bu) +{ + if (bu.id=="Settings") { + if (controlsToWatch.empty()) { + // Get default + vector ctrl; + oe->getControls(ctrl, true); + for (size_t k = 0; k < ctrl.size(); k++) { + if (ctrl[k]->isValidRadio()) { + vector cc; + ctrl[k]->getCourseControls(cc); + controlsToWatch.insert(cc.begin(), cc.end()); + } + } + } + gdi.restore("settings"); + gdi.unregisterEvent("DataUpdate"); + gdi.fillDown(); + gdi.addString("", boldLarge, "Speakerstöd"); + gdi.addString("", 0, "help:speaker_setup"); + gdi.dropLine(1); + gdi.addCheckbox("ShortNames", "Use initials in names", 0, oe->getPropertyInt("SpeakerShortNames", false) != 0); + gdi.dropLine(0.5); + + gdi.pushX(); + gdi.fillRight(); + gdi.addListBox("Classes", 200, 300, 0,"Klasser","", true); + + oe->fillClasses(gdi, "Classes", oEvent::extraNone, oEvent::filterNone); + gdi.setSelection("Classes", classesToWatch); + + gdi.addListBox("Controls", 200, 300, 0, "Kontroller","", true); + gdi.pushX(); + gdi.fillDown(); + + vector< pair > d; + oe->fillControls(d, oEvent::CTCourseControl); + gdi.addItem("Controls", d); + + gdi.setSelection("Controls", controlsToWatch); + + gdi.dropLine(); + gdi.addButton("OK", "OK", tabSpeakerCB).setDefault(); + gdi.addButton("Cancel", "Avbryt", tabSpeakerCB).setCancel(); + + gdi.refresh(); + } + else if (bu.id=="ZoomIn") { + gdi.scaleSize(1.05); + } + else if (bu.id=="ZoomOut") { + gdi.scaleSize(1.0/1.05); + } + else if (bu.id=="Manual") { + gdi.unregisterEvent("DataUpdate"); + gdi.restore("settings"); + gdi.fillDown(); + gdi.addString("", boldLarge, "Inmatning av mellantider"); + gdi.dropLine(0.5); + manualTimePage(gdi); + } + else if (bu.id == "PunchTable") { + gdi.clearPage(false); + gdi.addButton("Cancel", "Stäng", tabSpeakerCB); + gdi.dropLine(); + gdi.addTable(oe->getPunchesTB(), gdi.getCX(), gdi.getCY()); + gdi.refresh(); + } + else if (bu.id == "Priority") { + gdi.clearPage(false); + gdi.addString("", boldLarge, "Bevakningsprioritering"); + gdi.addString("", 10, "help:speakerprio"); + gdi.dropLine(); + gdi.fillRight(); + gdi.pushX(); + gdi.addString("", 0, "Klass:"); + gdi.addSelection("Class", 200, 200, tabSpeakerCB, "", "Välj klass"); + oe->fillClasses(gdi, "Class", oEvent::extraNone, oEvent::filterNone); + gdi.addButton("ClosePri", "Stäng", tabSpeakerCB); + gdi.dropLine(2); + gdi.popX(); + gdi.refresh(); + } + else if (bu.id == "ClosePri") { + savePriorityClass(gdi); + loadPage(gdi); + } + else if (bu.id == "LiveResult") { + gdioutput *gdi_new = createExtraWindow(uniqueTag("list"), MakeDash("MeOS - Live"), gdi.getWidth() + 64 + gdi.scaleLength(120)); + + gdi_new->clearPage(false); + gdi_new->addString("", boldLarge, "Liveresultat"); + gdi_new->addString("", 10, "help:liveresultat"); + gdi_new->dropLine(); + gdi_new->pushY(); + gdi_new->pushX(); + + TabList::makeClassSelection(*gdi_new); + oe->fillClasses(*gdi_new, "ListSelection", oEvent::extraNone, oEvent::filterNone); + + gdi_new->popY(); + gdi_new->setCX(gdi_new->getCX() + gdi_new->scaleLength(280)); + gdi_new->fillRight(); + gdi_new->pushX(); + TabList::makeFromTo(*gdi_new); + TabList::enableFromTo(*oe, *gdi_new, true, true); + + gdi_new->fillRight(); + gdi.dropLine(); + gdi_new->addButton("StartLive", "Starta", tabSpeakerCB).setDefault(); + gdi_new->addButton("CancelClose", "Avbryt", tabSpeakerCB).setCancel(); + + gdi_new->refresh(); + } + else if (bu.id == "StartLive") { + TabList &ts = dynamic_cast(*gdi.getTabs().get(TListTab)); + + oListInfo li; + oListParam &par = li.getParam();; + par.useControlIdResultTo = gdi.getSelectedItem("ResultSpecialTo").first; + par.useControlIdResultFrom = gdi.getSelectedItem("ResultSpecialFrom").first; + gdi.getSelection("ListSelection", par.selection); + + gdi.clearPage(false); + gdi.setFullScreen(true); + gdi.hideBackground(true); + ts.liveResult(gdi, li); + } + else if (bu.id == "Events") { + gdi.restore("classes"); + /* + shownEvents.clear(); + events.clear(); + */ + drawTimeLine(gdi); + } + else if (bu.id == "Window") { + oe->setupTimeLineEvents(0); + + gdioutput *gdi_new = createExtraWindow(uniqueTag("speaker"), MakeDash("MeOS - Speakerstöd"), gdi.getWidth() + 64 + gdi.scaleLength(120)); + if (gdi_new) { + TabSpeaker &tl = dynamic_cast(*gdi_new->getTabs().get(TSpeakerTab)); + tl.ownWindow = true; + tl.loadPage(*gdi_new); + //oe->renderTimeLineEvents(*gdi_new); + } + } + else if (bu.id=="StoreTime") { + storeManualTime(gdi); + } + else if (bu.id=="Cancel") { + loadPage(gdi); + } + else if (bu.id=="CancelClose") { + gdi.closeWindow(); + } + else if (bu.id=="OK") { + gdi.getSelection("Classes", classesToWatch); + gdi.getSelection("Controls", controlsToWatch); + if (controlsToWatch.empty()) + controlsToWatch.insert(-2); // Non empty but no control + + controlsToWatchSI.clear(); + for (set::iterator it=controlsToWatch.begin();it!=controlsToWatch.end();++it) { + pControl pc=oe->getControl(*it, false); + if (pc) { + pc->setRadio(true); + pc->synchronize(true); + controlsToWatchSI.insert(pc->Numbers, pc->Numbers+pc->nNumbers); + } + } + oe->setProperty("SpeakerShortNames", (int)gdi.isChecked("ShortNames")); + loadPage(gdi); + } + else if (bu.id.substr(0, 3)=="cid" ) { + classId=atoi(bu.id.substr(3, string::npos).c_str()); + bool shortNames = oe->getPropertyInt("SpeakerShortNames", false) != 0; + generateControlList(gdi, classId); + gdi.setRestorePoint("speaker"); + gdi.setRestorePoint("SpeakerList"); + + if (selectedControl.count(classId)==1) + oe->speakerList(gdi, classId, selectedControl[classId].getLeg(), + selectedControl[classId].getControl(), + selectedControl[classId].getPreviousControl(), + selectedControl[classId].isTotal(), + shortNames); + } + else if (bu.id.substr(0, 4)=="ctrl") { + bool shortNames = oe->getPropertyInt("SpeakerShortNames", false) != 0; + int ctrl = atoi(bu.id.substr(4, string::npos).c_str()); + int ctrlPrev = bu.getExtraInt(); + selectedControl[classId].setControl(ctrl, ctrlPrev); + gdi.restore("speaker"); + oe->speakerList(gdi, classId, selectedControl[classId].getLeg(), ctrl, ctrlPrev, + selectedControl[classId].isTotal(), shortNames); + } + + return 0; +} + +void TabSpeaker::drawTimeLine(gdioutput &gdi) { + gdi.restoreNoUpdate("SpeakerList"); + gdi.setRestorePoint("SpeakerList"); + + gdi.fillRight(); + gdi.pushX(); + gdi.dropLine(0.3); + gdi.addString("", 0, "Filtrering:"); + gdi.dropLine(-0.2); + gdi.addSelection("DetailLevel", 160, 100, tabSpeakerCB); + gdi.addItem("DetailLevel", lang.tl("Alla händelser"), oTimeLine::PLow); + gdi.addItem("DetailLevel", lang.tl("Viktiga händelser"), oTimeLine::PMedium); + gdi.addItem("DetailLevel", lang.tl("Avgörande händelser"), oTimeLine::PHigh); + gdi.selectItemByData("DetailLevel", watchLevel); + + gdi.dropLine(0.2); + gdi.addString("", 0, "Antal:"); + gdi.dropLine(-0.2); + gdi.addSelection("WatchNumber", 160, 200, tabSpeakerCB); + gdi.addItem("WatchNumber", lang.tl("X senaste#5"), 5); + gdi.addItem("WatchNumber", lang.tl("X senaste#10"), 10); + gdi.addItem("WatchNumber", lang.tl("X senaste#20"), 20); + gdi.addItem("WatchNumber", lang.tl("X senaste#50"), 50); + gdi.addItem("WatchNumber", "Alla", 0); + gdi.selectItemByData("WatchNumber", watchNumber); + gdi.dropLine(2); + gdi.popX(); + + string cls; + for (set::iterator it = classesToWatch.begin(); it != classesToWatch.end(); ++it) { + pClass pc = oe->getClass(*it); + if (pc) { + if (!cls.empty()) + cls += ", "; + cls += oe->getClass(*it)->getName(); + } + } + gdi.fillDown(); + gdi.addString("", 1, "Bevakar händelser i X#" + cls); + gdi.dropLine(); + + gdi.setRestorePoint("TimeLine"); + updateTimeLine(gdi); +} + +void TabSpeaker::updateTimeLine(gdioutput &gdi) { + int storedY = gdi.GetOffsetY(); + int storedHeight = gdi.getHeight(); + bool refresh = gdi.hasData("TimeLineLoaded"); + + if (refresh) + gdi.takeShownStringsSnapshot(); + + gdi.restoreNoUpdate("TimeLine"); + gdi.setRestorePoint("TimeLine"); + gdi.setData("TimeLineLoaded", 1); + + gdi.registerEvent("DataUpdate", tabSpeakerCB); + gdi.setData("DataSync", 1); + gdi.setData("PunchSync", 1); + + gdi.pushX(); gdi.pushY(); + gdi.updatePos(0,0,0, storedHeight); + gdi.popX(); gdi.popY(); + gdi.SetOffsetY(storedY); + + SpeakerMonitor &sm = *getSpeakerMonitor(); + int limit = 1000; + switch (watchLevel) { + case oTimeLine::PHigh: + limit = 3; + break; + case oTimeLine::PMedium: + limit = 10; + break; + } + + sm.setLimits(limit, watchNumber); + sm.setClassFilter(classesToWatch, controlsToWatch); + sm.show(gdi); + + if (refresh) + gdi.refreshSmartFromSnapshot(false); + else { + if (storedHeight == gdi.getHeight()) + gdi.refreshFast(); + else + gdi.refresh(); + } +} + +/* +void TabSpeaker::updateTimeLine(gdioutput &gdi) { + int storedY = gdi.GetOffsetY(); + int storedHeight = gdi.getHeight(); + bool refresh = gdi.hasData("TimeLineLoaded"); + + if (refresh) + gdi.takeShownStringsSnapshot(); + + gdi.restoreNoUpdate("TimeLine"); + gdi.setRestorePoint("TimeLine"); + gdi.setData("TimeLineLoaded", 1); + + gdi.registerEvent("DataUpdate", tabSpeakerCB); + gdi.setData("DataSync", 1); + gdi.setData("PunchSync", 1); + + gdi.pushX(); gdi.pushY(); + gdi.updatePos(0,0,0, storedHeight); + gdi.popX(); gdi.popY(); + gdi.SetOffsetY(storedY); + + int nextEvent = oe->getTimeLineEvents(classesToWatch, events, shownEvents, 0); + + oe->updateComputerTime(); + int timeOut = nextEvent * 1000 - oe->getComputerTimeMS(); + + string str = "Now: " + oe->getAbsTime(oe->getComputerTime()) + " Next:" + oe->getAbsTime(nextEvent) + " Timeout:" + itos(timeOut) + "\n"; + OutputDebugString(str.c_str()); + + if (timeOut > 0) { + gdi.addTimeoutMilli(timeOut, "timeline", tabSpeakerCB); + //gdi.addTimeout(timeOut, tabSpeakerCB); + } + bool showClass = classesToWatch.size()>1; + + oListInfo li; + const int classWidth = gdi.scaleLength(li.getMaxCharWidth(oe, classesToWatch, lClassName, "", normalText, false)); + const int timeWidth = gdi.scaleLength(60); + const int totWidth = gdi.scaleLength(450); + const int extraWidth = gdi.scaleLength(200); + string dash = MakeDash("- "); + const int extra = 5; + + int limit = watchNumber > 0 ? watchNumber : events.size(); + for (size_t k = events.size()-1; signed(k) >= 0; k--) { + oTimeLine &e = events[k]; + + if (e.getPriority() < watchLevel) + continue; + + if (--limit < 0) + break; + + int t = e.getTime(); + string msg = t>0 ? oe->getAbsTime(t) : MakeDash("--:--:--"); + pRunner r = pRunner(e.getSource(*oe)); + + RECT rc; + rc.top = gdi.getCY(); + rc.left = gdi.getCX(); + + int xp = rc.left + extra; + int yp = rc.top + extra; + + bool largeFormat = e.getPriority() >= oTimeLine::PHigh && k + 15 >= events.size(); + + if (largeFormat) { + gdi.addStringUT(yp, xp, 0, msg); + + int dx = 0; + if (showClass) { + pClass pc = oe->getClass(e.getClassId()); + if (pc) { + gdi.addStringUT(yp, xp + timeWidth, fontMediumPlus, pc->getName()); + dx = classWidth; + } + } + + if (r) { + string bib = r->getBib(); + if (!bib.empty()) + msg = bib + ", "; + else + msg = ""; + msg += r->getCompleteIdentification(); + int xlimit = totWidth + extraWidth - (timeWidth + dx); + gdi.addStringUT(yp, xp + timeWidth + dx, fontMediumPlus, msg, xlimit); + } + + yp += int(gdi.getLineHeight() * 1.5); + msg = dash + lang.tl(e.getMessage()); + gdi.addStringUT(yp, xp + 10, breakLines, msg, totWidth); + + const string &detail = e.getDetail(); + + if (!detail.empty()) { + gdi.addString("", gdi.getCY(), xp + 20, 0, detail).setColor(colorDarkGrey); + } + + if (r && e.getType() == oTimeLine::TLTFinish && r->getStatus() == StatusOK) { + splitAnalysis(gdi, xp + 20, gdi.getCY(), r); + } + + GDICOLOR color = colorLightRed; + + switch (e.getType()) { + case oTimeLine::TLTFinish: + if (r && r->statusOK()) + color = colorLightGreen; + else + color = colorLightRed; + break; + case oTimeLine::TLTStart: + color = colorLightYellow; + break; + case oTimeLine::TLTRadio: + color = colorLightCyan; + break; + case oTimeLine::TLTExpected: + color = colorLightBlue; + break; + } + + rc.bottom = gdi.getCY() + extra; + rc.right = rc.left + totWidth + extraWidth + 2 * extra; + gdi.addRectangle(rc, color, true); + gdi.dropLine(0.5); + } + else { + if (showClass) { + pClass pc = oe->getClass(e.getClassId()); + if (pc ) + msg += " (" + pc->getName() + ") "; + else + msg += " "; + } + else + msg += " "; + + if (r) { + msg += r->getCompleteIdentification() + " "; + } + msg += lang.tl(e.getMessage()); + gdi.addStringUT(gdi.getCY(), gdi.getCX(), breakLines, msg, totWidth); + + const string &detail = e.getDetail(); + + if (!detail.empty()) { + gdi.addString("", gdi.getCY(), gdi.getCX()+50, 0, detail).setColor(colorDarkGrey); + } + + if (r && e.getType() == oTimeLine::TLTFinish && r->getStatus() == StatusOK) { + splitAnalysis(gdi, xp, gdi.getCY(), r); + } + gdi.dropLine(0.5); + } + } + + if (refresh) + gdi.refreshSmartFromSnapshot(false); + else { + if (storedHeight == gdi.getHeight()) + gdi.refreshFast(); + else + gdi.refresh(); + } +} +*/ +void TabSpeaker::splitAnalysis(gdioutput &gdi, int xp, int yp, pRunner r) +{ + if (!r) + return; + + vector delta; + r->getSplitAnalysis(delta); + string timeloss = lang.tl("Bommade kontroller: "); + pCourse pc = 0; + bool first = true; + const int charlimit = 90; + for (size_t j = 0; j 0) { + if (pc == 0) { + pc = r->getCourse(true); + if (pc == 0) + break; + } + + if (!first) + timeloss += " | "; + else + first = false; + + timeloss += pc->getControlOrdinal(j) + ". " + formatTime(delta[j]); + } + if (timeloss.length() > charlimit || (!timeloss.empty() && !first && j+1 == delta.size())) { + gdi.addStringUT(yp, xp, 0, timeloss).setColor(colorDarkRed); + yp += gdi.getLineHeight(); + timeloss = ""; + } + } + if (first) { + gdi.addString("", yp, xp, 0, "Inga bommar registrerade").setColor(colorDarkGreen); + } +} + +pCourse deduceSampleCourse(pClass pc, vector &stages, int leg); + +void TabSpeaker::generateControlList(gdioutput &gdi, int classId) +{ + pClass pc=oe->getClass(classId); + + if (!pc) + return; + + bool keepLegs = false; + if (gdi.hasField("Leg")) { + DWORD clsSel = 0; + if (gdi.getData("ClassSelection", clsSel) && clsSel == pc->getId()) { + gdi.restore("LegSelection", true); + keepLegs = true; + } + } + + if (!keepLegs) + gdi.restore("classes", true); + + gdi.setData("ClassSelection", pc->getId()); + + pCourse course=0; + + int h,w; + gdi.getTargetDimension(w, h); + + gdi.fillDown(); + + int bw=gdi.scaleLength(100); + int nbtn=max((w-80)/bw, 1); + bw=(w-80)/nbtn; + int basex=SPEAKER_BASE_X; + int basey=gdi.getCY()+4; + + int cx=basex; + int cy=basey; + int cb=1; + + vector stages; + pc->getTrueStages(stages); + int leg = selectedControl[pc->getId()].getLeg(); + const bool multiDay = oe->hasPrevStage(); + + if (stages.size()>1 || multiDay) { + if (!keepLegs) { + gdi.setData("CurrentY", cy); + gdi.addSelection(cx, cy+2, "Leg", int(bw/gdi.getScale())-5, 100, tabSpeakerCB); + if (leg == 0 && stages[0].first != 0) { + leg = stages[0].first; + selectedControl[pc->getId()].setLeg(selectedControl[pc->getId()].isTotal(), leg); + } + + if (stages.size() > 1) { + for (size_t k=0; khasMultiCourse()) + course = pc->getCourse(courseLeg, 0, true); + else + course = pc->getCourse(true); + */ + vector controls; + + if (course) + course->getControls(controls); + int previousControl = 0; + for (size_t k = 0; k < controls.size(); k++) { + int cid = course->getCourseControlId(k); + if (controlsToWatch.count(cid) ) { + + if (selectedControl[classId].getControl() == -1) { + // Default control + selectedControl[classId].setControl(cid, previousControl); + } + + char bf[16]; + sprintf_s(bf, "ctrl%d", cid); + string name = course->getRadioName(cid); + /*if (controls[k]->hasName()) { + name = "#" + controls[k]->getName(); + if (controls[k]->getNumberDuplicates() > 1) + name += "-" + itos(numbering++); + } + else { + name = lang.tl("radio X#" + itos(numbering++)); + capitalize(name); + name = "#" + name; + } + */ + string tooltip = lang.tl("kontroll X (Y)#" + itos(k+1) +"#" + itos(controls[k]->getFirstNumber())); + capitalize(tooltip); + ButtonInfo &bi = gdi.addButton(cx, cy, bw, bf, "#" + name, tabSpeakerCB, "#" + tooltip, false, false); + bi.setExtra(previousControl); + previousControl = cid; + cx+=bw; + + cb++; + if (cb>nbtn) { + cb=1; + cy+=gdi.getButtonHeight()+4; + cx=basex; + } + } + } + gdi.fillDown(); + char bf[16]; + sprintf_s(bf, "ctrl%d", oPunch::PunchFinish); + gdi.addButton(cx, cy, bw, bf, "Mål", tabSpeakerCB, "", false, false).setExtra(previousControl); + + if (selectedControl[classId].getControl() == -1) { + // Default control + selectedControl[classId].setControl(oPunch::PunchFinish, previousControl); + } + + gdi.popX(); +} + +int TabSpeaker::processListBox(gdioutput &gdi, const ListBoxInfo &bu) +{ + if (bu.id=="Leg") { + if (classId>0) { + selectedControl[classId].setLeg(bu.data>=1000, bu.data%1000); + generateControlList(gdi, classId); + gdi.setRestorePoint("speaker"); + gdi.setRestorePoint("SpeakerList"); + + bool shortNames = oe->getPropertyInt("SpeakerShortNames", false) != 0; + oe->speakerList(gdi, classId, selectedControl[classId].getLeg(), + selectedControl[classId].getControl(), + selectedControl[classId].getPreviousControl(), + selectedControl[classId].isTotal(), + shortNames); + } + } + else if (bu.id == "DetailLevel") { + watchLevel = oTimeLine::Priority(bu.data); + shownEvents.clear(); + events.clear(); + + updateTimeLine(gdi); + } + else if (bu.id == "WatchNumber") { + watchNumber = bu.data; + updateTimeLine(gdi); + } + else if (bu.id == "Class") { + savePriorityClass(gdi); + int classId = int(bu.data); + loadPriorityClass(gdi, classId); + } + return 0; +} + +bool TabSpeaker::loadPage(gdioutput &gdi) +{ + oe->checkDB(); + + gdi.clearPage(false); + gdi.pushX(); + gdi.setRestorePoint("settings"); + + gdi.pushX(); + gdi.fillDown(); + + int h,w; + gdi.getTargetDimension(w, h); + + int bw=gdi.scaleLength(100); + int nbtn=max((w-80)/bw, 1); + bw=(w-80)/nbtn; + int basex = SPEAKER_BASE_X; + int basey=gdi.getCY(); + + int cx=basex; + int cy=basey; + int cb=1; + for (set::iterator it=classesToWatch.begin();it!=classesToWatch.end();++it) { + char classid[32]; + sprintf_s(classid, "cid%d", *it); + pClass pc=oe->getClass(*it); + + if (pc) { + gdi.addButton(cx, cy, bw, classid, "#" + pc->getName(), tabSpeakerCB, "", false, false); + cx+=bw; + cb++; + + if (cb>nbtn) { + cb=1; + cx=basex; + cy+=gdi.getButtonHeight()+4; + } + } + } + + int db = 0; + if (classesToWatch.empty()) { + gdi.addString("", boldLarge, "Speakerstöd"); + gdi.dropLine(); + cy=gdi.getCY(); + cx=gdi.getCX(); + } + else { + gdi.addButton(cx+db, cy, bw-2, "Events", "Händelser", tabSpeakerCB, "Löpande information om viktiga händelser i tävlingen", false, false); + if (++cb>nbtn) { + cb = 1, cx = basex, db = 0; + cy += gdi.getButtonHeight()+4; + } else db += bw; + gdi.addButton(cx+db, cy, bw/5, "ZoomIn", "+", tabSpeakerCB, "Zooma in (Ctrl + '+')", false, false); + db += bw/5+2; + gdi.addButton(cx+db, cy, bw/5, "ZoomOut", MakeDash("-"), tabSpeakerCB, "Zooma ut (Ctrl + '-')", false, false); + db += bw/5+2; + } + gdi.addButton(cx+db, cy, bw-2, "Settings", "Inställningar...", tabSpeakerCB, "Välj vilka klasser och kontroller som bevakas", false, false); + if (++cb>nbtn) { + cb = 1, cx = basex, db = 0; + cy += gdi.getButtonHeight()+4; + } else db += bw; + gdi.addButton(cx+db, cy, bw-2, "Manual", "Tidsinmatning", tabSpeakerCB, "Mata in radiotider manuellt", false, false); + if (++cb>nbtn) { + cb = 1, cx = basex, db = 0; + cy += gdi.getButtonHeight()+4; + } else db += bw; + + gdi.addButton(cx+db, cy, bw-2, "PunchTable", "Stämplingar", tabSpeakerCB, "Visa en tabell över alla stämplingar", false, false); + if (++cb>nbtn) { + cb = 1, cx = basex, db = 0; + cy += gdi.getButtonHeight()+4; + } else db += bw; + + gdi.addButton(cx+db, cy, bw-2, "LiveResult", "Liveresultat", tabSpeakerCB, "Visa rullande tider mellan kontroller i helskärmsläge", false, false); + if (++cb>nbtn) { + cb = 1, cx = basex, db = 0; + cy += gdi.getButtonHeight()+4; + } else db += bw; + + + if (!ownWindow) { + gdi.addButton(cx+db, cy, bw-2, "Priority", "Prioritering", tabSpeakerCB, "Välj löpare att prioritera bevakning för", false, false); + if (++cb>nbtn) { + cb = 1, cx = basex, db = 0; + cy += gdi.getButtonHeight()+4; + } else db += bw; + + + gdi.addButton(cx+db, cy, bw-2, "Window", "Nytt fönster", tabSpeakerCB, "", false, false); + if (++cb>nbtn) { + cb = 1, cx = basex, db = 0; + cy += gdi.getButtonHeight()+4; + } else db += bw; + } + gdi.setRestorePoint("classes"); + gdi.refresh(); + return true; +} + +void TabSpeaker::clearCompetitionData() +{ + controlsToWatch.clear(); + classesToWatch.clear(); + controlsToWatchSI.clear(); + selectedControl.clear(); + classId=0; + lastControl.clear(); + + lastControlToWatch = 0; + lastClassToWatch = 0; + + shownEvents.clear(); + events.clear(); + + delete speakerMonitor; + speakerMonitor = 0; +} + +void TabSpeaker::manualTimePage(gdioutput &gdi) const +{ + gdi.setRestorePoint("manual"); + + gdi.fillRight(); + gdi.pushX(); + gdi.addInput("Control", lastControl, 5, 0, "Kontroll"); + gdi.addInput("Runner", "", 6, 0, "Löpare"); + gdi.addInput("Time", "", 8, 0, "Tid"); + gdi.dropLine(); + gdi.addButton("StoreTime", "Spara", tabSpeakerCB).setDefault(); + gdi.addButton("Cancel", "Avbryt", tabSpeakerCB).setCancel(); + gdi.fillDown(); + gdi.popX(); + gdi.dropLine(3); + gdi.addString("", 10, "help:14692"); + + gdi.setInputFocus("Runner"); + gdi.refresh(); +} + +void TabSpeaker::storeManualTime(gdioutput &gdi) +{ + char bf[256]; + + int punch=gdi.getTextNo("Control"); + + if (punch<=0) + throw std::exception("Kontrollnummer måste anges."); + + lastControl=gdi.getText("Control"); + const string &r_str=gdi.getText("Runner"); + string time=gdi.getText("Time"); + + if (time.empty()) + time=getLocalTimeOnly(); + + int itime=oe->getRelativeTime(time); + + if (itime <= 0) + throw std::exception("Ogiltig tid."); + + pRunner r=oe->getRunnerByBibOrStartNo(r_str, false); + int r_no = atoi(r_str.c_str()); + if (!r) + r=oe->getRunnerByCardNo(r_no, itime); + + string Name; + int sino=r_no; + if (r) { + Name=r->getName(); + sino=r->getCardNo(); + } + else + Name = lang.tl("Okänd"); + + if (sino <= 0) { + sprintf_s(bf, "Ogiltigt bricknummer.#%d", sino); + throw std::exception(bf); + } + + oe->addFreePunch(itime, punch, sino, true); + + gdi.restore("manual", false); + gdi.addString("", 0, "Löpare: X, kontroll: Y, kl Z#" + Name + "#" + oPunch::getType(punch) + "#" + oe->getAbsTime(itime)); + + manualTimePage(gdi); +} + +void TabSpeaker::loadPriorityClass(gdioutput &gdi, int classId) { + + gdi.restore("PrioList"); + gdi.setRestorePoint("PrioList"); + gdi.setOnClearCb(tabSpeakerCB); + runnersToSet.clear(); + vector r; + oe->getRunners(classId, 0, r); + + int x = gdi.getCX(); + int y = gdi.getCY()+2*gdi.getLineHeight(); + int dist = gdi.scaleLength(25); + int dy = int(gdi.getLineHeight()*1.3); + for (size_t k = 0; kskip() /*|| r[k]->getLeg>0*/) + continue; + int pri = r[k]->getSpeakerPriority(); + int id = r[k]->getId(); + gdi.addCheckbox(x,y,"A" + itos(id), "", 0, pri>0); + gdi.addCheckbox(x+dist,y,"B" + itos(id), "", 0, pri>1); + gdi.addStringUT(y-dist/3, x+dist*2, 0, r[k]->getCompleteIdentification()); + runnersToSet.push_back(id); + y += dy; + } + gdi.refresh(); +} + +void TabSpeaker::savePriorityClass(gdioutput &gdi) { + oe->synchronizeList(oLRunnerId, true, false); + oe->synchronizeList(oLTeamId, false, true); + + for (size_t k = 0; kgetRunner(runnersToSet[k], 0); + if (r) { + int id = runnersToSet[k]; + if (!gdi.hasField("A" + itos(id))) { + runnersToSet.clear(); //Page not loaded. Abort. + return; + } + + bool a = gdi.isChecked("A" + itos(id)); + bool b = gdi.isChecked("B" + itos(id)); + int pri = (a?1:0) + (b?1:0); + pTeam t = r->getTeam(); + if (t) { + t->setSpeakerPriority(pri); + t->synchronize(true); + } + else { + r->setSpeakerPriority(pri); + r->synchronize(true); + } + } + } +} + +bool TabSpeaker::onClear(gdioutput &gdi) { + if (!runnersToSet.empty()) + savePriorityClass(gdi); + + return true; +} +SpeakerMonitor *TabSpeaker::getSpeakerMonitor() { + if (speakerMonitor == 0) + speakerMonitor = new SpeakerMonitor(*oe); + + return speakerMonitor; +} diff --git a/code/TabSpeaker.h b/code/TabSpeaker.h new file mode 100644 index 0000000..13fae7d --- /dev/null +++ b/code/TabSpeaker.h @@ -0,0 +1,117 @@ +#pragma once +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ +#include "tabbase.h" + +class SpeakerMonitor; + +class spkClassSelection { + // The currently selected leg + int selectedLeg; + // True if total results, otherwise stage results + bool total; + // Given a leg, get the corresponding (control, previous control) to watch + map > legToControl; +public: + spkClassSelection() : selectedLeg(0), total(false) {} + void setLeg(bool totalIn, int leg) {total = totalIn, selectedLeg=leg;} + int getLeg() const {return selectedLeg;} + bool isTotal() const {return total;} + + void setControl(int controlId, int previousControl) { + legToControl[selectedLeg] = make_pair(controlId, previousControl); + } + int getControl() { + if (legToControl.count(selectedLeg)==1) + return legToControl[selectedLeg].first; + else return -1; + } + int getPreviousControl() { + if (legToControl.count(selectedLeg)==1) + return legToControl[selectedLeg].second; + else return -1; + } +}; + +class TabSpeaker : + public TabBase { +private: + set controlsToWatch; + set classesToWatch; + set controlsToWatchSI; + + int lastControlToWatch; + int lastClassToWatch; + + set<__int64> shownEvents; + vector events; + oTimeLine::Priority watchLevel; + int watchNumber; + + void generateControlList(gdioutput &gdi, int classId); + void generateControlListForLeg(gdioutput &gdi, int classId, int leg); + + string lastControl; + + void manualTimePage(gdioutput &gdi) const; + void storeManualTime(gdioutput &gdi); + + //Curren class- + int classId; + //Map CourseNo -> selected Control. + //map selectedControl; + map selectedControl; + + bool ownWindow; + + void drawTimeLine(gdioutput &gdi); + void splitAnalysis(gdioutput &gdi, int xp, int yp, pRunner r); + + // Runner Id:s to set priority for + vector runnersToSet; + + SpeakerMonitor *speakerMonitor; + + SpeakerMonitor *getSpeakerMonitor(); + +public: + + bool onClear(gdioutput &gdi); + void loadPriorityClass(gdioutput &gdi, int classId); + void savePriorityClass(gdioutput &gdi); + + void updateTimeLine(gdioutput &gdi); + + //Clear selection data + void clearCompetitionData(); + + int processButton(gdioutput &gdi, const ButtonInfo &bu); + int processListBox(gdioutput &gdi, const ListBoxInfo &bu); + int handleEvent(gdioutput &gdi, const EventInfo &ei); + + const char * getTypeStr() const {return "TSpeakerTab";} + TabType getType() const {return TSpeakerTab;} + + bool loadPage(gdioutput &gdi); + TabSpeaker(oEvent *oe); + ~TabSpeaker(void); +}; diff --git a/code/TabTeam.cpp b/code/TabTeam.cpp new file mode 100644 index 0000000..a690aae --- /dev/null +++ b/code/TabTeam.cpp @@ -0,0 +1,1899 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" + +#include "resource.h" + +#include +#include + +#include "oEvent.h" +#include "xmlparser.h" +#include "gdioutput.h" +#include "gdiconstants.h" + +#include "csvparser.h" +#include "SportIdent.h" +#include "meos_util.h" +#include + +#include "meosexception.h" +#include "TabTeam.h" +#include "TabRunner.h" +#include "MeOSFeatures.h" +#include "RunnerDB.h" + +#include "TabSI.h" + +TabTeam::TabTeam(oEvent *poe):TabBase(poe) +{ + clearCompetitionData(); +} + +TabTeam::~TabTeam(void) +{ +} + +int TeamCB(gdioutput *gdi, int type, void *data) +{ + TabTeam &tt = dynamic_cast(*gdi->getTabs().get(TTeamTab)); + + return tt.teamCB(*gdi, type, data); +} + +int teamSearchCB(gdioutput *gdi, int type, void *data) +{ + TabTeam &tc = dynamic_cast(*gdi->getTabs().get(TTeamTab)); + + return tc.searchCB(*gdi, type, data); +} + +int TabTeam::searchCB(gdioutput &gdi, int type, void *data) { + static DWORD editTick = 0; + string expr; + bool showNow = false; + bool filterMore = false; + + if (type == GUI_INPUTCHANGE) { + inputId++; + InputInfo &ii = *(InputInfo *)(data); + expr = trim(ii.text); + filterMore = expr.length() > lastSearchExpr.length() && + expr.substr(0, lastSearchExpr.length()) == lastSearchExpr; + editTick = GetTickCount(); + if (expr != lastSearchExpr) { + int nr = oe->getNumRunners(); + if (timeToFill < 50 || (filterMore && (timeToFill * lastFilter.size())/nr < 50)) + showNow = true; + else {// Delay filter + gdi.addTimeoutMilli(500, "Search: " + expr, teamSearchCB).setExtra((void *)inputId); + } + } + } + else if (type == GUI_TIMER) { + + TimerInfo &ti = *(TimerInfo *)(data); + + if (inputId != int(ti.getExtra())) + return 0; + + expr = ti.id.substr(8); + filterMore = expr.length() > lastSearchExpr.length() && + expr.substr(0, lastSearchExpr.length()) == lastSearchExpr; + showNow = true; + } + else if (type == GUI_EVENT) { + EventInfo &ev = *(EventInfo *)(data); + if (ev.getKeyCommand() == KC_FIND) { + gdi.setInputFocus("SearchText", true); + } + else if (ev.getKeyCommand() == KC_FINDBACK) { + gdi.setInputFocus("SearchText", false); + } + } + else if (type == GUI_FOCUS) { + InputInfo &ii = *(InputInfo *)(data); + + if (ii.text == getSearchString()) { + ((InputInfo *)gdi.setText("SearchText", ""))->setFgColor(colorDefault); + } + } + + if (showNow) { + stdext::hash_set filter; + + if (type == GUI_TIMER) + gdi.setWaitCursor(true); + + if (filterMore) { + + oe->findTeam(expr, 0, filter); + lastSearchExpr = expr; + // Filter more + if (filter.empty()) { + vector< pair > runners; + runners.push_back(make_pair(lang.tl("Ingen matchar 'X'#" + expr), -1)); + gdi.addItem("Teams", runners); + } + else + gdi.filterOnData("Teams", filter); + } + else { + oe->findTeam(expr, 0, filter); + lastSearchExpr = expr; + + vector< pair > runners; + oe->fillTeams(runners); + + if (filter.size() == runners.size()){ + } + else if (filter.empty()) { + runners.clear(); + runners.push_back(make_pair(lang.tl("Ingen matchar 'X'#" + expr), -1)); + } + else { + vector< pair > runners2; + + for (size_t k = 0; ksynchronize(); + t->evaluate(false); + + teamId=t->getId(); + + gdi.enableEditControls(true); + gdi.enableInput("Save"); + gdi.enableInput("Undo"); + gdi.enableInput("Remove"); + + oe->fillClasses(gdi, "RClass", oEvent::extraNone, oEvent::filterNone); + gdi.selectItemByData("RClass", t->getClassId()); + gdi.selectItemByData("Teams", t->getId()); + + if (gdi.hasField("StatusIn")) { + gdi.selectItemByData("StatusIn", t->getInputStatus()); + int ip = t->getInputPlace(); + if (ip > 0) + gdi.setText("PlaceIn", ip); + else + gdi.setText("PlaceIn", MakeDash("-")); + + gdi.setText("TimeIn", t->getInputTimeS()); + if (gdi.hasField("PointIn")) + gdi.setText("PointIn", t->getInputPoints()); + } + + loadTeamMembers(gdi, 0, 0, t); + } + else { + teamId=0; + + gdi.enableEditControls(false); + gdi.disableInput("Save"); + gdi.disableInput("Undo"); + gdi.disableInput("Remove"); + + ListBoxInfo lbi; + gdi.getSelectedItem("RClass", lbi); + + gdi.selectItemByData("Teams", -1); + + if (gdi.hasField("StatusIn")) { + gdi.selectFirstItem("StatusIn"); + gdi.setText("PlaceIn", ""); + gdi.setText("TimeIn", "-"); + if (gdi.hasField("PointIn")) + gdi.setText("PointIn", ""); + } + + loadTeamMembers(gdi, lbi.data, 0, 0); + } + + updateTeamStatus(gdi, t); + gdi.refresh(); +} + +void TabTeam::updateTeamStatus(gdioutput &gdi, pTeam t) +{ + if (!t) { + gdi.setText("Name", ""); + if (gdi.hasField("StartNo")) + gdi.setText("StartNo", ""); + if (gdi.hasField("Club")) + gdi.setText("Club", ""); + bool hasFee = gdi.hasField("Fee"); + if (hasFee) { + gdi.setText("Fee", ""); + } + gdi.setText("Start", "-"); + gdi.setText("Finish", "-"); + gdi.setText("Time", "-"); + gdi.selectItemByData("Status", 0); + gdi.setText("TimeAdjust", "-"); + gdi.setText("PointAdjust", "-"); + + return; + } + + gdi.setText("Name", t->getName()); + if (gdi.hasField("StartNo")) + gdi.setText("StartNo", t->getBib()); + + if (gdi.hasField("Club")) + gdi.setText("Club", t->getClub()); + bool hasFee = gdi.hasField("Fee"); + if (hasFee) { + gdi.setText("Fee", oe->formatCurrency(t->getDI().getInt("Fee"))); + } + + gdi.setText("Start", t->getStartTimeS()); + gdi.setText("Finish",t->getFinishTimeS()); + gdi.setText("Time", t->getRunningTimeS()); + gdi.setText("TimeAdjust", getTimeMS(t->getTimeAdjustment())); + gdi.setText("PointAdjust", -t->getPointAdjustment()); + gdi.selectItemByData("Status", t->getStatus()); +} + +bool TabTeam::save(gdioutput &gdi, bool dontReloadTeams) { + if (teamId==0) + return 0; + + DWORD tid=teamId; + string name=gdi.getText("Name"); + + if (name.empty()) { + gdi.alert("Alla lag måste ha ett namn."); + return 0; + } + + bool create=false; + + pTeam t; + if (tid==0) { + t=oe->addTeam(name); + create=true; + } + else t=oe->getTeam(tid); + + teamId=t->getId(); + bool bibModified = false; + if (t) { + t->setName(name, true); + if (gdi.hasField("StartNo")) { + const string &bib = gdi.getText("StartNo"); + if (bib != t->getBib()) { + bibModified = true; + char pat[32]; + int no = oClass::extractBibPattern(bib, pat); + t->setBib(bib, no, no > 0, false); + } + } + string start = gdi.getText("Start"); + t->setStartTimeS(start); + if (t->getRunner(0)) + t->getRunner(0)->setStartTimeS(start); + + t->setFinishTimeS(gdi.getText("Finish")); + + if (gdi.hasField("Fee")) + t->getDI().setInt("Fee", oe->interpretCurrency(gdi.getText("Fee"))); + + t->apply(false, 0, false); + + if (gdi.hasField("Club")) { + ListBoxInfo lbi; + gdi.getSelectedItem("Club", lbi); + + if (!lbi.text.empty()) { + pClub pc=oe->getClub(lbi.text); + if (!pc) + pc = oe->addClub(lbi.text); + pc->synchronize(); + } + + t->setClub(lbi.text); + if (!dontReloadTeams) + oe->fillClubs(gdi, "Club"); + gdi.setText("Club", lbi.text); + } + ListBoxInfo lbi; + gdi.getSelectedItem("Status", lbi); + + RunnerStatus sIn = (RunnerStatus)lbi.data; + // Must be done AFTER all runners are set. But setting runner can modify status, so decide here. + bool setDNS = (sIn == StatusDNS) && (t->getStatus()!=StatusDNS); + bool checkStatus = (sIn != t->getStatus()); + + if (sIn == StatusUnknown && t->getStatus() == StatusDNS) + t->setTeamNoStart(false); + else if ((RunnerStatus)lbi.data != t->getStatus()) + t->setStatus((RunnerStatus)lbi.data, true, false); + + gdi.getSelectedItem("RClass", lbi); + + int classId = lbi.data; + bool newClass = t->getClassId() != classId; + set classes; + bool globalDep = false; + if (t->getClassRef()) + globalDep = t->getClassRef()->hasClassGlobalDependance(); + + classes.insert(classId); + classes.insert(t->getClassId()); + + bool readStatusIn = true; + if (newClass && t->getInputStatus() != StatusNotCompetiting && t->hasInputData()) { + if (gdi.ask("Vill du sätta resultatet från tidigare etapper till ?")) { + t->resetInputData(); + readStatusIn = false; + } + } + + if (newClass && !bibModified) { + pClass pc = oe->getClass(classId); + if (pc) { + pair snoBib = pc->getNextBib(); + if (snoBib.first > 0) { + t->setBib(snoBib.second, snoBib.first, true, false); + } + } + } + + t->setClassId(classId, true); + + if (gdi.hasField("TimeAdjust")) { + int time = convertAbsoluteTimeMS(gdi.getText("TimeAdjust")); + if (time != NOTIME) + t->setTimeAdjustment(time); + } + if (gdi.hasField("PointAdjust")) { + t->setPointAdjustment(-gdi.getTextNo("PointAdjust")); + } + + if (gdi.hasField("StatusIn") && readStatusIn) { + t->setInputStatus(RunnerStatus(gdi.getSelectedItem("StatusIn").first)); + t->setInputPlace(gdi.getTextNo("PlaceIn")); + t->setInputTime(gdi.getText("TimeIn")); + if (gdi.hasField("PointIn")) + t->setInputPoints(gdi.getTextNo("PointIn")); + } + + pClass pc=oe->getClass(classId); + + if (pc) { + globalDep |= pc->hasClassGlobalDependance(); + + for (unsigned i=0;igetNumStages(); i++) { + char bf[16]; + sprintf_s(bf, "R%d", i); + if (!gdi.hasField("SI" + itos(i))) // Skip if field not loaded in page + continue; + + if (pc->getLegRunner(i)==i) { + + const string name=gdi.getText(bf); + if (name.empty()) { //Remove + t->removeRunner(gdi, true, i); + } + else { + pRunner r=t->getRunner(i); + char bf2[16]; + sprintf_s(bf2, "SI%d", i); + int cardNo = gdi.getTextNo(bf2); + + if (r) { + bool newName = name != r->getName(); + int oldId = gdi.getExtraInt(bf); + // Same runner set + if (oldId == r->getId()) { + if (newName) { + r->updateFromDB(name, r->getClubId(), r->getClassId(), + cardNo, 0); + r->setName(name, true); + } + r->setCardNo(cardNo, true); + + if (gdi.isChecked("RENT" + itos(i))) + r->getDI().setInt("CardFee", oe->getDI().getInt("CardFee")); + else + r->getDI().setInt("CardFee", 0); + + r->synchronize(true); + continue; + } + + if (newName) { + if (!t->getClub().empty()) + r->setClub(t->getClub()); + r->resetPersonalData(); + r->updateFromDB(name, r->getClubId(), r->getClassId(), + cardNo, 0); + } + } + else + r=oe->addRunner(name, t->getClubId(), t->getClassId(), cardNo, 0, false); + + r->setName(name, true); + r->setCardNo(cardNo, true); + r->synchronize(); + t->setRunner(i, r, true); + } + } + } + + } + if (setDNS) + t->setTeamNoStart(true); + + if (t->checkValdParSetup()) { + gdi.alert("Laguppställningen hade fel, som har rättats"); + } + + if (t->getRunner(0)) + t->getRunner(0)->setStartTimeS(start); + + t->evaluate(true); + + if (globalDep) + oe->reEvaluateAll(classes, false); + + if (!dontReloadTeams) { + fillTeamList(gdi); + //updateTeamStatus(gdi, t); + } + if (checkStatus && sIn != t->getStatus()) { + gdi.alert("Status matchar inte deltagarnas status."); + } + } + + if (create) { + selectTeam(gdi, 0); + gdi.setInputFocus("Name", true); + } + else if (!dontReloadTeams) { + selectTeam(gdi, t); + } + return true; +} + +int TabTeam::teamCB(gdioutput &gdi, int type, void *data) +{ + if (type==GUI_BUTTON) { + ButtonInfo bi=*(ButtonInfo *)data; + + if (bi.id=="Save") { + return save(gdi, false); + } + if (bi.id == "Cancel") { + loadPage(gdi); + return 0; + } + else if (bi.id=="TableMode") { + if (currentMode == 0 && teamId>0) + save(gdi, true); + + currentMode = 1; + loadPage(gdi); + } + else if (bi.id=="FormMode") { + if (currentMode != 0) { + currentMode = 0; + gdi.enableTables(); + loadPage(gdi); + } + } + else if (bi.id=="Undo") { + pTeam t = oe->getTeam(teamId); + selectTeam(gdi, t); + return 0; + } + else if (bi.id=="Search") { + ListBoxInfo lbi; + gdi.getSelectedItem("Teams", lbi); + oe->fillTeams(gdi, "Teams"); + stdext::hash_set foo; + pTeam t=oe->findTeam(gdi.getText("SearchText"), lbi.data, foo); + + if (t) { + selectTeam(gdi, t); + gdi.selectItemByData("Teams", t->getId()); + } + else + gdi.alert("Laget hittades inte"); + } + else if (bi.id == "ImportTeams") { + if (teamId>0) + save(gdi, true); + showTeamImport(gdi); + } + else if (bi.id == "DoImportTeams") { + doTeamImport(gdi); + } + else if (bi.id == "AddTeamMembers") { + if (teamId>0) + save(gdi, true); + showAddTeamMembers(gdi); + } + else if (bi.id == "DoAddTeamMembers") { + doAddTeamMembers(gdi); + } + else if (bi.id == "SaveTeams") { + saveTeamImport(gdi, bi.getExtraInt() != 0); + } + else if (bi.id == "ShowAll") { + fillTeamList(gdi); + } + else if (bi.id == "DirectEntry") { + gdi.restore("DirectEntry", false); + gdi.fillDown(); + gdi.dropLine(); + gdi.addString("", boldText, "Direktanmälan"); + gdi.addString("", 0, "Du kan använda en SI-enhet för att läsa in bricknummer."); + gdi.dropLine(0.2); + + int leg = bi.getExtraInt(); + gdi.fillRight(); + gdi.addInput("DirName", "", 16, TeamCB, "Namn:"); + gdi.addInput("DirCard", "", 8, TeamCB, "Bricka:"); + + TabSI &tsi = dynamic_cast(*gdi.getTabs().get(TSITab)); + tsi.setCardNumberField("DirCard"); + gdi.setPostClearCb(TeamCB); + bool rent = false; + gdi.dropLine(1.1); + + gdi.addCheckbox("DirRent", "Hyrd", 0, rent); + gdi.dropLine(-0.2); + + gdi.addButton("DirOK", "OK", TeamCB).setDefault().setExtra(leg); + gdi.addButton("Cancel", "Avbryt", TeamCB).setCancel(); + + gdi.disableInput("DirOK"); + gdi.refreshFast(); + } + else if (bi.id == "DirOK") { + pTeam t = oe->getTeam(teamId); + if (!t || !t->getClassRef()) + return 0; + + int leg = bi.getExtraInt(); + string name = gdi.getText("DirName"); + int storedId = gdi.getBaseInfo("DirName").getExtraInt(); + + int card = gdi.getTextNo("DirCard"); + + + if (card <= 0 || name.empty()) + throw meosException("Internal error"); //Cannot happen + + pRunner r = 0; + if (storedId > 0) { + r = oe->getRunner(storedId, 0); + if (r != 0 && (r->getName() != name || r->getCardNo() != card)) + r = 0; // Ignore match + } + + bool rExists = r != 0; + + pRunner old = oe->getRunnerByCardNo(card, 0, true, true); + if (old && r != old) { + throw meosException("Brickan används av X.#" + old->getName() ); + } + + + pClub clb = 0; + if (!rExists) { + pRunner rOrig = oe->getRunnerByCardNo(card, 0, false, false); + if (rOrig) + clb = rOrig->getClubRef(); + } + + bool rent = gdi.isChecked("DirRent"); + + if (r == 0) { + r = oe->addRunner(name, clb ? clb->getId() : t->getClubId(), t->getClassId(), card, 0, false); + } + if (rent) + r->getDI().setInt("CardFee", oe->getDI().getInt("CardFee")); + + t->synchronize(); + pRunner oldR = t->getRunner(leg); + t->setRunner(leg, 0, false); + t->synchronize(true); + if (oldR) { + if (rExists) { + switchRunners(t, leg, r, oldR); + } + else { + oldR->setClassId(0, true); + vector mp; + oldR->evaluateCard(true, mp, 0, true); + oldR->synchronize(true); + t->setRunner(leg, r, true); + t->checkValdParSetup(); + } + } + else { + t->setRunner(leg, r, true); + t->checkValdParSetup(); + } + + selectTeam(gdi, t); + } + else if (bi.id == "Browse") { + const char *target = (const char *)bi.getExtra(); + vector< pair > ext; + ext.push_back(make_pair("Laguppställning", "*.csv;*.txt")); + string fileName = gdi.browseForOpen(ext, "csv"); + if (!fileName.empty()) + gdi.setText(target, fileName); + } + else if (bi.id == "ChangeKey") { + pTeam t = oe->getTeam(teamId); + if (!t || !t->getClassRef()) + return 0; + + pClass pc = t->getClassRef(); + gdi.restore("ChangeKey", false); + gdi.fillRight(); + gdi.pushX(); + gdi.dropLine(); + gdi.addSelection("ForkKey", 100, 400, 0, "Gafflingsnyckel:"); + int nf = pc->getNumForks(); + vector< pair > keys; + for (int f = 0; f < nf; f++) { + keys.push_back( make_pair(itos(f+1), f)); + } + int currentKey = max(t->getStartNo()-1, 0) % nf; + gdi.addItem("ForkKey", keys); + gdi.selectItemByData("ForkKey", currentKey); + + gdi.dropLine(0.9); + gdi.addButton("SaveKey", "Ändra", TeamCB); + gdi.refreshFast(); + } + else if (bi.id == "SaveKey") { + pTeam t = oe->getTeam(teamId); + if (!t || !t->getClassRef()) + return 0; + + pClass pc = t->getClassRef(); + int nf = pc->getNumForks(); + ListBoxInfo lbi; + gdi.getSelectedItem("ForkKey", lbi); + for (int k = 0; k < nf; k++) { + for (int j = 0; j < 2; j++) { + int newSno = t->getStartNo(); + if (j == 0) + newSno += k; + else + newSno -=k; + + if (newSno <= 0) + continue; + + int currentKey = max(newSno-1, 0) % nf; + if (currentKey == lbi.data) { + t->setStartNo(newSno, false); + t->apply(false, 0, false); + t->synchronize(true); + for (int i = 0; i < t->getNumRunners(); i++) { + pRunner r = t->getRunner(i); + if (r) { + vector mp; + r->evaluateCard(true, mp); + r->synchronize(true); + } + } + selectTeam(gdi, t); + return 0; + } + } + } + } + else if (bi.id.substr(0,2)=="MR") { + int leg = atoi(bi.id.substr(2, string::npos).c_str()); + + if (teamId != 0) { + save(gdi, false); + pTeam t = oe->getTeam(teamId); + if (t != 0) { + pRunner r = t->getRunner(leg); + if (r) { + TabRunner *tr = (TabRunner *)gdi.getTabs().get(TRunnerTab); + tr->loadPage(gdi, r->getId()); + } + } + } + } + else if (bi.id.substr(0,2)=="DR") { + int leg=atoi(bi.id.substr(2, string::npos).c_str()); + pTeam t = oe->getTeam(teamId); + if (t == 0) + return 0; + pClass pc = t->getClassRef(); + if (pc == 0) + return 0; + + gdi.restore("SelectR", false); + gdi.setRestorePoint("SelectR"); + gdi.dropLine(); + gdi.fillDown(); + + gdi.addString("", fontMediumPlus, "Välj löpare för sträcka X#" + pc->getLegNumber(leg)); + gdi.setData("Leg", leg); + + gdi.setRestorePoint("DirectEntry"); + gdi.addString("", 0, "help:teamwork"); + gdi.dropLine(0.5); + + gdi.addButton("DirectEntry", "Direktanmälan...", TeamCB).setExtra(leg); + set presented; + gdi.pushX(); + gdi.fillRight(); + int w,h; + gdi.getTargetDimension(w, h); + w = max(w, gdi.getWidth()); + int limit = max(w - gdi.scaleLength(150), gdi.getCX() + gdi.scaleLength(200)); + set< pair > rToList; + set usedR; + string anon = lang.tl("N.N."); + set clubs; + + for (int i = 0; i < t->getNumRunners(); i++) { + if (pc->getLegRunnerIndex(i) == 0) { + pRunner r = t->getRunner(i); + if (!r) + continue; + if (r->getClubId() > 0) + clubs.insert(r->getClubId()); // Combination teams + if (r && r->getName() != anon) { + rToList.insert( make_pair(r->getName(), r->getId())); + } + } + } + showRunners(gdi, "Från laget", rToList, limit, usedR); + vector clsR; + oe->getRunners(0, 0, clsR, true); + rToList.clear(); + if (t->getClubId() > 0) + clubs.insert(t->getClubId()); + + if (!clubs.empty()) { + for (size_t i = 0; i < clsR.size(); i++) { + if (clsR[i]->getRaceNo() > 0) + continue; + if (clubs.count(clsR[i]->getClubId()) == 0) + continue; + if (clsR[i]->getClassId() != t->getClassId()) + continue; + if (clsR[i]->getName() == anon) + continue; + rToList.insert( make_pair(clsR[i]->getName(), clsR[i]->getId())); + } + + showRunners(gdi, "Från klassen", rToList, limit, usedR); + rToList.clear(); + + for (size_t i = 0; i < clsR.size(); i++) { + if (clsR[i]->getRaceNo() > 0) + continue; + if (clubs.count(clsR[i]->getClubId()) == 0) + continue; + if (clsR[i]->getName() == anon) + continue; + rToList.insert( make_pair(clsR[i]->getName(), clsR[i]->getId())); + } + showRunners(gdi, "Från klubben", rToList, limit, usedR); + } + + + vector< pair > otherR; + + for (size_t i = 0; i < clsR.size(); i++) { + if (clsR[i]->getRaceNo() > 0) + continue; + if (clsR[i]->getName() == anon) + continue; + if (usedR.count(clsR[i]->getId())) + continue; + const string &club = clsR[i]->getClub(); + string id = clsR[i]->getName() + ", " + clsR[i]->getClass(); + if (!club.empty()) + id += " (" + club + ")"; + + otherR.push_back(make_pair(id, clsR[i]->getId())); + } + gdi.fillDown(); + if (!otherR.empty()) { + gdi.addString("", 1, "Övriga"); + gdi.fillRight(); + gdi.addSelection("SelectR", 250, 400, TeamCB); + gdi.addButton("SelectRunner", "OK", TeamCB).setExtra(leg); + gdi.fillDown(); + gdi.addButton("Cancel", "Avbryt", TeamCB); + + gdi.addItem("SelectR", otherR); + } + else { + gdi.addButton("Cancel", "Avbryt", TeamCB); + } + gdi.refresh(); + } + else if (bi.id=="SelectRunner") { + ListBoxInfo lbi; + gdi.getSelectedItem("SelectR", lbi); + pRunner r = oe->getRunner(lbi.data, 0); + if (r == 0) { + throw meosException("Ingen deltagare vald."); + } + int leg = (int)gdi.getData("Leg"); + + pTeam t = oe->getTeam(teamId); + processChangeRunner(gdi, t, leg, r); + } + else if (bi.id=="Add") { + if (teamId>0) { + + string name = gdi.getText("Name"); + pTeam t = oe->getTeam(teamId); + if (!name.empty() && t && t->getName() != name) { + if (gdi.ask("Vill du lägga till laget 'X'?#" + name)) { + t = oe->addTeam(name); + teamId = t->getId(); + } + save(gdi, false); + return true; + } + + save(gdi, false); + } + + pTeam t = oe->addTeam(oe->getAutoTeamName()); + + ListBoxInfo lbi; + gdi.getSelectedItem("RClass", lbi); + + int clsId; + if (signed(lbi.data)>0) + clsId = lbi.data; + else + clsId = oe->getFirstClassId(true); + + pClass pc = oe->getClass(clsId); + if (pc) { + pair snoBib = pc->getNextBib(); + if (snoBib.first > 0) { + t->setBib(snoBib.second, snoBib.first, true, false); + } + } + + t->setClassId(clsId, true); + + fillTeamList(gdi); + //oe->fillTeams(gdi, "Teams"); + selectTeam(gdi, t); + + //selectTeam(gdi, 0); + //gdi.selectItemByData("Teams", -1); + gdi.setInputFocus("Name", true); + } + else if (bi.id=="Remove") { + DWORD tid=teamId; + + if (tid==0) + throw std::exception("Inget lag valt."); + + pTeam t = oe->getTeam(tid); + + if (!t || t->isRemoved()) { + selectTeam(gdi, 0); + } + else if (gdi.ask("Vill du verkligen ta bort laget?")) { + vector runners; + vector noRemove; + for (int k = 0; k < t->getNumRunners(); k++) { + pRunner r = t->getRunner(k); + if (r && r->getRaceNo() == 0) { + if (r->getCard() == 0) + runners.push_back(r->getId()); + else + noRemove.push_back(r->getId()); + } + } + oe->removeTeam(tid); + oe->removeRunner(runners); + + for (size_t k = 0; kgetRunner(noRemove[k], 0); + if (r) { + r->setClassId(0, true); + r->synchronize(); + } + } + + fillTeamList(gdi); + //oe->fillTeams(gdi, "Teams"); + selectTeam(gdi, 0); + gdi.selectItemByData("Teams", -1); + } + } + } + else if (type == GUI_LINK) { + TextInfo ti = dynamic_cast(*(BaseInfo *)data); + if (ti.id == "SelectR") { + int leg = (int)gdi.getData("Leg"); + pTeam t = oe->getTeam(teamId); + int rid = ti.getExtraInt(); + pRunner r = oe->getRunner(rid, 0); + processChangeRunner(gdi, t, leg, r); + } + } + else if (type==GUI_LISTBOX) { + ListBoxInfo bi=*(ListBoxInfo *)data; + + if (bi.id=="Teams") { + if (gdi.isInputChanged("")) { + pTeam t = oe->getTeam(teamId); + bool newName = t && t->getName() != gdi.getText("Name"); + bool newBib = gdi.hasField("StartNo") && t && t->getBib() != gdi.getText("StartNo"); + save(gdi, true); + + if (newName || newBib) { + fillTeamList(gdi); + } + } + pTeam t=oe->getTeam(bi.data); + selectTeam(gdi, t); + } + else if (bi.id=="RClass") { //New class selected. + DWORD tid=teamId; + //gdi.getData("TeamID", tid); + + if (tid){ + pTeam t=oe->getTeam(tid); + pClass pc=oe->getClass(bi.data); + + if (pc && pc->getNumDistinctRunners() == shownDistinctRunners && + pc->getNumStages() == shownRunners) { + // Keep team setup, i.e. do nothing + } + else if (t && pc && (t->getClassId()==bi.data + || t->getNumRunners()==pc->getNumStages()) ) + loadTeamMembers(gdi, 0,0,t); + else + loadTeamMembers(gdi, bi.data, 0, t); + } + else loadTeamMembers(gdi, bi.data, 0, 0); + } + else { + + ListBoxInfo lbi; + gdi.getSelectedItem("RClass", lbi); + + if (signed(lbi.data)>0){ + pClass pc=oe->getClass(lbi.data); + + if (pc) { + vector rCache; + for(unsigned i=0;igetNumStages();i++){ + char bf[16]; + sprintf_s(bf, "R%d", i); + if (bi.id==bf){ + pRunner r=oe->getRunner(bi.data, 0); + if (r) { + sprintf_s(bf, "SI%d", i); + int cno = r->getCardNo(); + gdi.setText(bf, cno > 0 ? itos(cno) : ""); + warnDuplicateCard(gdi, bf, cno, r, rCache); + } + } + } + } + } + } + } + else if (type==GUI_INPUTCHANGE) { + InputInfo &ii=*(InputInfo *)data; + pClass pc=oe->getClass(classId); + if (pc){ + for(unsigned i=0;igetNumStages();i++){ + char bf[16]; + sprintf_s(bf, "R%d", i); + if (ii.id == bf) { + for (unsigned k=i+1; kgetNumStages(); k++) { + if (pc->getLegRunner(k)==i) { + sprintf_s(bf, "R%d", k); + gdi.setText(bf, ii.text); + } + } + break; + } + } + } + + if (ii.id == "DirName" || ii.id == "DirCard") { + gdi.setInputStatus("DirOK", !gdi.getText("DirName").empty() && + gdi.getTextNo("DirCard") > 0); + + } + } + else if (type == GUI_INPUT) { + InputInfo &ii=*(InputInfo *)data; + if (ii.id == "DirName" || ii.id == "DirCard") { + gdi.setInputStatus("DirOK", !gdi.getText("DirName").empty() && + gdi.getTextNo("DirCard") > 0); + + } + if (ii.id == "DirCard") { + int cno = gdi.getTextNo("DirCard"); + if (cno > 0 && gdi.getText("DirName").empty()) { + bool matched = false; + pRunner r = oe->getRunnerByCardNo(cno, 0, true, false); + if (r && (r->getStatus() == StatusUnknown || r->getStatus() == StatusDNS) ) { + // Switch to exactly this runner. Has not run before + gdi.setText("DirName", r->getName())->setExtra(r->getId()); + matched = true; + } + else { + r = oe->getRunnerByCardNo(cno, 0, false, false); + if (r) { + // Copy only the name. + gdi.setText("DirName", r->getName())->setExtra(0); + matched = true; + } + else if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::RunnerDb)) { + const RunnerDBEntry *rdb = oe->getRunnerDatabase().getRunnerByCard(cno); + if (rdb) { + string name; + rdb->getName(name); + gdi.setText("DirName", name)->setExtra(0); + matched = true; + } + } + } + if (r) + gdi.check("DirRent", r->getDCI().getInt("CardFee") != 0); + if (matched) + gdi.setInputStatus("DirOK", true); + } + } + pClass pc=oe->getClass(classId); + if (pc) { + for(unsigned i=0;igetNumStages();i++){ + if (ii.id == "SI" + itos(i)) { + int cardNo = atoi(ii.text.c_str()); + pTeam t = oe->getTeam(teamId); + if (t) { + vector rc; + warnDuplicateCard(gdi, ii.id, cardNo, t->getRunner(i), rc); + } + break; + } + } + } + + } + else if (type==GUI_CLEAR) { + if (teamId>0) + save(gdi, true); + + return true; + } + else if (type==GUI_POSTCLEAR) { + // Clear out SI-link + TabSI &tsi = dynamic_cast(*gdi.getTabs().get(TSITab)); + tsi.setCardNumberField(""); + return true; + } + return 0; +} + + +void TabTeam::loadTeamMembers(gdioutput &gdi, int ClassId, int ClubId, pTeam t) +{ + if (ClassId==0) + if (t) ClassId=t->getClassId(); + + classId=ClassId; + gdi.restore("",false); + + pClass pc=oe->getClass(ClassId); + if (!pc) return; + + shownRunners = pc->getNumStages(); + shownDistinctRunners = pc->getNumDistinctRunners(); + + gdi.setRestorePoint(); + gdi.newColumn(); + + gdi.fillDown(); + char bf[16]; + char bf_si[16]; + int xp = gdi.getCX(); + int yp = gdi.getCY(); + int numberPos = xp; + xp += gdi.scaleLength(25); + int dx[6] = {0, 184, 220, 290, 316, 364}; + for (int i = 0; i<6; i++) + dx[i] = gdi.scaleLength(dx[i]); + + gdi.addString("", yp, xp + dx[0], 0, "Namn:"); + gdi.addString("", yp, xp + dx[2], 0, "Bricka:"); + gdi.addString("", yp, xp + dx[3], 0, "Hyrd:"); + gdi.addString("", yp, xp + dx[5], 0, "Status:"); + gdi.dropLine(0.5); + vector rCache; + + for (unsigned i=0;igetNumStages();i++) { + yp = gdi.getCY(); + + sprintf_s(bf, "R%d", i); + gdi.pushX(); + bool hasSI = false; + gdi.addStringUT(yp, numberPos, 0, pc->getLegNumber(i)+"."); + if (pc->getLegRunner(i)==i) { + + gdi.addInput(xp + dx[0], yp, bf, "", 18, TeamCB);//Name + gdi.addButton(xp + dx[1], yp-2, gdi.scaleLength(28), "DR" + itos(i), "<>", TeamCB, "Knyt löpare till sträckan.", false, false); // Change + sprintf_s(bf_si, "SI%d", i); + hasSI = true; + gdi.addInput(xp + dx[2], yp, bf_si, "", 5, TeamCB).setExtra(i); //Si + + gdi.addCheckbox(xp + dx[3], yp + gdi.scaleLength(10), "RENT"+itos(i), "", 0, false); //Rentcard + } + else { + //gdi.addInput(bf, "", 24); + gdi.addInput(xp + dx[0], yp, bf, "", 18, 0);//Name + gdi.disableInput(bf); + } + gdi.addButton(xp + dx[4], yp-2, gdi.scaleLength(38), "MR" + itos(i), "...", TeamCB, "Redigera deltagaren.", false, false); // Change + + gdi.addString(("STATUS"+itos(i)).c_str(), yp+gdi.scaleLength(5), xp + dx[5], 0, "#MMMMMMMMMMMMMMMM"); + gdi.setText("STATUS"+itos(i), "", false); + gdi.dropLine(0.5); + gdi.popX(); + + + if (t) { + pRunner r=t->getRunner(i); + if (r) { + gdi.setText(bf, r->getNameRaw())->setExtra(r->getId()); + + if (hasSI) { + int cno = r->getCardNo(); + gdi.setText(bf_si, cno > 0 ? itos(cno) : ""); + warnDuplicateCard(gdi, bf_si, cno, r, rCache); + gdi.check("RENT" + itos(i), r->getDCI().getInt("CardFee") != 0); + } + string sid = "STATUS"+itos(i); + if (r->statusOK()) { + TextInfo * ti = (TextInfo *)gdi.setText(sid, "OK, " + r->getRunningTimeS(), false); + if (ti) + ti->setColor(colorGreen); + } + else if (r->getStatus() != StatusUnknown) { + TextInfo * ti = (TextInfo *)gdi.setText(sid, r->getStatusS() + ", " + r->getRunningTimeS(), false); + if (ti) + ti->setColor(colorRed); + } + } + } + } + + gdi.setRestorePoint("SelectR"); + gdi.addString("", 1, "help:7618"); + gdi.dropLine(); + int numF = pc->getNumForks(); + + if (numF>1 && t) { + gdi.addString ("", 1, "Gafflingsnyckel X#" + itos(1+(max(t->getStartNo()-1, 0) % numF))).setColor(colorGreen); + string crsList; + bool hasCrs = false; + for (size_t k = 0; k < pc->getNumStages(); k++) { + pCourse crs = pc->getCourse(k, t->getStartNo()); + string cS; + if (crs != 0) { + cS = crs->getName(); + hasCrs = true; + } + else + cS = MakeDash("-"); + + if (!crsList.empty()) + crsList += ", "; + crsList += cS; + + if (hasCrs && crsList.length() > 50) { + gdi.addStringUT(0, crsList); + crsList.clear(); + } + } + if (hasCrs && !crsList.empty()) { + gdi.addStringUT(0, crsList); + } + + if (hasCrs) { + gdi.dropLine(0.5); + gdi.setRestorePoint("ChangeKey"); + gdi.addButton("ChangeKey", "Ändra lagets gaffling", TeamCB); + } + } + gdi.refresh(); +} + +bool TabTeam::loadPage(gdioutput &gdi, int id) { + teamId = id; + return loadPage(gdi); +} + +bool TabTeam::loadPage(gdioutput &gdi) +{ + shownRunners = 0; + shownDistinctRunners = 0; + + oe->checkDB(); + oe->reEvaluateAll(set(), true); + + gdi.selectTab(tabId); + gdi.clearPage(false); + + if (currentMode == 1) { + Table *tbl=oe->getTeamsTB(); + addToolbar(gdi); + gdi.dropLine(1); + gdi.addTable(tbl, gdi.getCX(), gdi.getCY()); + return true; + } + + gdi.fillDown(); + gdi.addString("", boldLarge, "Lag(flera)"); + + gdi.pushX(); + gdi.fillRight(); + + gdi.registerEvent("SearchRunner", teamSearchCB).setKeyCommand(KC_FIND); + gdi.registerEvent("SearchRunnerBack", teamSearchCB).setKeyCommand(KC_FINDBACK); + gdi.addInput("SearchText", "", 17, teamSearchCB, "", "Sök på namn, bricka eller startnummer.").isEdit(false).setBgColor(colorLightCyan).ignore(true); + gdi.dropLine(-0.2); + gdi.addButton("ShowAll", "Visa alla", TeamCB).isEdit(false); + + gdi.dropLine(2); + gdi.popX(); + gdi.fillDown(); + gdi.addListBox("Teams", 250, 440, TeamCB, "", "").isEdit(false).ignore(true); + gdi.setInputFocus("Teams"); + fillTeamList(gdi); + + int posXForButtons = gdi.getCX(); + int posYForButtons = gdi.getCY(); + + gdi.newColumn(); + gdi.fillDown(); + gdi.pushX(); + gdi.addInput("Name", "", 24, 0, "Lagnamn:"); + + gdi.fillRight(); + bool drop = false; + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Bib)) { + gdi.addInput("StartNo", "", 4, 0, "Nr:", "Nummerlapp"); + drop = oe->getMeOSFeatures().hasFeature(MeOSFeatures::Economy); + } + + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Clubs)) { + gdi.addCombo("Club", 180, 300, 0, "Klubb:"); + oe->fillClubs(gdi, "Club"); + drop = true; + } + + if (drop) { + gdi.dropLine(3); + gdi.popX(); + } + + gdi.addSelection("RClass", 170, 300, TeamCB, "Klass:"); + oe->fillClasses(gdi, "RClass", oEvent::extraNone, oEvent::filterNone); + gdi.addItem("RClass", lang.tl("Ny klass"), 0); + + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::Economy)) + gdi.addInput("Fee", "", 5, 0, "Avgift:"); + + gdi.popX(); + gdi.fillDown(); + gdi.dropLine(3); + + gdi.pushX(); + gdi.fillRight(); + + gdi.addInput("Start", "", 8, 0, "Starttid:"); + gdi.addInput("Finish", "", 8, 0, "Måltid:"); + + const bool timeAdjust = oe->getMeOSFeatures().hasFeature(MeOSFeatures::TimeAdjust); + const bool pointAdjust = oe->getMeOSFeatures().hasFeature(MeOSFeatures::PointAdjust); + + if (timeAdjust || pointAdjust) { + gdi.dropLine(3); + gdi.popX(); + if (timeAdjust) { + gdi.addInput("TimeAdjust", "", 8, 0, "Tidstillägg:"); + } + if (pointAdjust) { + gdi.addInput("PointAdjust", "", 8, 0, "Poängavdrag:"); + } + } + + /*if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::TimeAdjust)) { + gdi.addInput("TimeAdjust", "", 5, 0, "Tidstillägg:"); + } + if (oe->getMeOSFeatures().hasFeature(MeOSFeatures::PointAdjust)) { + gdi.addInput("PointAdjust", "", 5, 0, "Poängavdrag:"); + }*/ + + gdi.fillDown(); + gdi.dropLine(3); + gdi.popX(); + + gdi.pushX(); + gdi.fillRight(); + + gdi.addInput("Time", "", 6, 0, "Tid:").isEdit(false).ignore(true); + gdi.disableInput("Time"); + + gdi.fillDown(); + gdi.addSelection("Status", 100, 160, 0, "Status:", "tooltip_explain_status"); + oe->fillStatus(gdi, "Status"); + + gdi.popX(); + gdi.selectItemByData("Status", 0); + + gdi.dropLine(1.5); + + const bool multiDay = oe->hasPrevStage(); + + if (multiDay) { + int xx = gdi.getCX(); + int yy = gdi.getCY(); + gdi.dropLine(0.5); + gdi.fillDown(); + int dx = int(gdi.getLineHeight()*0.7); + int ccx = xx + dx; + gdi.setCX(ccx); + gdi.addString("", 1, "Resultat från tidigare etapper"); + gdi.dropLine(0.3); + gdi.fillRight(); + + gdi.addSelection("StatusIn", 100, 160, 0, "Status:", "tooltip_explain_status"); + oe->fillStatus(gdi, "StatusIn"); + gdi.selectItemByData("Status", 0); + gdi.addInput("PlaceIn", "", 5, 0, "Placering:"); + int xmax = gdi.getCX() + dx; + gdi.setCX(ccx); + gdi.dropLine(3); + gdi.addInput("TimeIn", "", 5, 0, "Tid:"); + if (oe->hasRogaining()) { + gdi.addInput("PointIn", "", 5, 0, "Poäng:"); + } + gdi.dropLine(3); + RECT rc; + rc.right = xx; + rc.top = yy; + rc.left = max(xmax, gdi.getWidth()-dx); + rc.bottom = gdi.getCY(); + + gdi.addRectangle(rc, colorLightGreen, true, false); + gdi.dropLine(1.5); + gdi.popX(); + } + + gdi.fillRight(); + gdi.addButton("Save", "Spara", TeamCB, "help:save"); + gdi.disableInput("Save"); + gdi.addButton("Undo", "Ångra", TeamCB); + gdi.disableInput("Undo"); + + gdi.popX(); + gdi.dropLine(2.5); + gdi.addButton("Remove", "Radera", TeamCB); + gdi.disableInput("Remove"); + gdi.addButton("Add", "Nytt lag", TeamCB); + + gdi.setOnClearCb(TeamCB); + + addToolbar(gdi); + + RECT rc; + rc.left = posXForButtons; + rc.top = posYForButtons; + + gdi.setCY(posYForButtons + gdi.scaleLength(4)); + gdi.setCX(posXForButtons + gdi.getLineHeight()); + gdi.fillDown(); + gdi.addString("", 1, "Verktyg"); + gdi.dropLine(0.3); + gdi.fillRight(); + gdi.addButton("ImportTeams", "Importera laguppställningar", TeamCB); + gdi.addButton("AddTeamMembers", "Skapa anonyma lagmedlemmar", TeamCB, "Fyll obesatta sträckor i alla lag med anonyma tillfälliga lagmedlemmar (N.N.)"); + rc.right = gdi.getCX() + gdi.getLineHeight(); + gdi.dropLine(1.5); + rc.bottom = gdi.getHeight(); + gdi.addRectangle(rc, colorLightCyan); + + gdi.setRestorePoint(); + + selectTeam(gdi, oe->getTeam(teamId)); + + gdi.refresh(); + return true; +} + +void TabTeam::fillTeamList(gdioutput &gdi) { + timeToFill = GetTickCount(); + oe->fillTeams(gdi, "Teams"); + timeToFill = GetTickCount() - timeToFill; + lastSearchExpr = ""; + ((InputInfo *)gdi.setText("SearchText", getSearchString()))->setFgColor(colorGreyBlue); + lastFilter.clear(); +} + + +const string &TabTeam::getSearchString() const { + return lang.tl("Sök (X)#Ctrl+F"); +} + +void TabTeam::addToolbar(gdioutput &gdi) const { + + const int button_w=gdi.scaleLength(130); + + gdi.addButton(2+0*button_w, 2, button_w, "FormMode", + "Formulärläge", TeamCB, "", false, true).fixedCorner(); + gdi.check("FormMode", currentMode==0); + + gdi.addButton(2+1*button_w, 2, button_w, "TableMode", + "Tabelläge", TeamCB, "", false, true).fixedCorner(); + gdi.check("TableMode", currentMode==1); + +} + +void TabTeam::showTeamImport(gdioutput &gdi) { + gdi.clearPage(false); + gdi.addString("", boldLarge, "Importera laguppställningar"); + + gdi.addString("", 10, "help:teamlineup"); + gdi.dropLine(); + gdi.setRestorePoint("TeamLineup"); + gdi.pushX(); + + gdi.fillRight(); + gdi.addInput("FileName", "", 40, 0, "Filnamn:"); + gdi.dropLine(0.9); + gdi.addButton("Browse", "Bläddra", TeamCB).setExtra("FileName"); + gdi.dropLine(3); + gdi.popX(); + gdi.fillDown(); + gdi.addCheckbox("OnlyExisting", "Använd befintliga deltagare", 0, false, + "Knyt redan anmälda deltagare till laget (identifiera genom namn och/eller bricka)"); + gdi.fillRight(); + gdi.addButton("DoImportTeams", "Importera", TeamCB).setDefault(); + gdi.addButton("Cancel", "Avbryt", TeamCB).setCancel(); + + gdi.refresh(); +} + +void TabTeam::doTeamImport(gdioutput &gdi) { + string file = gdi.getText("FileName"); + bool useExisting = gdi.isChecked("OnlyExisting"); + + + csvparser csv; + map classNameToNumber; + vector cls; + oe->getClasses(cls, true); + for (size_t k = 0; k < cls.size();k++) { + classNameToNumber[cls[k]->getName()] = cls[k]->getNumStages(); + } + gdi.fillDown(); + csv.importTeamLineup(file, classNameToNumber, teamLineup); + + gdi.restore("TeamLineup", false); + + gdi.dropLine(); + for (size_t k = 0; k < teamLineup.size(); k++) { + string tdesc = teamLineup[k].teamClass +", " + teamLineup[k].teamName; + if (!teamLineup[k].teamClub.empty()) + tdesc += ", " + teamLineup[k].teamClub; + gdi.addStringUT(1, tdesc); + for (size_t j = 0; j < teamLineup[k].members.size(); j++) { + TeamLineup::TeamMember &member = teamLineup[k].members[j]; + if (member.name.empty()) + continue; + + string mdesc = " " + itos(j+1) + ". "; + bool warn = false; + + if (useExisting) { + pRunner r = findRunner(member.name, member.cardNo); + if (r != 0) + mdesc += r->getCompleteIdentification(); + else { + mdesc += member.name + lang.tl(" (ej funnen)"); + warn = true; + } + } + else { + mdesc += member.name + " (" + itos(member.cardNo) + ") " + member.club; + } + + if (!member.course.empty()) { + if (oe->getCourse(member.course)) + mdesc += " : " + member.course; + else { + mdesc += " : " + lang.tl("Banan saknas"); + warn = true; + } + } + + if (!member.cls.empty()) { + if (oe->getClass(member.cls)) + mdesc += " [" + member.cls + "]"; + else { + mdesc += " " + lang.tl("Klassen saknas"); + warn = true; + } + } + + TextInfo &ti = gdi.addStringUT(0, mdesc); + if (warn) + ti.setColor(colorRed); + } + gdi.dropLine(); + } + gdi.fillRight(); + gdi.addButton("ImportTeams", "<< Bakåt", TeamCB); + gdi.addButton("SaveTeams", "Spara laguppställningar", TeamCB).setDefault().setExtra(useExisting); + gdi.addButton("Cancel", "Avbryt", TeamCB).setCancel(); + gdi.refresh(); +} + +void TabTeam::saveTeamImport(gdioutput &gdi, bool useExisting) { + for (size_t k = 0; k < teamLineup.size(); k++) { + pClub club = !teamLineup[k].teamClub.empty() ? oe->getClubCreate(0, teamLineup[k].teamClub) : 0; + pTeam t = oe->addTeam(teamLineup[k].teamName, club ? club->getId() : 0, oe->getClass(teamLineup[k].teamClass)->getId()); + + for (size_t j = 0; j < teamLineup[k].members.size(); j++) { + TeamLineup::TeamMember &member = teamLineup[k].members[j]; + if (member.name.empty()) + continue; + + pRunner r = 0; + if (useExisting) { + r = findRunner(member.name, member.cardNo); + if (r && !member.course.empty()) { + pCourse pc = oe->getCourse(member.course); + r->setCourseId(pc ? pc->getId() : 0); + } + if (r && !member.cls.empty()) { + pClass rcls = oe->getClass(member.cls); + r->setClassId(rcls ? rcls->getId() : 0, true); + } + } + else { + r = oe->addRunner(member.name, member.club, 0, member.cardNo, 0, false); + + if (r && !member.course.empty()) { + pCourse pc = oe->getCourse(member.course); + r->setCourseId(pc ? pc->getId() : 0); + } + + if (r && !member.cls.empty()) { + pClass rcls = oe->getClass(member.cls); + r->setClassId(rcls ? rcls->getId() : 0, true); + } + } + + t->setRunner(j, r, false); + if (r) + r->synchronize(true); + } + + t->synchronize(); + gdi.dropLine(); + } + loadPage(gdi); +} + +pRunner TabTeam::findRunner(const string &name, int cardNo) const { + string n = canonizeName(name.c_str()); + + if (cardNo != 0) { + vector pr; + oe->getRunnersByCard(cardNo, pr); + for (size_t k = 0; k < pr.size(); k++) { + string a = canonizeName(pr[k]->getName().c_str()); + if (a == n) + return pr[k]; + } + } + else { + vector pr; + oe->getRunners(0, 0, pr, false); + for (size_t k = 0; k < pr.size(); k++) { + string a = canonizeName(pr[k]->getName().c_str()); + if (a == n) + return pr[k]; + } + } + return 0; +} + +void TabTeam::showAddTeamMembers(gdioutput &gdi) { + gdi.clearPage(false); + gdi.addString("", boldLarge, "Tillsätt tillfälliga anonyma lagmedlemmar"); + + gdi.addString("", 10, "help:anonymous_team"); + gdi.dropLine(); + gdi.pushX(); + + gdi.fillDown(); + gdi.addInput("Name", lang.tl("N.N."), 24, 0, "Anonymt namn:"); + gdi.fillDown(); + gdi.addCheckbox("OnlyRequired", "Endast på obligatoriska sträckor", 0, true); + gdi.addCheckbox("WithFee", "Med anmälningsavgift (lagets klubb)", 0, true); + + gdi.fillRight(); + gdi.addButton("DoAddTeamMembers", "Tillsätt", TeamCB).setDefault(); + gdi.addButton("Cancel", "Avbryt", TeamCB).setCancel(); + + gdi.refresh(); +} + +void TabTeam::doAddTeamMembers(gdioutput &gdi) { + vector t; + oe->getTeams(0, t, true); + bool onlyReq = gdi.isChecked("OnlyRequired"); + bool withFee = gdi.isChecked("WithFee"); + string nn = gdi.getText("Name"); + + for (size_t k = 0; k < t.size(); k++) { + pTeam mt = t[k]; + pClass cls = mt->getClassRef(); + if (cls == 0) + continue; + bool ch = false; + for (int j = 0; j < mt->getNumRunners(); j++) { + if (mt->getRunner(j) == 0) { + LegTypes lt = cls->getLegType(j); + if (onlyReq && lt == LTExtra || lt == LTIgnore || lt == LTParallelOptional) + continue; + pRunner r = 0; + if (withFee) { + r = oe->addRunner(nn, mt->getClubId(), 0, 0, 0, false); + r->synchronize(); + mt->setRunner(j, r, false); + r->addClassDefaultFee(true); + } + else { + r = oe->addRunnerVacant(0); + r->setName(nn, false); + //oe->addRunner(nn, oe->getVacantClub(), 0, 0, 0, false); + r->synchronize(); + mt->setRunner(j, r, false); + } + ch = true; + } + } + if (ch) { + mt->apply(false, 0, false); + mt->synchronize(); + for (int j = 0; j < mt->getNumRunners(); j++) { + if (mt->getRunner(j) != 0) { + mt->getRunner(j)->synchronize(); + } + } + } + } + + loadPage(gdi); +} + +void TabTeam::showRunners(gdioutput &gdi, const char *title, + const set< pair > &rToList, + int limitX, set &usedR) { + + if (rToList.empty()) + return; + + bool any = false; + for(set< pair >::const_iterator it = rToList.begin(); it != rToList.end(); ++it) { + if (usedR.count(it->second)) + continue; + usedR.insert(it->second); + + if (!any) { + gdi.addString("", boldText, title); + gdi.dropLine(1.2); + gdi.popX(); + any = true; + } + + if (gdi.getCX() > limitX) { + gdi.dropLine(1.5); + gdi.popX(); + } + + gdi.addString("SelectR", 0, "#" + it->first, TeamCB).setExtra(it->second); + } + + if (any) { + gdi.dropLine(2); + gdi.popX(); + } +} + +void TabTeam::processChangeRunner(gdioutput &gdi, pTeam t, int leg, pRunner r) { + if (r && t && leg < t->getNumRunners()) { + pRunner oldR = t->getRunner(leg); + gdioutput::AskAnswer ans = gdioutput::AnswerNo; + if (r == oldR) { + gdi.restore("SelectR"); + return; + } + else if (oldR) { + if (r->getTeam()) { + ans = gdi.askCancel("Vill du att X och Y byter sträcka?#" + + r->getName() + "#" + oldR->getName()); + } + else { + ans = gdi.askCancel("Vill du att X tar sträckan istället för Y?#" + + r->getName() + "#" + oldR->getName()); + } + } + else { + ans = gdi.askCancel("Vill du att X går in i laget?#" + r->getName()); + } + + if (ans == gdioutput::AnswerNo) + return; + else if (ans == gdioutput::AnswerCancel) { + gdi.restore("SelectR"); + return; + } + + save(gdi, true); + vector mp; + switchRunners(t, leg, r, oldR); + /*if (r->getTeam()) { + pTeam otherTeam = r->getTeam(); + int otherLeg = r->getLegNumber(); + otherTeam->setRunner(otherLeg, oldR, true); + if (oldR) + oldR->evaluateCard(true, mp, 0, true); + otherTeam->checkValdParSetup(); + otherTeam->apply(true, 0, false); + otherTeam->synchronize(true); + } + else if (oldR) { + t->setRunner(leg, 0, false); + t->synchronize(true); + oldR->setClassId(r->getClassId(), true); + oldR->evaluateCard(true, mp, 0, true); + oldR->synchronize(true); + } + + t->setRunner(leg, r, true); + r->evaluateCard(true, mp, 0, true); + t->checkValdParSetup(); + t->apply(true, 0, false); + t->synchronize(true);*/ + loadPage(gdi); + } +} + +void TabTeam::switchRunners(pTeam t, int leg, pRunner r, pRunner oldR) { + vector mp; + + if (r->getTeam()) { + pTeam otherTeam = r->getTeam(); + int otherLeg = r->getLegNumber(); + otherTeam->setRunner(otherLeg, oldR, true); + if (oldR) + oldR->evaluateCard(true, mp, 0, true); + otherTeam->checkValdParSetup(); + otherTeam->apply(true, 0, false); + otherTeam->synchronize(true); + } + else if (oldR) { + t->setRunner(leg, 0, false); + t->synchronize(true); + oldR->setClassId(r->getClassId(), true); + oldR->evaluateCard(true, mp, 0, true); + oldR->synchronize(true); + } + + t->setRunner(leg, r, true); + r->evaluateCard(true, mp, 0, true); + t->checkValdParSetup(); + t->apply(true, 0, false); + t->synchronize(true); +} + +void TabTeam::clearCompetitionData() { + shownRunners = 0; + shownDistinctRunners = 0; + teamId = 0; + inputId = 0; + timeToFill = 0; + currentMode = 0; +} + +bool TabTeam::warnDuplicateCard(gdioutput &gdi, string id, int cno, pRunner r, vector &allRCache) { + pRunner warnCardDupl = 0; + + if (r && !r->getCard()) { + if (allRCache.empty()) // Fill cache if not initialized + oe->getRunners(0, 0, allRCache, false); + + for (size_t k = 0; k < allRCache.size(); k++) { + if (!r->canShareCard(allRCache[k], cno)) { + warnCardDupl = allRCache[k]; + break; + } + } + } + + InputInfo &cardNo = dynamic_cast(gdi.getBaseInfo(id.c_str())); + if (warnCardDupl) { + cardNo.setBgColor(colorLightRed); + gdi.updateToolTip(id, "Brickan används av X.#" + warnCardDupl->getCompleteIdentification()); + cardNo.refresh(); + return warnCardDupl->getTeam() == r->getTeam(); + } + else { + if (cardNo.getBgColor() != colorDefault) { + cardNo.setBgColor(colorDefault); + gdi.updateToolTip(id, ""); + cardNo.refresh(); + } + return false; + } +} diff --git a/code/TabTeam.h b/code/TabTeam.h new file mode 100644 index 0000000..4d6bcfa --- /dev/null +++ b/code/TabTeam.h @@ -0,0 +1,93 @@ +#pragma once +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ +#include "tabbase.h" + +struct TeamLineup; + +class TabTeam : + public TabBase +{ +private: + bool save(gdioutput &gdi, bool dontReloadTeams); + + string lastSearchExpr; + stdext::hash_set lastFilter; + DWORD timeToFill; + int inputId; + int searchCB(gdioutput &gdi, int type, void *data); + + int teamId; + int classId; + void selectTeam(gdioutput &gdi, pTeam t); + void updateTeamStatus(gdioutput &gdi, pTeam t); + void loadTeamMembers(gdioutput &gdi, int ClassId, + int ClubId, pTeam t); + + int shownRunners; + int shownDistinctRunners; + const string &getSearchString() const; + + void fillTeamList(gdioutput &gdi); + void addToolbar(gdioutput &gdi) const; + + int currentMode; + + void showTeamImport(gdioutput &gdi); + void doTeamImport(gdioutput &gdi); + void saveTeamImport(gdioutput &gdi, bool useExisting); + void showAddTeamMembers(gdioutput &gdi); + void doAddTeamMembers(gdioutput &gdi); + + void showRunners(gdioutput &gdi, const char *title, + const set< pair > &rToList, + int limitX, set &usedR); + + + void processChangeRunner(gdioutput &gdi, pTeam t, int leg, pRunner r); + + pRunner findRunner(const string &name, int cardNo) const; + vector teamLineup; + + // Returns true if the warning concerns the same team + bool warnDuplicateCard(gdioutput &gdi, string id, int cno, pRunner r, vector &allRCache); + + void switchRunners(pTeam team, int leg, pRunner r, pRunner oldR); + + +protected: + void clearCompetitionData(); + +public: + + const char * getTypeStr() const {return "TTeamTab";} + TabType getType() const {return TTeamTab;} + + int teamCB(gdioutput &gdi, int type, void *data); + + bool loadPage(gdioutput &gdi, int id); + bool loadPage(gdioutput &gdi); + TabTeam(oEvent *oe); + ~TabTeam(void); + friend int teamSearchCB(gdioutput *gdi, int type, void *data); + +}; diff --git a/code/Table.cpp b/code/Table.cpp new file mode 100644 index 0000000..84928a7 --- /dev/null +++ b/code/Table.cpp @@ -0,0 +1,2316 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" +#include "Table.h" +#include "gdioutput.h" +#include "meos_util.h" +#include +#include +#include +#include "oEvent.h" +#include "localizer.h" +#include +#include "gdiconstants.h" +#include "meosexception.h" +#include "recorder.h" + +extern HINSTANCE hInst; +const char *tId="_TABLE_SEL"; + +const Table *TableSortIndex::table = 0; + +int Table::uniqueId = 1; + +Table::Table(oEvent *oe_, int rowH, + const string &name, const string &iName) +{ + id = uniqueId++; + commandLock = false; + oe=oe_; + tableName=name; + internalName = iName; + nTitles=0; + PrevSort=-1; + baseRowHeight=rowH; + rowHeight = 0; + highRow=-1; + highCol=-1; + colSelected=-1; + + editRow=-1; + editCol=-1; + drawFilterLabel=false; + currentSortColumn=-1; + hEdit=0; + + hdcCompatible=0; + hbmStored=0; + + hdcCompatibleCell = 0; + hbmStoredCell = 0; + partialCell = false; + + startSelect = false; + ownerCounter = 0; + clearCellSelection(0); + tableProp = -1; + dataPointer = -1; + + clearOnHide = true; + doAutoSelectColumns = true; + + generator = 0; + generatorPtr = 0; +} + +Table::~Table(void) +{ + assert(ownerCounter == 0); + if (hEdit) + DestroyWindow(hEdit); +} + + +void Table::releaseOwnership() { + ownerCounter--; + if (ownerCounter == 0) + delete this; +} + +void Table::clearCellSelection(gdioutput *gdi) { + upperRow = -1; + lowerRow = -1; + upperCol = -1; + lowerCol = -1; + if (gdi) { + HDC hDC = GetDC(gdi->getTarget()); + clearSelectionBitmap(gdi, hDC); + ReleaseDC(gdi->getTarget(), hDC); + } +} + +int Table::addColumn(const string &Title, int width, bool isnum, bool formatRight) { + ColInfo ri; + strcpy_s(ri.name, lang.tl(Title).c_str()); + ri.baseWidth = width; + ri.width = 0; + ri.padWidthZeroSort = 0; + ri.isnumeric = isnum; + ri.formatRight = formatRight; + Titles.push_back(ri); + columns.push_back(nTitles); + nTitles++; + return Titles.size()-1; +} + +int Table::addColumnPaddedSort(const string &title, int width, int padding, bool formatRight) { + ColInfo ri; + strcpy_s(ri.name, lang.tl(title).c_str()); + ri.baseWidth = width; + ri.width = 0; + ri.padWidthZeroSort = padding; + ri.isnumeric = false; + ri.formatRight = formatRight; + Titles.push_back(ri); + columns.push_back(nTitles); + nTitles++; + return Titles.size()-1; +} + + +void Table::moveColumn(int src, int target) +{ + if (src==target) + return; + + vector::iterator it_s=find(columns.begin(), columns.end(), src); + vector::iterator it_t=find(columns.begin(), columns.end(), target); + + if (it_s!=columns.end()) { + + if (it_s0 && idToRow.lookup(rowId, ix)) { + dataPointer = ix; + return; + } + + TableRow tr(nTitles, object); + tr.height=rowHeight; + tr.id = rowId; + TableSortIndex tsi; + + if (Data.empty()) { + sortIndex.clear(); + tsi.index=0; + sortIndex.push_back(tsi); + tsi.index=1; + sortIndex.push_back(tsi); + + tsi.index=2; + Data.resize(2, tr); + + for (unsigned i=0;i0) + idToRow[rowId]=Data.size(); + + dataPointer = Data.size(); + sortIndex.push_back(tsi); + Data.push_back(tr); +} + +void Table::set(int column, oBase &owner, int id, const string &data, bool canEdit, CellType type) +{ + if (dataPointer >= Data.size() || dataPointer<2) + throw std::exception("Internal table error: wrong data pointer"); + + TableRow &row=Data[dataPointer]; + TableCell &cell=row.cells[column]; + cell.contents=data; + cell.owner=&owner; + cell.id=id; + cell.canEdit=canEdit; + cell.type=type; +} + +void Table::filter(int col, const string &filt, bool forceFilter) +{ + const string &oldFilter=Titles[col].filter; + vector baseIndex; + + if (filt==oldFilter && (!forceFilter || filt.empty())) + return; + else if (strncmp(oldFilter.c_str(), filt.c_str(), oldFilter.length())==0) { + //Filter more... + baseIndex.resize(2); + baseIndex[0]=sortIndex[0]; + baseIndex[1]=sortIndex[1]; + swap(baseIndex, sortIndex); + Titles[col].filter=filt; + } + else { + //Filter less -> refilter all! + Titles[col].filter=filt; + sortIndex.resize(Data.size()); + for (size_t k=0; k '9')) + i++; + + int key = atoi(str + i); + Data[sortIndex[k].index].intKey = key; + if (key == 0) + Data[sortIndex[k].index].key = Data[sortIndex[k].index].cells[col].contents; + } + + if (hasDeci) { // Times etc. + for(size_t k=2; k '9')) + i++; + + int key = 0; + + while (str[i] >= '0' && str[i] <= '9') { + key = key * 10 + (str[i] - '0'); + i++; + } + + if (str[i] == ':' || str[i]==',' || str[i] == '.' || (str[i] == '-' && key != 0)) { + bool valid = true; + for (int j = 1; j <= 4; j++) { + if (valid && str[i+j] >= '0' && str[i+j] <= '9') + key = key * 10 + (str[i+j] - '0'); + else { + key *= 10; + valid = false; + } + } + } + else { + key *= 10000; + } + + Data[sortIndex[k].index].intKey = key; + if (key == 0) + Data[sortIndex[k].index].key = Data[sortIndex[k].index].cells[col].contents; + } + } + } + else { + if (Titles[col].padWidthZeroSort) { + for (size_t k=2; k 1) { + intKey |= unsigned(strBuff[1])<<8; + intKey |= unsigned(strBuff[2]); + } + } + } + else { + for (size_t k=2; k 1) { + intKey |= unsigned(strBuff[1])<<8; + intKey |= unsigned(strBuff[2]); + } + } + else { + intKey = 0xFEFEFEFE; + } + } + } + } + assert(TableSortIndex::table == 0); + TableSortIndex::table = this; + //DWORD sStart = GetTickCount(); + std::stable_sort(sortIndex.begin()+2, sortIndex.end()); + //DWORD sEnd = GetTickCount(); + //string st = itos(sEnd-sStart); + TableSortIndex::table = 0; + PrevSort=col; + + if (reverse) + std::reverse(sortIndex.begin()+2, sortIndex.end()); + } + else { + std::reverse(sortIndex.begin()+2, sortIndex.end()); + + if (PrevSort==col) + PrevSort=-(10+col); + else + PrevSort=col; + } +} + +int TablesCB(gdioutput *gdi, int type, void *data) +{ + if (type!=GUI_LINK || gdi->Tables.empty()) + return 0; + + TableInfo &tai=gdi->Tables.front(); + Table *t=tai.table; + + TextInfo *ti=(TextInfo *)data; + + + if (ti->id.substr(0,4)=="sort"){ + int col=atoi(ti->id.substr(4).c_str()); + t->sort(col); + } + + gdi->refresh(); + //gdi->Restore(); + //t->Render(*gdi); +//*/ + return 0; +} + +void Table::getDimension(gdioutput &gdi, int &dx, int &dy, bool filteredResult) const +{ + rowHeight = gdi.scaleLength(baseRowHeight); + + if (filteredResult) + dy = rowHeight * (1+sortIndex.size()); + else + dy = rowHeight * (1+max(2,Data.size())); + + dx=1; + for(size_t i=0;i=rc.right || yrc.bottom) + row=-1; + + bool ret = false; + + if (startSelect) { + int c = getColumn(x, true); + if (c != -1) + upperCol = c; + c = getRow(y, true); + if (c != -1 && c>=0) { + upperRow = max(c, 2); + } + + HDC hDC=GetDC(hWnd); + if (unsigned(highRow)=0 && col>=0) { + POINT pt = {x, y}; + ClientToScreen(hWnd, &pt); + HWND hUnder = WindowFromPoint(pt); + + if (hUnder == hWnd) { + //int index=sortIndex[row].index; + TableRow &trow=Data[row]; + TableCell &cell=trow.cells[col]; + + if (highRow!=row || highCol!=col) { + + HDC hDC=GetDC(hWnd); + + if (unsigned(highRow)= 2) { + DWORD c; + if (cell.canEdit) + c=RGB(240, 240, 150); + else + c=RGB(240, 200, 140); + + highlightCell(hDC, gdi, cell, c, 0,0); + } + + ReleaseDC(hWnd, hDC); + SetCapture(hWnd); + highCol=col; + highRow=row; + } + ret = true; + } + } + + if (ret) + return true; + + if (unsigned(highRow)(data); + Table &t = gdi->getTable(); + t.selection(*gdi, lbi.text, lbi.data); + } + return 0; +} + +void Table::selection(gdioutput &gdi, const string &text, int data) { + if (size_t(selectionRow) >= Data.size() || size_t(selectionCol) >= Titles.size()) + throw std::exception("Index out of bounds."); + + TableCell &cell = Data[selectionRow].cells[selectionCol]; + int id = Data[selectionRow].id; + string output = cell.contents; + cell.owner->inputData(cell.id, text, data, output, false); + cell.contents = output; + reloadRow(id); + RECT rc; + getRowRect(selectionRow, rc); + InvalidateRect(gdi.getTarget(), &rc, false); +} + +#ifndef MEOSDB + +bool Table::keyCommand(gdioutput &gdi, KeyCommandCode code) { + if (commandLock) + return false; + commandLock = true; + + try { + if (code == KC_COPY) + exportClipboard(gdi); + else if (code == KC_PASTE) { + importClipboard(gdi); + }else if (code == KC_DELETE) { + deleteSelection(gdi); + } + else if (code == KC_REFRESH) { + gdi.setWaitCursor(true); + update(); + autoAdjust(gdi); + gdi.refresh(); + } + else if (code == KC_INSERT) { + insertRow(gdi); + gdi.refresh(); + } + else if (code == KC_PRINT) { + gdioutput gdiPrint("temp", gdi.getScale(), gdi.getEncoding()); + gdiPrint.clearPage(false); + gdiPrint.print(getEvent(), this); + } + } + catch (...) { + commandLock = false; + throw; + } + + commandLock = false; + return false; +} + +#endif + +bool Table::deleteSelection(gdioutput &gdi) { + int r1, r2; + getRowRange(r1, r2); + if (r1 != -1 && r2 != -1 && r1<=r2) { + if (!gdi.ask("Vill du radera X rader från tabellen?#" + itos(r2-r1+1))) + return false; + gdi.setWaitCursor(true); + int failed = deleteRows(r1, r2); + gdi.refresh(); + gdi.setWaitCursor(false); + if (failed > 0) + gdi.alert("X rader kunde inte raderas.#" + itos(failed)); + } + return true; +} + +void Table::hide(gdioutput &gdi) { + try { + destroyEditControl(gdi); + } + catch (std::exception &ex) { + gdi.alert(ex.what()); + } + + clearCellSelection(0); + ReleaseCapture(); + if (clearOnHide) { + Data.clear(); + sortIndex.clear(); + idToRow.clear(); + clear(); + } +} + +void Table::clear() { + Data.clear(); + sortIndex.clear(); + idToRow.clear(); +} + +bool Table::destroyEditControl(gdioutput &gdi) { + colSelected=-1; + + if (hEdit) { + try { + if (!enter(gdi)) + return false; + } + catch (std::exception &) { + if (hEdit) { + DestroyWindow(hEdit); + hEdit=0; + } + throw; + } + if (hEdit) { + DestroyWindow(hEdit); + hEdit=0; + } + } + gdi.removeControl(tId); + + if (drawFilterLabel) { + drawFilterLabel=false; + gdi.refresh(); + } + + return true; +} + +bool Table::mouseLeftDown(gdioutput &gdi, int x, int y) { + partialCell = true; + clearCellSelection(&gdi); + + if (!destroyEditControl(gdi)) + return false; + + if (highRow==0) { + colSelected=highCol; + startX=x; + startY=y; + //sort(highCol); + //gdi.refresh(); + //mouseMove(gdi, x, y); + } + else if (highRow==1) { + //filter(highCol, "lots"); + RECT rc=Data[1].cells[columns[0]].absPos; + //rc.right=rc.left+tableWidth; + editRow=highRow; + editCol=highCol; + + hEdit=CreateWindowEx(0, "EDIT", Titles[highCol].filter.c_str(), + WS_TABSTOP|WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL|WS_BORDER, + rc.left+105, rc.top, tableWidth-105, (rc.bottom-rc.top-1), gdi.getTarget(), + 0, hInst, 0); + drawFilterLabel=true; + SendMessage(hEdit, EM_SETSEL, 0, -1); + SetFocus(hEdit); + SendMessage(hEdit, WM_SETFONT, (WPARAM) gdi.getGUIFont(), 0); + gdi.refresh(); + } + else { + SetFocus(gdi.getHWND()); + SetCapture(gdi.getTarget()); + lowerCol = getColumn(x); + lowerRow = getRow(y); + startSelect = true; + } + return false; +} + +bool Table::mouseLeftDblClick(gdioutput &gdi, int x, int y) +{ + clearCellSelection(&gdi); + + if (!destroyEditControl(gdi)) + return false; + + if (unsigned(highRow)>=Data.size() || unsigned(highCol)>=Titles.size()) { + return false; + } + + + if (highRow != 0 && highRow != 1) { + if (editCell(gdi, highRow, highCol)) + return true; + } + return false; +} + +bool Table::editCell(gdioutput &gdi, int row, int col) { + TableCell &cell = Data[row].cells[col]; + + if (cell.type == cellAction) { + ReleaseCapture(); + gdi.makeEvent("CellAction", internalName, cell.id, cell.owner ? cell.owner->getId() : 0, false); + return true; + } + + if (!cell.canEdit) { + MessageBeep(-1); + return true; + } + ReleaseCapture(); + + editRow = row; + editCol = col; + + RECT &rc=cell.absPos; + + if (cell.type == cellSelection || cell.type == cellCombo) { + selectionRow = row; + selectionCol = col; + + vector< pair > out; + size_t selected = 0; + cell.owner->fillInput(cell.id, out, selected); + + int width = 40; + for (size_t k = 0; k(width, 8*out[k].first.length()); + + if (cell.type == cellSelection) { + gdi.addSelection(rc.left+gdi.OffsetX, rc.top+gdi.OffsetY, tId, + max(int((rc.right-rc.left+1)/gdi.scale), width), (rc.bottom-rc.top)*10, + tblSelectionCB).setExtra(id); + } + else { + gdi.addCombo(rc.left+gdi.OffsetX, rc.top+gdi.OffsetY, tId, + max(int((rc.right-rc.left+1)/gdi.scale), width), (rc.bottom-rc.top)*10, + tblSelectionCB).setExtra(id); + } + gdi.addItem(tId, out); + gdi.selectItemByData(tId, selected); + return true; + } + else if (cell.type==cellEdit) { + hEdit=CreateWindowEx(0, "EDIT", cell.contents.c_str(), + WS_TABSTOP|WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL|WS_BORDER, + rc.left, rc.top, rc.right-rc.left+1, (rc.bottom-rc.top), gdi.getTarget(), + 0, hInst, 0); + SendMessage(hEdit, EM_SETSEL, 0, -1); + SetFocus(hEdit); + SendMessage(hEdit, WM_SETFONT, (WPARAM) gdi.getGUIFont(), 0); + return true; + } + + return false; +} + +RGBQUAD RGBA(BYTE r, BYTE g, BYTE b, BYTE a) { + RGBQUAD q = {b,g,r,a}; + return q; +} + +RGBQUAD RGBA(DWORD c) { + RGBQUAD q = {GetBValue(c),GetGValue(c),GetRValue(c),0}; + return q; +} + +RGBQUAD transform(RGBQUAD src, double scale) { + src.rgbRed = BYTE(min(src.rgbRed * scale, 255.0)); + src.rgbGreen = BYTE(min(src.rgbGreen * scale, 255.0)); + src.rgbBlue = BYTE(min(src.rgbBlue * scale, 255.0)); + return src; +} + +void gradRect(HDC hDC, int left, int top, int right, int bottom, + bool horizontal, RGBQUAD c1, RGBQUAD c2) { + + TRIVERTEX vert[2]; + vert [0] .x = left; + vert [0] .y = top; + vert [0] .Red = 0xff00 & (DWORD(c1.rgbRed)<<8); + vert [0] .Green = 0xff00 & (DWORD(c1.rgbGreen)<<8); + vert [0] .Blue = 0xff00 & (DWORD(c1.rgbBlue)<<8); + vert [0] .Alpha = 0xff00 & (DWORD(c1.rgbReserved)<<8); + + vert [1] .x = right; + vert [1] .y = bottom; + vert [1] .Red = 0xff00 & (DWORD(c2.rgbRed)<<8); + vert [1] .Green = 0xff00 & (DWORD(c2.rgbGreen)<<8); + vert [1] .Blue = 0xff00 & (DWORD(c2.rgbBlue)<<8); + vert [1] .Alpha = 0xff00 & (DWORD(c2.rgbReserved)<<8); + + GRADIENT_RECT gr[1]; + gr[0].UpperLeft=0; + gr[0].LowerRight=1; + + if (horizontal) + GradientFill(hDC,vert, 2, gr, 1,GRADIENT_FILL_RECT_H); + else + GradientFill(hDC,vert, 2, gr, 1,GRADIENT_FILL_RECT_V); +} + +void Table::initEmpty() { + if (Data.empty()) { + addRow(0,0); + Data.resize(2, TableRow(nTitles,0)); + sortIndex.resize(2); + } +} + +void drawSymbol(gdioutput &gdi, HDC hDC, int height, + const TextInfo &ti, const string &symbol, bool highLight) { + int cx = ti.xp - gdi.GetOffsetX() + ti.xlimit/2; + int cy = ti.yp - gdi.GetOffsetY() + height/2 - 2; + int h = int(height * 0.4); + int w = h/3; + h-=2; + + RGBQUAD a,b; + if (highLight) { + a = RGBA(32, 114, 14, 0); + b = RGBA(64, 211, 44, 0); + } + else { + a = RGBA(32, 114, 114, 0); + b = RGBA(84, 231, 64, 0); + } + gradRect(hDC, cx-w, cy-h, cx+w, cy+h, false, a, b); + gradRect(hDC, cx-h, cy-w, cx+h, cy+w, false, a, b); + + POINT pt; + MoveToEx(hDC, cx-w, cy-h, &pt); + SelectObject(hDC, GetStockObject(DC_PEN)); + SetDCPenColor(hDC, RGB(14, 80, 7)); + LineTo(hDC, cx+w, cy-h); + LineTo(hDC, cx+w, cy-w); + LineTo(hDC, cx+h, cy-w); + LineTo(hDC, cx+h, cy+w); + LineTo(hDC, cx+w, cy+w); + LineTo(hDC, cx+w, cy+h); + LineTo(hDC, cx-w, cy+h); + LineTo(hDC, cx-w, cy+w); + LineTo(hDC, cx-h, cy+w); + LineTo(hDC, cx-h, cy-w); + LineTo(hDC, cx-w, cy-w); + LineTo(hDC, cx-w, cy-h); +} + + +void Table::highlightCell(HDC hDC, gdioutput &gdi, const TableCell &cell, DWORD color, int dx, int dy) +{ + SelectObject(hDC, GetStockObject(DC_BRUSH)); + SelectObject(hDC, GetStockObject(NULL_PEN)); + + SetDCBrushColor(hDC, color); + + RECT rc=cell.absPos; + rc.left+=dx; + rc.right+=dx; + rc.top+=dy; + rc.bottom+=dy; + + Rectangle(hDC, rc.left+1, rc.top, + rc.right+2, rc.bottom); + + TextInfo ti; + + if (cell.type == cellAction && cell.contents[0] == '@') { + ti.xp = rc.left + gdi.OffsetX; + ti.yp = rc.top + gdi.OffsetY; + ti.xlimit = rc.right - rc.left; + + drawSymbol(gdi, hDC, rowHeight, ti, cell.contents, true); + //SetDCPenColor(hDC, RGB(190,190,190)); + } + else { + gdi.formatString(ti, hDC); + SetBkMode(hDC, TRANSPARENT); + rc.left+=4; + rc.top+=2; + DrawText(hDC, cell.contents.c_str(), -1, &rc, DT_LEFT|DT_NOPREFIX); + } +} + +void Table::draw(gdioutput &gdi, HDC hDC, int dx, int dy, const RECT &screen) +{ + gdi.resetLast(); + initEmpty(); + updateDimension(gdi); + + table_xp=dx-gdi.OffsetX; + table_yp=dy-gdi.OffsetY; + + if (currentSortColumn==-1) + sort(0); + + int wi, he; + getDimension(gdi, wi, he, true); + + tableWidth=wi; + tableHeight=he; + + //Find first and last row + int yreltop=(screen.top-(dy-gdi.OffsetY)-rowHeight+1)/rowHeight; + int yrelbottom=(screen.bottom-(dy-gdi.OffsetY)-1)/rowHeight; + + int firstRow=max(yreltop,0); + int lastRow=min(yrelbottom, int(sortIndex.size())); + + int firstCol=0; + int lastCol=columns.size(); + + xpos.resize(columns.size()+1); + + xpos[0]=dx-gdi.OffsetX; + for (size_t i=1;i<=columns.size();i++) + xpos[i]=xpos[i-1]+Titles[columns[i-1]].width+1; + + //Find first and last visible column + while(firstCol0 && xpos[lastCol-1]>screen.right) + lastCol--; + + SelectObject(hDC, GetStockObject(DC_BRUSH)); + SelectObject(hDC, GetStockObject(DC_PEN)); + + SetDCPenColor(hDC, RGB(190,190,190)); + SetDCBrushColor(hDC, RGB(60,25,150)); + + //Title + TextInfo ti; + gdi.formatString(ti, hDC); + HLS hls; + hls.RGBtoHLS(GetSysColor(COLOR_ACTIVECAPTION)); + hls.lighten(2); + hls.saturation = min(90,hls.saturation); + DWORD lightColor = hls.HLStoRGB(); + + if (firstRow==0 && lastRow>=0) { + //Rectangle(hDC, dx-gdi.OffsetX, dy-gdi.OffsetY, + // dx+tableWidth-gdi.OffsetX, dy+rowHeight-gdi.OffsetY); + RGBQUAD c1 = RGBA(GetSysColor(COLOR_ACTIVECAPTION)); + gradRect(hDC, dx-gdi.OffsetX, dy-gdi.OffsetY, + dx+tableWidth-gdi.OffsetX, dy+rowHeight-gdi.OffsetY, false, + c1, transform(c1, 0.7)); + + RECT rc; + rc.left=dx+5-gdi.OffsetX; + rc.right=rc.left+gdi.scaleLength(150); + rc.top=dy+3-gdi.OffsetY; + rc.bottom=rc.top+rowHeight; + ti.format = 1; + gdi.formatString(ti, hDC); + SetTextColor(hDC, RGB(255,255,255)); + DrawText(hDC, lang.tl(tableName).c_str(), -1, &rc, DT_LEFT|DT_NOPREFIX); + DrawText(hDC, lang.tl(tableName).c_str(), -1, &rc, DT_CALCRECT|DT_NOPREFIX); + ti.format = 0; + gdi.formatString(ti, hDC); + SetTextColor(hDC, RGB(255,255,255)); + char bf[256]; + string info = lang.tl(string("sortering: X, antal rader: Y#") + Titles[currentSortColumn].name + "#" + itos(sortIndex.size()-2)); + //sprintf_s(bf, .c_str(), + // Titles[currentSortColumn].name, int(sortIndex.size())-2); + rc.left=rc.right+30; + rc.right=dx + tableWidth - gdi.OffsetX - 10; + DrawText(hDC, info.c_str(), info.length(), &rc, DT_LEFT|DT_NOPREFIX); + + SetTextColor(hDC, RGB(0,0,0)); + + if (drawFilterLabel) { + SetDCBrushColor(hDC, RGB(100,200,100)); + + Rectangle(hDC, dx-gdi.OffsetX, dy+2*rowHeight-gdi.OffsetY, + dx+tableWidth-gdi.OffsetX, dy+3*rowHeight-gdi.OffsetY); + + rc.left=dx+5-gdi.OffsetX; + rc.right=rc.left+100; + rc.top=dy+3+2*rowHeight-gdi.OffsetY; + rc.bottom=rc.top+rowHeight; + char tbf[2]; + tbf[0]=Titles[editCol].name[0]; + tbf[1]=0; + CharLower(tbf); + string filter = lang.tl("Urval %c%s:")+" "; + sprintf_s(bf, filter.c_str(), tbf[0], + Titles[editCol].name+1, int(sortIndex.size())-2); + + DrawText(hDC, bf, -1, &rc, DT_RIGHT|DT_NOPREFIX); + } + } + + int yp; + yp=dy+rowHeight; + + if (firstRow<=2 && lastRow>=1) { + string filterText = lang.tl("Urval..."); + + for (int k=firstCol;k(lastRow + margin, sortIndex.size()); + for (int k1 = rStart; k1 < rEnd; k1++){ + int yp = dy + rowHeight*(k1+1); + TableRow &tr = Data[sortIndex[k1].index]; + for(size_t k=0;k= sortIndex.size()) + throw std::exception("Index out of range"); + const TableRow &tr = Data[sortIndex[row].index]; + + if ( size_t(col) >= columns.size()) + throw std::exception("Index out of range"); + + col = columns[col]; + return *((TableCell *)&tr.cells[col]); +} + +void Table::clearSelectionBitmap(gdioutput *gdi, HDC hDC) +{ + if (gdi) + restoreSelection(*gdi, hDC); + + if (hdcCompatibleCell) { + DeleteDC(hdcCompatibleCell); + hdcCompatibleCell = 0; + } + + if (hbmStoredCell) { + DeleteObject(hbmStoredCell); + hbmStoredCell = 0; + } +} + +void Table::restoreSelection(gdioutput &gdi, HDC hDC) { + if (partialCell) { + RECT rc = lastCell; + rc.left -= gdi.OffsetX; + rc.right -= gdi.OffsetX; + rc.top -= gdi.OffsetY; + rc.bottom -= gdi.OffsetY; + InvalidateRect(gdi.getTarget(), &rc, false); + partialCell = false; + } + else if (hdcCompatibleCell) { + //Restore bitmap + int cx = lastCell.right - lastCell.left + 1; + int cy = lastCell.bottom - lastCell.top + 1; + int x = lastCell.left - 1 - gdi.OffsetX; + int y = lastCell.top - 1 - gdi.OffsetY; + BitBlt(hDC, x, y, cx, cy, hdcCompatibleCell, 0, 0, SRCCOPY); + } +} + +void Table::drawSelection(gdioutput &gdi, HDC hDC, bool forceDraw) { + bool modified = false; + if (lowerColOld != lowerCol || upperCol != upperColOld || + lowerRow != lowerRowOld || upperRow != upperRowOld) { + modified = true; + restoreSelection(gdi, hDC); + } + + if (lowerCol != -1 && upperCol != -1 && + lowerRow != -1 && upperRow != -1 && + (forceDraw || modified)) { + TableCell &c1 = Data[lowerRow].cells[lowerCol]; + TableCell &c2 = Data[upperRow].cells[upperCol]; + RECT rc; + rc.top = min(c1.absPos.top, c2.absPos.top) + gdi.OffsetY; + rc.left = min(c1.absPos.left, c2.absPos.left) + gdi.OffsetX; + rc.right = max(c1.absPos.right, c2.absPos.right) + 1 + gdi.OffsetX; + rc.bottom = max(c1.absPos.bottom, c2.absPos.bottom) + gdi.OffsetY; + + if (modified) { + int cx=rc.right-rc.left + 1; + int cy=rc.bottom-rc.top + 1; + + clearSelectionBitmap(&gdi, hDC); + + lastCell = rc; + int x = lastCell.left - 1 - gdi.OffsetX; + int y = lastCell.top - 1 - gdi.OffsetY; + int maxX, maxY; + gdi.getTargetDimension(maxX, maxY); + + if (x<=0 || y<=0 || (x+cx)>=maxX || (y+cy)>=maxY) { + partialCell = true; + } + else { + hdcCompatibleCell = CreateCompatibleDC(hDC); + hbmStoredCell = CreateCompatibleBitmap(hDC, cx, cy); + + // Select the bitmaps into the compatible DC. + SelectObject(hdcCompatibleCell, hbmStoredCell); + BitBlt(hdcCompatibleCell, 0, 0, cx, cy, hDC, x, y, SRCCOPY); + partialCell = false; + } + } + + SelectObject(hDC, GetStockObject(NULL_BRUSH)); + SelectObject(hDC, GetStockObject(DC_PEN)); + SetDCPenColor(hDC, RGB(0,0, 128)); + Rectangle(hDC, rc.left - gdi.OffsetX, rc.top - gdi.OffsetY, + rc.right - gdi.OffsetX, rc.bottom - gdi.OffsetY); + + lowerColOld = lowerCol; + upperColOld = upperCol; + lowerRowOld = lowerRow; + upperRowOld = upperRow; + } +} + +void Table::scrollToCell(gdioutput &gdi, int row, int col) { + if (size_t(row) >= Data.size() || size_t(col) >= Data[row].cells.size()) + return; + const RECT &rc = Data[row].cells[col].absPos; + int maxX, maxY; + gdi.getTargetDimension(maxX, maxY); + int xo = gdi.OffsetX; + int yo = gdi.OffsetY; + if (rc.right > maxX) { + xo = gdi.OffsetX + (rc.right - maxX) + 10; + } + else if (rc.left < 0) { + xo = gdi.OffsetX + rc.left - 10; + } + + if (rc.bottom > maxY) { + yo = gdi.OffsetY + (rc.bottom - maxY) + 10; + } + else if (rc.top < 0) { + yo = gdi.OffsetY + rc.top - 10; + } + + if (xo != gdi.OffsetX || yo != gdi.OffsetY) { + gdi.setOffset(xo, yo, true); + //gdi.refreshFast(); + //Sleep(300); + } +} + +void Table::print(gdioutput &gdi, HDC hDC, int dx, int dy) +{ + vector widths(columns.size()); + vector skip(columns.size(), true); + int rh = 0; + + for (size_t j=0;j(widths[j], ti.textRect.right-ti.textRect.left); + rh = max(rh, ti.textRect.bottom-ti.textRect.top); + } + const int extra = 10; + + for (size_t j=0;j(widths[j], + int(1.1*(ti.textRect.right-ti.textRect.left)+extra)); + rh = max(rh, ti.textRect.bottom-ti.textRect.top); + } + } + } + + rh = int(rh*1.3); + vector adj_xp(columns.size()); + int w = widths[0]; + for (size_t j=1;j= Data.size() || size_t(editCol) >= Data[editRow].cells.size()) + throw std::exception("Index out of bounds"); + + string output; + TableCell &cell=Data[editRow].cells[editCol]; + cell.owner->inputData(cell.id, bf, 0, output, false); + cell.contents=output; + if (hEdit != 0) + DestroyWindow(hEdit); + hEdit=0; + reloadRow(Data[editRow].id); + RECT rc; + getRowRect(editRow, rc); + InvalidateRect(gdi.getTarget(), &rc, false); +} + +const string &Table::getTableText(gdioutput &gdi, int editRow, int editCol) { + if (size_t(editRow) >= Data.size() || size_t(editCol) >= Data[editRow].cells.size()) + throw std::exception("Index out of bounds"); + + string output; + TableCell &cell=Data[editRow].cells[editCol]; + + return cell.contents; +} + + +bool Table::enter(gdioutput &gdi) +{ + if (hEdit) { + if (unsigned(editRow)=2) { + + { + string cmd; + if (gdi.getRecorder().recording()) + cmd = "setTableText(" + itos(editRow) + ", " + itos(editCol) + ", \"" + string(bf) + "\");"; + setTableText(gdi, editRow, editCol, bf); + gdi.getRecorder().record(cmd); + return true; + }/* + catch(const std::exception &ex) { + string msg(ex.what()); + gdi.alert(msg); + }*/ + } + else if (editRow==1) {//Filter + filter(editCol, bf); + DestroyWindow(hEdit); + hEdit=0; + drawFilterLabel = false; + gdi.refresh(); + return true; + } + } + } + else if (gdi.hasField(tId)) { + ListBoxInfo lbi; + gdi.getSelectedItem(tId, lbi); + + if (lbi.isCombo()) { + if (size_t(selectionRow) < Data.size() && size_t(selectionCol) < Titles.size()) { + selection(gdi, lbi.text, lbi.data); + } + } + } + return false; +} + +void Table::escape(gdioutput &gdi) +{ + if (hEdit) { + DestroyWindow(hEdit); + hEdit = 0; + } + gdi.removeControl(tId); + drawFilterLabel=false; + gdi.refresh(); +} + +bool Table::inputChange(gdioutput &gdi, HWND hdt) +{ + if (hEdit==hdt) { + + if (drawFilterLabel) { + char bf[256]; + GetWindowText(hEdit, bf, 256); + filter(editCol, bf); + updateDimension(gdi); + gdi.refresh(); + } + + return true; + } + return false; +} + +int Table::getColumn(int x, bool limit) const +{ + if (columns.empty()) + return -1; + + if (x=int(sortIndex.size())) + r = sortIndex.size() - 1; + } + if (r>=0 && r= int(Data.size())) + throw std::exception("Index out of bounds."); + + TableRow &row=Data[index]; + oBase *obj = row.getObject(); + if (obj) { + TableUpdateInfo tui; + tui.object = obj; + tui.id = rowId; + oe->generateTableData(internalName, *this, tui); + } +} + +vector Table::getColumns() const +{ + vector cols(Titles.size()); + + // Get selected columns + for (size_t k=0; k &sel) +{ + vector newcols; + + for (size_t k=0; k::const_iterator it = sel.begin(); + + while(it != sel.end()) { + if (count(newcols.begin(), newcols.end(), *it)==0) + newcols.push_back(*it); + ++it; + } + + swap(columns, newcols); + doAutoSelectColumns = false; +} + +void Table::resetColumns() +{ + columns.resize(Titles.size()); + + for (size_t k=0;kgenerateTableData(internalName, *this, tui); + } + else { + generator(*this, generatorPtr); + } + + //Refilter all + for (size_t k=0;k= sortIndex.size()) + throw std::exception("Index out of range"); + const TableRow &tr = Data[sortIndex[k].index]; + html += ""; + for (size_t j = col1; j<= size_t(col2); j++) { + if ( j >= columns.size()) + throw std::exception("Index out of range"); + int col = columns[j]; + const TableCell &cell = tr.cells[col]; + html += "" + cell.contents + ""; + if (j == col1) + txt += cell.contents; + else + txt += "\t" + cell.contents; + } + txt += "\r\n"; + html += ""; + } + + html += ""; +} + +void Table::getRowRange(int &rowLo, int &rowHi) const { + int row1 = -1, row2 = -1; + for (size_t k = 0; k < sortIndex.size(); k++) { + if (upperRow == sortIndex[k].index) + row1 = k; + if (lowerRow == sortIndex[k].index) + row2 = k; + } + rowLo = min(row1, row2); + rowHi = max(row1, row2); +} + +void Table::getColRange(int &colLo, int &colHi) const { + int col1 = -1, col2 = -1; + for (size_t k = 0; k < columns.size(); k++) { + if (upperCol == columns[k]) + col1 = k; + if (lowerCol == columns[k]) + col2 = k; + } + colLo = min(col1, col2); + colHi = max(col1, col2); +} + +void Table::exportClipboard(gdioutput &gdi) +{ + string str;// = "
ab
"; + string txt; + + int col1 = -1, col2 = -1; + getColRange(col1, col2); + /*for (size_t k = 0; k < columns.size(); k++) { + if (upperCol == columns[k]) + col1 = k; + if (lowerCol == columns[k]) + col2 = k; + }*/ + + int row1 = -1, row2 = -1; + getRowRange(row1, row2); + /*for (size_t k = 0; k < sortIndex.size(); k++) { + if (upperRow == sortIndex[k].index) + row1 = k; + if (lowerRow == sortIndex[k].index) + row2 = k; + }*/ + + if (col1 == -1 || col2 == -1 || row1 == -1 || row2 == -1) + return; + + getExportData(min(col1, col2), max(col1, col2), + min(row1, row2), max(row1, row2), str, txt); + + gdi.copyToClipboard(str, true, txt); + + /*if (OpenClipboard(gdi.getHWND()) != false) { + + EmptyClipboard(); + + const char *HTML = str.c_str(); + size_t len = str.length() + 1; + + size_t bsize = len*2; + char *bf = new char[bsize]; + + //Convert to UTF-8 + WORD *wide = new WORD[len]; + MultiByteToWideChar(CP_ACP, 0, HTML, -1, LPWSTR(wide), len);//To Wide + memset(bf, 0, bsize); + WideCharToMultiByte(CP_UTF8, 0, LPCWSTR(wide), -1, bf, bsize, NULL, NULL); + delete[] wide; + + len = strlen(bf) + 1; + + const char cbd[]= + "Version:0.9\n" + "StartHTML:%08u\n" + "EndHTML:%08u\n" + "StartFragment:%08u\n" + "EndFragment:%08u\n"; + + char head[256]; + sprintf_s(head, cbd, 1,0,0,0); + + int offset=strlen(head); + //Fill header with relevant information + int ho_start = offset; + int ho_end = offset + len; + sprintf_s(head, cbd, offset,offset+len,ho_start,ho_end); + + + HANDLE hMem=GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, offset+len); + LPVOID data=GlobalLock(hMem); + + memcpy(LPSTR(data), head, offset); + memcpy(LPSTR(data)+offset, bf, len); + + GlobalUnlock(hMem); + + // Text format + HANDLE hMemText = GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, txt.length()+1); + LPVOID dataText=GlobalLock(hMemText); + memcpy(LPSTR(dataText), txt.c_str() , txt.length()+1); + GlobalUnlock(hMemText); + + + UINT CF_HTML = RegisterClipboardFormat("HTML format"); + + SetClipboardData(CF_HTML, hMem); + SetClipboardData(CF_TEXT, hMemText); + + delete[] bf; + CloseClipboard(); + }*/ +} + + +void Table::importClipboard(gdioutput &gdi) +{ + if (!canPaste()) + throw std::exception("Operationen stöds ej"); + + string str; + if (OpenClipboard(gdi.getHWND()) != false) { + HANDLE data = GetClipboardData(CF_TEXT); + if (data) { + LPVOID lptstr = GlobalLock(data); + if (lptstr) { + str = string(((char*)lptstr)); + GlobalUnlock(data); + } + } + CloseClipboard(); + } + if (!str.empty()) { + // Parse raw data + vector< vector > table(1); + const char *ptr = str.c_str(); + string word; + while (*ptr) { + if (*ptr != '\t' && *ptr != '\r' && *ptr != '\n') { + word.append(ptr, 1); + } + else if (*ptr == '\t') { + table.back().push_back(word); + word.clear(); + } + else if (*ptr == '\n') { + table.back().push_back(word); + table.push_back(vector()); + word.clear(); + } + ++ptr; + } + if (!word.empty()) + table.back().push_back(word); + else if (table.back().empty()) + table.pop_back(); + + if (table.empty()) + return; + + int rowS = 2; + int colS = 0; + + size_t tw = 0; + for (size_t k = 0; k columns.size()) + throw std::exception("Antalet columner i urklippet är större än antalet kolumner i tabellen."); + + if (upperRow == -1) { + if (!gdi.ask("Vill du klistra in X nya rader i tabellen?#"+itos(table.size()))) + return; + rowS = sortIndex.size(); // Add new rows + } + else { + int col1 = -1, col2 = -1; + getColRange(col1, col2); + int row1 = -1, row2 = -1; + getRowRange(row1, row2); + + if ( (row1 + table.size()) > sortIndex.size() ) + throw std::exception("Antalet rader i urklipp får inte plats i selektionen."); + + if ( (col1 + tw) > columns.size() ) + throw std::exception("Antalet kolumner i urklipp får inte plats i selektionen."); + + bool wrongSize = false; + + if (row1 != row2 && (row2 - row1 + 1) != table.size()) + wrongSize = true; + + if (col1 != col2 && (col2 - col1 +1 ) != tw) + wrongSize = true; + + if (wrongSize && !gdi.ask("Selektionens storlek matchar inte urklippets storlek. Klistra in i alla fall?")) + return; + + rowS = row1; + colS = col1; + } + + bool addedRow = false; + + for (size_t k = 0; k sortIndex.size()) { + throw std::exception("Index out of range"); + } + else if ( (rowS + k) == sortIndex.size()) { + // Add data + TableUpdateInfo tui; + tui.doAdd = true; + oe->generateTableData(internalName, *this, tui); + addedRow = true; + //sortIndex.push_back(TableSortIndex(Data.size()-1, "")); + } + + TableRow &tr = Data[sortIndex[rowS + k].index]; + for (size_t j = 0; j= columns.size()) + throw std::exception("Index out of range"); + int col = columns[colS + j]; + + TableCell &cell=tr.cells[col]; + string output; + + size_t index = 0; + + if (cell.type==cellSelection || cell.type==cellCombo) { + vector< pair > out; + size_t selected = 0; + cell.owner->fillInput(cell.id, out, selected); + index = -1; + for (size_t i = 0; iinputData(cell.id, table[k][j], index, output, false); + cell.contents = output; + } + else if (cell.type == cellCombo) { + cell.owner->inputData(cell.id, table[k][j], index, output, false); + cell.contents = output; + } + } + catch(const std::exception &ex) { + string msg(ex.what()); + } + } + } + + if (addedRow) { + TableUpdateInfo tui; + tui.doRefresh = true; + oe->generateTableData(internalName, *this, tui); + + updateDimension(gdi); + int dx,dy; + getDimension(gdi, dx, dy, true); + gdi.scrollTo(0, dy + table_yp + gdi.OffsetY); + } + gdi.refresh(); + } +} + +int Table::deleteRows(int row1, int row2) +{ + if (!canDelete()) + throw std::exception("Operationen stöds ej"); + + int failed = 0; + for (size_t k = row1; k<=size_t(row2); k++) { + if ( k >= sortIndex.size()) + throw std::exception("Index out of range"); + const TableRow &tr = Data[sortIndex[k].index]; + oBase *ob = tr.cells[0].owner; + if (!ob) + throw std::exception("Null pointer exception"); + if (ob->canRemove()) + ob->remove(); + else + failed++; + } + + clearCellSelection(0); + clearSelectionBitmap(0,0); + update(); + return failed; +} + +void Table::insertRow(gdioutput &gdi) { + if (!canInsert()) + throw std::exception("Operationen stöds ej"); + + TableUpdateInfo tui; + tui.doAdd = true; + tui.doRefresh = true; + oe->generateTableData(internalName, *this, tui); + int dx,dy; + updateDimension(gdi); + getDimension(gdi, dx, dy, true); + gdi.scrollTo(0, dy + table_yp + gdi.OffsetY); +} + +void Table::autoAdjust(gdioutput &gdi) { + initEmpty(); + if (Titles.empty()) + return; + HDC hDC = GetDC(gdi.getTarget()); + RECT rc = {0,0,0,0}; + TextInfo ti; + string filterText = lang.tl("Urval..."); + string filterName = lang.tl("Namn"); + ti.format = 0; + gdi.formatString(ti, hDC); + int sum = 0; + for (size_t k = 0; k(1, dsize/1973); + int sameCount = 0; + for (size_t r = 0; r < dsize; r+=sample) { + const TableCell &c = Data[r].cells[k]; + if (r==0 && c.contents == filterName) + w = max(w, 100); + + const string &str = r != 1 ? c.contents : filterText; + int len = str.length(); + if (len == minlen) { + sameCount++; + if (sameCount > 40) + continue; + } + + if (len > minlen - diff) { + sameCount = 0; + if (Titles[k].isnumeric && r>2) + DrawText(hDC, (str + "55").c_str(), len, &rc, DT_CALCRECT|DT_NOPREFIX); + else + DrawText(hDC, str.c_str(), len, &rc, DT_CALCRECT|DT_NOPREFIX); + w = max(w, rc.right - rc.left); + if (r>2) + minlen = max(len, minlen); + } + } + Titles[k].baseWidth = int( (w + 25)/ gdi.getScale()); + } + if (columns.empty()) + columns.push_back(0); + + for (size_t k = 0; k empty(Titles.size(), true); + int nonEmpty = 0; + + // Filter away empty and all-equal columns + for (size_t k = 0; k 2 && Data[2].cells[k].type == cellAction) + nonEmpty++; + empty[k] = false; + } + else { + if (Data[2].cells[k].type == cellAction) { + nonEmpty++; + empty[k] = false; + } + else { + const string &first = Data.size() > 3 ? + Data[2].cells[k].contents : _EmptyString; + + for (size_t r = 2; r 1) { + columns.clear(); + string id = lang.tl("Id"); + string mod = lang.tl("Ändrad"); + for (size_t k = 0; k. + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include +#include +#include +#include "oBase.h" +#include "inthashmap.h" + +#define TableXMargin 40 +#define TableYMargin 30 + +enum CellType {cellEdit, cellSelection, cellAction, cellCombo}; +enum KeyCommandCode; + +class Table; +typedef void (*GENERATETABLEDATA)(Table &table, void *ptr); + + +struct TableUpdateInfo { + bool doAdd; + bool doRefresh; + oBase *object; + int id; + TableUpdateInfo() : doAdd(false), object(0), id(0), doRefresh(false) {} +}; + + +class TableCell +{ + string contents; + RECT absPos; + + DWORD id; + oBase *owner; + bool canEdit; + CellType type; + + friend class TableRow; + friend class Table; + friend int tblSelectionCB(gdioutput *gdi, int type, void *data); +}; + +class TableRow +{ +protected: + string key; + int intKey; + + vector cells; + int id; + + string *SortString; + int sInt; + + int ypos; + int height; + oBase *ob; + +public: + oBase *getObject() const {return ob;} + void setObject(oBase &obj); + bool operator<(const TableRow &r){return *SortString<*r.SortString;} + static bool cmpint(const TableRow &r1, const TableRow &r2) {return r1.sInt Titles; + vector xpos; + unsigned nTitles; + int PrevSort; + mutable int rowHeight; + int baseRowHeight; + vector Data; + size_t dataPointer; // Insertation pointer + vector sortIndex; + vector columns; + inthashmap idToRow; + //highlight + int highRow; + int highCol; + + // Selected columns. For drag/drop and sort + int colSelected; + int startX; + int startY; + + //Edit selection + int editRow; + int editCol; + + // Selected rectangle + int upperRow; + int lowerRow; + int upperCol; + int lowerCol; + + int upperRowOld; + int lowerRowOld; + int upperColOld; + int lowerColOld; + + bool startSelect; + + HWND hEdit; + + //For moving objects + HDC hdcCompatible; + HBITMAP hbmStored; + int lastX; + int lastY; + + // For cell seletion + HDC hdcCompatibleCell; + HBITMAP hbmStoredCell; + RECT lastCell; + bool partialCell; + + //static bool filterMatchString(const string &c, const char *filt); + void highlightCell(HDC hDC, gdioutput &gdi, const TableCell &cell, DWORD color, int dx, int dy); + + void moveCell(HDC hDC, gdioutput &gdi, const TableCell &cell, int dx, int dy); + void startMoveCell(HDC hDC, const TableCell &cell); + void stopMoveCell(HDC hDC, const TableCell &cell, int dx, int dy); + void restoreCell(HDC hDC, const TableCell &cell); + + void moveColumn(int src, int target); + + int tableWidth; + int tableHeight; + bool drawFilterLabel; + int currentSortColumn; + + void initEmpty(); + + int getColumn(int x, bool limit = false) const; + int getRow(int y, bool limit = false) const; + + void redrawCell(gdioutput &gdi, HDC hDC, int c, int r); + + //Draw coordinates + int table_xp; + int table_yp; + + oEvent *oe; + + void clearSelectionBitmap(gdioutput *gdi, HDC hDC); + void restoreSelection(gdioutput &gdi, HDC hDC); + + void drawSelection(gdioutput &gdi, HDC hDC, bool forceDraw); + TableCell &getCell(int row, int col) const; //Index as displayed + void scrollToCell(gdioutput &gdi, int row, int col); + + bool destroyEditControl(gdioutput &gdi); + + void getExportData(int col1, int col2, int row1, int row2, + string &html, string &txt) const; + + // Delete rows in selected range. Return number of rows that could not be removed + int deleteRows(int row1, int row2); + + void getRowRange(int &rowLo, int &rowHi) const; + void getColRange(int &colLo, int &colHi) const; + int ownerCounter; + DWORD tableProp; + + int selectionRow; + int selectionCol; + + void getRowRect(int row, RECT &rc) const; + + bool compareRow(int indexA, int indexB) const; +public: + + void setTableText(gdioutput &gdi, int editRow, int editCol, const string &bf); + const string &getTableText(gdioutput &gdi, int editRow, int editCol); + + int getTableId() const {return id;} + static void resetTableIds() {uniqueId = 1;} + + void setGenerator(GENERATETABLEDATA gen, void *genPtr) { + generatorPtr = genPtr; + generator = gen; + } + + void clear(); + void setClearOnHide(bool coh) {clearOnHide = coh;} + int getNumDataRows() const; + + void clearCellSelection(gdioutput *gdi); + + /// Return translated table name + const string& getTableName() const {return tableName;} + /// Get the internal identifier of the table + const string& getInternalName() const {return internalName;} + + bool hasAutoSelect() const {return doAutoSelectColumns;} + + void updateDimension(gdioutput &gdi); + void selection(gdioutput &gdi, const string &text, int data); + + enum { + CAN_PASTE = 1, + CAN_INSERT = 2, + CAN_DELETE = 4, + }; + + bool canPaste() const {return (tableProp & CAN_PASTE) != 0;} + bool canInsert() const {return (tableProp & CAN_INSERT) != 0;} + bool canDelete() const {return (tableProp & CAN_DELETE) != 0;} + void setTableProp(DWORD w) {tableProp = w;} + + void hide(gdioutput &gdi); //Ensure no edit contol is visible + void addOwnership() {ownerCounter++;} + void releaseOwnership(); + + void autoAdjust(gdioutput &gdi); // Adjust column widths + void autoSelectColumns(); + + void insertRow(gdioutput &gdi); // Insert a new row in the table + bool deleteSelection(gdioutput &gdi); + void setPosition(int x, int y, int maxX, int maxY) {t_xpos = x, t_ypos = y; t_maxX = maxX, t_maxY = maxY;} + void exportClipboard(gdioutput &gdi); + void importClipboard(gdioutput &gdi); + + + bool hasEditControl() {return hEdit!=0;} + + struct ColSelection { + ColSelection() : selected(false), index(0) {} + string name; + bool selected; + int index; + }; + + vector< ColSelection > getColumns() const; + void selectColumns(const set &sel); + + oEvent *getEvent() const {return oe;} + void getDimension(gdioutput &gdi, int &dx, int &dy, bool filteredResult) const; + void draw(gdioutput &gdi, HDC hDC, int dx, int dy, + const RECT &screen); + + void print(gdioutput &gdi, HDC hDC, int dx, int dy); + + //Returns true if capture is taken + bool mouseMove(gdioutput &gdi, int x, int y); + bool mouseLeftDown(gdioutput &gdi, int x, int y); + bool mouseLeftUp(gdioutput &gdi, int x, int y); + bool mouseLeftDblClick(gdioutput &gdi, int x, int y); + + bool editCell(gdioutput &gdi, int row, int col); + + bool keyCommand(gdioutput &gdi, KeyCommandCode code); + void sort(int col); + void filter(int col, const string &filt, bool forceFilter=false); + + int addColumn(const string &Title, int width, bool isnum, bool formatRight = false); + int addColumnPaddedSort(const string &title, int width, int padding, bool formatRight = false); + + void reserve(size_t siz); + + TableRow *getRowById(int rowId); + void addRow(int rowId, oBase *object); + void set(int column, oBase &owner, int id, const string &data, + bool canEdit=true, CellType type=cellEdit); + + //Reload a row from data + void reloadRow(int rowId); + + bool UpDown(gdioutput &gdi, int direction); + bool tabFocus(gdioutput &gdi, int direction); + bool enter(gdioutput &gdi); + void escape(gdioutput &gdi); + bool inputChange(gdioutput &gdi, HWND hEdit); + void resetColumns(); + void update(); + + Table(oEvent *oe_, int rowHeight, + const string &name, const string &tname); + ~Table(void); + + friend struct TableSortIndex; +}; + +struct TableSortIndex { + //TableSortIndex(const Table &t) : table(&t) {} + const static Table *table; + int index; + bool operator<(const TableSortIndex &t) const {return table->compareRow(index,t.index);} + //{return table->Data[index].key < table->Data[t.index].key;} + //bool operator<=(const TableSortIndex &t) const {return table->Data[index].key <= table->Data[t.index].key;} +}; + +enum {TID_CLASSNAME, TID_COURSE, TID_NUM, TID_ID, TID_MODIFIED, +TID_RUNNER, TID_CLUB, TID_START, TID_TIME, +TID_FINISH, TID_STATUS, TID_RUNNINGTIME, TID_PLACE, +TID_CARD, TID_TEAM, TID_LEG, TID_CONTROL, TID_CODES, TID_FEE, TID_PAID, +TID_INPUTTIME, TID_INPUTSTATUS, TID_INPUTPOINTS, TID_INPUTPLACE, +TID_NAME, TID_NATIONAL, TID_SEX, TID_YEAR, TID_INDEX, TID_ENTER, TID_STARTNO}; diff --git a/code/TimeStamp.cpp b/code/TimeStamp.cpp new file mode 100644 index 0000000..5417c9d --- /dev/null +++ b/code/TimeStamp.cpp @@ -0,0 +1,134 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +// TimeStamp.cpp: implementation of the TimeStamp class. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "meos.h" +#include "TimeStamp.h" +#include + +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[]=__FILE__; +#define new DEBUG_NEW +#endif + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +const __int64 minYearConstant = 2014 - 1601; + +TimeStamp::TimeStamp() +{ + Time=0; + //Update(); +} + +TimeStamp::~TimeStamp() +{ + +} + +void TimeStamp::update(TimeStamp &ts) +{ + Time=max(Time, ts.Time); +} + +void TimeStamp::update() +{ + SYSTEMTIME st; + GetLocalTime(&st); + + FILETIME ft; + SystemTimeToFileTime(&st, &ft); + + __int64 ¤ttime=*(__int64*)&ft; + + Time=unsigned((currenttime/10000000L) - minYearConstant*365*24*3600); +} + +int TimeStamp::getAge() const +{ + SYSTEMTIME st; + GetLocalTime(&st); + FILETIME ft; + SystemTimeToFileTime(&st, &ft); + __int64 ¤ttime=*(__int64*)&ft; + + int CTime=int((currenttime/10000000)-minYearConstant*365*24*3600); + + return CTime-Time; +} + +string TimeStamp::getStamp() const +{ + __int64 ft64=(__int64(Time)+minYearConstant*365*24*3600)*10000000; + FILETIME &ft=*(FILETIME*)&ft64; + SYSTEMTIME st; + FileTimeToSystemTime(&ft, &st); + + char bf[32]; + sprintf_s(bf, "%d%02d%02d%02d%02d%02d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); + + return bf; +} + +string TimeStamp::getStampString() const +{ + __int64 ft64=(__int64(Time)+minYearConstant*365*24*3600)*10000000; + FILETIME &ft=*(FILETIME*)&ft64; + SYSTEMTIME st; + FileTimeToSystemTime(&ft, &st); + + char bf[32]; + sprintf_s(bf, "%d-%02d-%02d %02d:%02d:%02d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); + + return bf; +} + +void TimeStamp::setStamp(string s) +{ + if (s.size()<14) + return; + SYSTEMTIME st; + memset(&st, 0, sizeof(st)); + + //const char *ptr=s.c_str(); + //sscanf(s.c_str(), "%4hd%2hd%2hd%2hd%2hd%2hd", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); + st.wYear=atoi(s.substr(0, 4).c_str()); + st.wMonth=atoi(s.substr(4, 2).c_str()); + st.wDay=atoi(s.substr(6, 2).c_str()); + st.wHour=atoi(s.substr(8, 2).c_str()); + st.wMinute=atoi(s.substr(10, 2).c_str()); + st.wSecond=atoi(s.substr(12, 2).c_str()); + + FILETIME ft; + SystemTimeToFileTime(&st, &ft); + + __int64 ¤ttime=*(__int64*)&ft; + + Time = unsigned((currenttime/10000000)-minYearConstant*365*24*3600); +} diff --git a/code/TimeStamp.h b/code/TimeStamp.h new file mode 100644 index 0000000..af73c52 --- /dev/null +++ b/code/TimeStamp.h @@ -0,0 +1,49 @@ +// TimeStamp.h: interface for the TimeStamp class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_TIMESTAMP_H__CC16BFC5_ECD9_4D76_AC98_79F802314B65__INCLUDED_) +#define AFX_TIMESTAMP_H__CC16BFC5_ECD9_4D76_AC98_79F802314B65__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +class TimeStamp +{ + unsigned int Time; +public: + void setStamp(string s); + string getStamp() const; + string getStampString() const; + int getAge() const; + unsigned int getModificationTime() const {return Time;} + + void update(); + void update(TimeStamp &ts); + TimeStamp(); + virtual ~TimeStamp(); +}; + +#endif // !defined(AFX_TIMESTAMP_H__CC16BFC5_ECD9_4D76_AC98_79F802314B65__INCLUDED_) diff --git a/code/autotask.cpp b/code/autotask.cpp new file mode 100644 index 0000000..e4e27cd --- /dev/null +++ b/code/autotask.cpp @@ -0,0 +1,338 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" +#include + +#include "oEvent.h" +#include "autotask.h" +#include "TabAuto.h" +#include "TabSI.h" +#include "meos_util.h" +#include "socket.h" + +const int SYNC_FACTOR = 4; + +//#define DEBUGPRINT +//#define NODELAY + +AutoTask::AutoTask(HWND hWnd, oEvent &oeIn, gdioutput &gdiIn) : hWndMain(hWnd), oe(oeIn), gdi(gdiIn) { + currentRevision = 0; + lock = false; + lastSynchTime = 0; + lastTriedSynchTime = 0; + + autoSaveTimeBase = autoSaveTime = oe.getPropertyInt("AutoSaveTimeOut", (3*60+15)*1000); + synchBaseTime = oe.getPropertyInt("SynchronizationTimeOut", 2500); + maxDelay = oe.getPropertyInt("MaximumSpeakerDelay", 10000)/SYNC_FACTOR; +} + +void AutoTask::autoSave() { + if (!oe.empty()) { + string msg; + try { + if (oe.getNumRunners() > 500) + gdi.setWaitCursor(true); + + DWORD tic = GetTickCount(); + oe.save(); + DWORD toc = GetTickCount(); + + if (toc > tic) { + int timeToSave = toc - tic; + int interval = max(autoSaveTimeBase, timeToSave * 10); + if (abs(interval - autoSaveTime) > 4000) { + autoSaveTime = interval; + resetSaveTimer(); + } + } + } + catch(std::exception &ex) { + msg=ex.what(); + } + catch(...) { + msg="Ett okänt fel inträffade."; + } + + if (!msg.empty()) { + gdi.alert(msg); + } + else + gdi.addInfoBox("", "Tävlingsdata har sparats.", 10); + + gdi.setWaitCursor(false); + + } +} + +void AutoTask::resetSaveTimer() { + KillTimer(hWndMain, 1); + SetTimer(hWndMain, 1, autoSaveTime, 0); //Autosave +} + +void AutoTask::setTimers() { + SetTimer(hWndMain, 2, 100, 0); //Interface timeout + SetTimer(hWndMain, 3, synchBaseTime, 0); //DataSync +} + +void AutoTask::interfaceTimeout(const vector &windows) { + TabAuto *tabAuto = dynamic_cast(gdi.getTabs().get(TAutoTab)); + TabSI *tabSI = dynamic_cast(gdi.getTabs().get(TSITab)); + + if (lock) + return; + lock = true; + + string msg; + try { + DWORD tick = GetTickCount(); + for (size_t k = 0; kCheckInterfaceTimeouts(tick); + } + + if (tabAuto) + tabAuto->timerCallback(gdi); + + if (tabSI) + while(tabSI->checkpPrintQueue(gdi)); + } + catch(std::exception &ex) { + msg=ex.what(); + } + catch(...) { + msg="Ett okänt fel inträffade."; + } + if (!msg.empty()) { + gdi.alert(msg); + gdi.setWaitCursor(false); + } + lock = false; +} + +void AutoTask::addSynchTime(DWORD tick) { + if (tick > 1000 * 60) + return; // Ignore extreme times + + if (synchQueue.size () > 8) + synchQueue.pop_front(); + + synchQueue.push_back(tick); +} + +DWORD AutoTask::getAvgSynchTime() { +#ifdef NODELAY + return 0; +#else + double res = 0; + for (size_t k = 0; k < synchQueue.size(); k++) { + double sq = synchQueue[k]; + res += sq*sq; + } + + if (res > 0) + res = sqrt(res) / double(synchQueue.size()); + + return min(int(res), maxDelay); +#endif +} + +void AutoTask::synchronize(const vector &windows) { + DWORD tic = GetTickCount(); + DWORD avg = getAvgSynchTime(); + //OutputDebugString(("AVG Update Time: " + itos(avg)).c_str()); + if (tic > lastSynchTime) { + DWORD since = tic - lastSynchTime; + if (since < avg * SYNC_FACTOR) { + //OutputDebugString((" skipped: " + itos(since) + "\n").c_str()); + return; + } + //else + //OutputDebugString((" check: tsl = " + itos(since) + "\n").c_str()); + } + else + lastSynchTime = tic; + + if (oe.hasDirectSocket()) { + // Clear any incomming messages (already in db) + vector pi; + oe.getDirectSocket().getPunchQueue(pi); + } + + // Store last time we tried to synch + lastTriedSynchTime = tic; + + if (synchronizeImpl(windows)) { + DWORD toc = GetTickCount(); + if (toc > tic) + addSynchTime(toc-tic); + + lastSynchTime = toc; +#ifdef DEBUGPRINT + OutputDebugString((" updated: " + itos(toc-tic) + "\n").c_str()); +#endif + } + + //OutputDebugString(" no update\n"); +} + +void AutoTask::advancePunchInformation(const vector &windows) { + DWORD tic = GetTickCount(); + DWORD avg = getAvgSynchTime(); + //OutputDebugString(("Direct Update Time: " + itos(avg)).c_str()); + if (tic > lastSynchTime) { + DWORD since = tic-lastSynchTime; + if (since < avg * SYNC_FACTOR) { + //OutputDebugString((" skipped: " + itos(since) + "\n").c_str()); + return; + } + } + else + lastSynchTime = tic; + + DWORD since = tic - lastTriedSynchTime; + if (since > DWORD(synchBaseTime*4)) { // Synchronize all instead. + synchronize(windows); + return; + } + + if (advancePunchInformationImpl(windows)) { + DWORD toc = GetTickCount(); + if (toc > tic) + addSynchTime(toc-tic); + lastSynchTime = toc; +#ifdef DEBUGPRINT + OutputDebugString((" direct update: " + itos(toc-tic) + "\n").c_str()); +#endif + } +} + +bool AutoTask::synchronizeImpl(const vector &windows) { + if (lock) + return false; + lock = true; + + DWORD d=0; + bool doSync = false; + bool doSyncPunch = false; + TabAuto *tabAuto = dynamic_cast(gdi.getTabs().get(TAutoTab)); + + for (size_t k = 0; kgetData("DataSync", d)) { + doSync = true; + } + if (windows[k] && windows[k]->getData("PunchSync", d)) { + doSyncPunch = true; + doSync = true; + } + } + + string msg; + bool ret = false; + try { + if (doSync || (tabAuto && tabAuto->synchronize)) { + + if (tabAuto && tabAuto->synchronizePunches) + doSyncPunch = true; + + if ( oe.autoSynchronizeLists(doSyncPunch) || oe.getRevision() != currentRevision) { + ret = true; + if (getAvgSynchTime() > 1000) + gdi.setWaitCursor(true); + + if (doSync) { + for (size_t k = 0; kmakeEvent("DataUpdate", "autosync", 0, 0, false); + } + catch(std::exception &ex) { + msg = ex.what(); + } + catch(...) { + msg = "Ett okänt fel inträffade."; + } + } + } + } + + if (tabAuto) + tabAuto->syncCallback(gdi); + } + } + oe.resetSQLChanged(false, true); + } + catch (std::exception &ex) { + msg = ex.what(); + } + catch (...) { + msg = "Ett okänt fel inträffade."; + } + + currentRevision = oe.getRevision(); + + if (!msg.empty()) { + gdi.alert(msg); + } + lock = false; + gdi.setWaitCursor(false); + return ret; +} + +bool AutoTask::advancePunchInformationImpl(const vector &windows) { + DWORD d=0; + bool doSync = false; + bool doSyncPunch = false; + + for (size_t k = 0; kgetData("DataSync", d)) { + doSync = true; + } + if (windows[k] && windows[k]->getData("PunchSync", d)) { + doSyncPunch = true; + doSync = true; + } + } + + //string msg; + try { + if (oe.hasDirectSocket()) { + //OutputDebugString("Advance punch info\n"); + vector pi; + oe.getDirectSocket().getPunchQueue(pi); + bool ret = oe.advancePunchInformation(windows, pi, doSyncPunch, doSync); + if (ret) + oe.resetSQLChanged(false, true); + + return ret; + } + } + catch (std::exception &ex) { + OutputDebugString(ex.what()); + //msg = ex.what(); + } + catch (...) { + //msg = "Ett okänt fel inträffade."; + } + + return false; +} diff --git a/code/autotask.h b/code/autotask.h new file mode 100644 index 0000000..060cafe --- /dev/null +++ b/code/autotask.h @@ -0,0 +1,74 @@ +#pragma once + +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include +#include + +class oEvent; +class gdioutput; + +class AutoTask { +private: + oEvent &oe; + gdioutput &gdi; + AutoTask &operator=(const AutoTask &); + + bool synchronizeImpl(const vector &gdi); + bool advancePunchInformationImpl(const vector &windows); + + long currentRevision; + bool lock; + + deque synchQueue; + deque directQueue; + + DWORD lastSynchTime; + DWORD lastTriedSynchTime; + void addSynchTime(DWORD tick); + DWORD getAvgSynchTime(); + + HWND hWndMain; + + int autoSaveTime; + int autoSaveTimeBase; + + int synchBaseTime; + int maxDelay; // The maximal delay between syncs +public: + + void setTimers(); + + void resetSaveTimer(); + + AutoTask(HWND hWnd, oEvent &oe, gdioutput &gdi); + void autoSave(); + /** Trigger timed text updates and gdi timeouts, service timeouts. */ + void interfaceTimeout(const vector &windows); + + /** Read updates from SQL (if connected) and update windows due to changed competition data.*/ + void synchronize(const vector &windows); + + /** Fetch fast advance information.*/ + void advancePunchInformation(const vector &windows); +}; diff --git a/code/bitmap1.bmp b/code/bitmap1.bmp new file mode 100644 index 0000000..b750a47 Binary files /dev/null and b/code/bitmap1.bmp differ diff --git a/code/classconfiginfo.cpp b/code/classconfiginfo.cpp new file mode 100644 index 0000000..549d62c --- /dev/null +++ b/code/classconfiginfo.cpp @@ -0,0 +1,207 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ +#include "stdafx.h" + +#include "oEvent.h" +#include "classconfiginfo.h" +#include "meos_util.h" + +void ClassConfigInfo::clear() { + individual.clear(); + relay.clear(); + patrol.clear(); + + legNStart.clear(); + raceNStart.clear(); + + legResult.clear(); + raceNRes.clear(); + + rogainingClasses.clear(); + timeStart.clear(); + hasMultiCourse = false; + hasMultiEvent = false; + hasRentedCard = false; + classWithoutCourse.clear(); + maximumLegNumber = 0; + results = false; + starttimes = false; +} + +bool ClassConfigInfo::empty() const { + return individual.empty() && relay.empty() && patrol.empty() && raceNStart.empty(); +} + +void ClassConfigInfo::getIndividual(set &sel) const { + sel.insert(individual.begin(), individual.end()); +} + +void ClassConfigInfo::getRelay(set &sel) const { + sel.insert(relay.begin(), relay.end()); +} + +void ClassConfigInfo::getTeamClass(set &sel) const { + sel.insert(relay.begin(), relay.end()); + sel.insert(patrol.begin(), patrol.end()); + if (!raceNStart.empty()) + sel.insert(raceNRes[0].begin(), raceNRes[0].end()); +} + + +bool ClassConfigInfo::hasTeamClass() const { + return !relay.empty() || !patrol.empty() || !raceNRes.empty(); +} + +void ClassConfigInfo::getPatrol(set &sel) const { + sel.insert(patrol.begin(), patrol.end()); +} + +void ClassConfigInfo::getRogaining(set &sel) const { + sel.insert(rogainingClasses.begin(), rogainingClasses.end()); +} + + +void ClassConfigInfo::getRaceNStart(int race, set &sel) const { + if (size_t(race) < raceNStart.size() && !raceNStart[race].empty()) + sel.insert(raceNStart[race].begin(), raceNStart[race].end()); + else + sel.clear(); +} + +void ClassConfigInfo::getLegNStart(int leg, set &sel) const { + if (size_t(leg) < legNStart.size() && !legNStart[leg].empty()) + sel.insert(legNStart[leg].begin(), legNStart[leg].end()); + else + sel.clear(); +} + +void ClassConfigInfo::getRaceNRes(int race, set &sel) const { + if (size_t(race) < raceNRes.size() && !raceNRes[race].empty()) + sel.insert(raceNRes[race].begin(), raceNRes[race].end()); + else + sel.clear(); +} + +void ClassConfigInfo::getLegNRes(int leg, set &sel) const { + map >::const_iterator res = legResult.find(leg); + if (res != legResult.end()) + sel.insert(res->second.begin(), res->second.end()); + else + sel.clear(); +} + +void oEvent::getClassConfigurationInfo(ClassConfigInfo &cnf) const +{ + oClassList::const_iterator it; + cnf.clear(); + + cnf.hasMultiEvent = hasPrevStage() || hasNextStage(); + + for (it = Classes.begin(); it != Classes.end(); ++it) { + if (it->isRemoved()) + continue; + + cnf.maximumLegNumber = max(cnf.maximumLegNumber, it->getNumStages()); + ClassType ct = it->getClassType(); + + if (it->isRogaining()) + cnf.rogainingClasses.push_back(it->getId()); + + if (it->getCourse() == 0) + cnf.classWithoutCourse.push_back(it->getName()); //MultiCourse not analysed... + + if ( !it->hasCoursePool() ) { + for (size_t k = 0; k< it->MultiCourse.size(); k++) { + if (it->MultiCourse[k].size() > 1) + cnf.hasMultiCourse = true; + } + } + if (ct == oClassIndividual) { + cnf.individual.push_back(it->getId()); + if (cnf.timeStart.empty()) + cnf.timeStart.resize(1); + cnf.timeStart[0].push_back(it->getId()); + } + else if (ct == oClassPatrol) + cnf.patrol.push_back(it->getId()); + else if (ct == oClassRelay) { + cnf.relay.push_back(it->getId()); + + if (cnf.legNStart.size() < it->getNumStages()) + cnf.legNStart.resize(it->getNumStages()); + + for (size_t k = 0; k < it->getNumStages(); k++) { + StartTypes st = it->getStartType(k); + if (st == STDrawn || st == STHunting) { + cnf.legNStart[k].push_back(it->getId()); + if (cnf.timeStart.size() <= k) + cnf.timeStart.resize(k+1); + cnf.timeStart[k].push_back(it->getId()); + } + + LegTypes lt = it->getLegType(k); + if (!it->isOptional(k) && !it->isParallel(k) && lt != LTGroup) { + int trueN, order; + it->splitLegNumberParallel(k, trueN, order); + cnf.legResult[trueN].push_back(it->getId()); + } + } + } + else if (ct == oClassIndividRelay) { + if (cnf.raceNStart.size() < it->getNumStages()) + cnf.raceNStart.resize(it->getNumStages()); + if (cnf.raceNRes.size() < it->getNumStages()) + cnf.raceNRes.resize(it->getNumStages()); + + for (size_t k = 0; k < it->getNumStages(); k++) { + StartTypes st = it->getStartType(k); + if (st == STDrawn || st == STHunting) { + cnf.raceNStart[k].push_back(it->getId()); + if (cnf.timeStart.size() <= k) + cnf.timeStart.resize(k+1); + cnf.timeStart[k].push_back(it->getId()); + + } + LegTypes lt = it->getLegType(k); + if (lt != LTIgnore && lt != LTExtra && lt != LTGroup) + cnf.raceNRes[k].push_back(it->getId()); + } + } + } + + oRunnerList::const_iterator rit; + for (rit = Runners.begin(); rit != Runners.end(); ++rit) { + if (rit->isRemoved()) + continue; + + if (rit->getDCI().getInt("CardFee") != 0) { + cnf.hasRentedCard = true; + } + RunnerStatus st = rit->getStatus(); + if (st != StatusUnknown && st != StatusDNS && st != StatusNotCompetiting) + cnf.results = true; + + if (rit->getStartTime() > 0) + cnf.starttimes = true; + } +} + diff --git a/code/classconfiginfo.h b/code/classconfiginfo.h new file mode 100644 index 0000000..44cbb31 --- /dev/null +++ b/code/classconfiginfo.h @@ -0,0 +1,90 @@ +#pragma once + +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include + +class ClassConfigInfo { + friend class oEvent; +private: + bool results; + bool starttimes; + int maximumLegNumber; +public: + vector < vector > timeStart; + vector individual; + vector relay; + vector patrol; + + vector< vector > legNStart; + vector< vector > raceNStart; + + map > legResult; // main leg number -> class selection + vector< vector > raceNRes; + + vector rogainingClasses; + + // True if predefined forking + bool hasMultiCourse; + + bool hasMultiEvent; + + // True if there are rented cards + bool hasRentedCard; + + vector classWithoutCourse; + + void clear(); + + bool hasIndividual() const {return individual.size()>0;} + bool hasRelay() const {return relay.size()>0;} + bool hasPatrol() const {return patrol.size()>0;} + bool hasRogaining() const {return rogainingClasses.size()>0;} + bool empty() const; + + // Return true of this is an event in a sequence of events. + bool isMultiStageEvent() const {return hasMultiEvent;} + void getIndividual(set &sel) const; + void getRelay(set &sel) const; + void getPatrol(set &sel) const; + void getTeamClass(set &sel) const; + void getRogaining(set &sel) const; + + bool hasTeamClass() const; + + void getRaceNStart(int race, set &sel) const; + void getLegNStart(int leg, set &sel) const; + + void getRaceNRes(int race, set &sel) const; + void getLegNRes(int leg, set &sel) const; + + void getTimeStart(int leg, set &sel) const; + + // Return true if the competiont has any results + bool hasResults() const {return results;} + + // Return true if the competition defines any start times; + bool hasStartTimes() const {return starttimes;} + + int getNumLegsTotal() const {return maximumLegNumber;} +}; diff --git a/code/cp1250.lng b/code/cp1250.lng new file mode 100644 index 0000000..65d075a --- /dev/null +++ b/code/cp1250.lng @@ -0,0 +1 @@ +encoding = EASTEUROPE diff --git a/code/cp1255.lng b/code/cp1255.lng new file mode 100644 index 0000000..e4f939e --- /dev/null +++ b/code/cp1255.lng @@ -0,0 +1 @@ +encoding = HEBREW diff --git a/code/csvparser.cpp b/code/csvparser.cpp new file mode 100644 index 0000000..6f12245 --- /dev/null +++ b/code/csvparser.cpp @@ -0,0 +1,1254 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +// csvparser.cpp: implementation of the csvparser class. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "meos.h" +#include "csvparser.h" +#include "oEvent.h" +#include "SportIdent.h" +#include "meos_util.h" +#include "localizer.h" +#include "importformats.h" + +#include "meosexception.h" + +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[]=__FILE__; +#define new DEBUG_NEW +#endif + +#include + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +const int externalSourceId = 17000017; + +csvparser::csvparser() +{ + LineNumber=0; +} + +csvparser::~csvparser() +{ + +} + +int csvparser::iscsv(const char *file) +{ + fin.open(file); + + if (!fin.good()) + return false; + + char bf[2048]; + fin.getline(bf, 2048); + + while(fin.good() && strlen(bf)<3) + fin.getline(bf, 2048); + + fin.close(); + + vector sp; + split(bf, sp); + + if (sp.size()==1 && strcmp(sp[0], "RAIDDATA")==0) + return 3; + + if (sp.size()<5)//No csv + return 0; + + if (_stricmp(sp[1], "Descr")==0 || _stricmp(sp[1], "Namn")==0 + || _stricmp(sp[1], "Descr.")==0 || _stricmp(sp[1], "Navn")==0) //OS-fil (SWE/ENG)?? + return 2; + else return 1; //OE?! +} + +RunnerStatus ConvertOEStatus(int i) +{ + switch(i) + { + case 0: + return StatusOK; + case 1: // Ej start + return StatusDNS; + case 2: // Utg. + return StatusDNF; + case 3: // Felst. + return StatusMP; + case 4: //Disk + return StatusDQ; + case 5: //Maxtid + return StatusMAX; + } + return StatusUnknown; +} + + +//Stno;Descr;Block;nc;Start;Time;Classifier;Club no.;Cl.name;City;Nat;Cl. no.;Short;Long;Legs;Num1;Num2;Num3;Text1;Text2;Text3;Start fee;Paid;Surname;First name;YB;S;Start;Finish;Time;Classifier;Chip;Rented;Database Id;Surname;First name;YB;S;Start;Finish;Time;Classifier;Chip;Rented;Database Id;Surname;First name;YB;S;Start;Finish;Time;Classifier;Chip;Rented;Database Id;(may be more) ... + +bool csvparser::ImportOS_CSV(oEvent &event, const char *file) +{ + enum {OSstno=0, OSdesc=1, OSstart=4, OStime=5, OSstatus=6, OSclubno=7, OSclub=9, + OSnat=10, OSclassno=11, OSclass=12, OSlegs=14, OSfee=21, OSpaid=22}; + + const int Offset=23; + const int PostSize=11; + + enum {OSRsname=0, OSRfname=1, OSRyb=2, OSRsex=3, OSRstart=4, + OSRfinish=5, OSRstatus=7, OSRcard=8, OSRrentcard=9}; + + fin.open(file); + + if (!fin.good()) + return false; + + char bf[1024]; + fin.getline(bf, 1024); + + nimport=0; + + vector sp; + + while (!fin.eof()) { + fin.getline(bf, 1024); + split(bf, sp); + + if (sp.size()>20 && strlen(sp[OSclub])>0) + { + nimport++; + + //Create club with this club number... + int ClubId=atoi(sp[OSclubno]); + pClub pclub=event.getClubCreate(ClubId, sp[OSclub]); + + if (pclub){ + pclub->getDI().setString("Nationality", sp[OSnat]); + pclub->synchronize(true); + } + + //Create class with this class number... + int ClassId=atoi(sp[OSclassno]); + event.getClassCreate(ClassId, sp[OSclass]); + + //Club is autocreated... + pTeam team=event.addTeam(string(sp[OSclub])+" "+string(sp[OSdesc]), ClubId, ClassId); + team->setEntrySource(externalSourceId); + + team->setStartNo(atoi(sp[OSstno]), false); + + if (strlen(sp[12])>0) + team->setStatus( ConvertOEStatus( atoi(sp[OSstatus]) ), true, false); + + team->setStartTime(event.convertAbsoluteTime(sp[OSstart]), true, false); + + if (strlen(sp[OStime])>0) + team->setFinishTime( event.convertAbsoluteTime(sp[OSstart])+event.convertAbsoluteTime(sp[OStime])-event.getZeroTimeNum() ); + + if (team->getStatus()==StatusOK && team->getFinishTime()==0) + team->setStatus(StatusUnknown, true, false); + + unsigned rindex=Offset; + + oDataInterface teamDI=team->getDI(); + + teamDI.setInt("Fee", atoi(sp[OSfee])); + teamDI.setInt("Paid", atoi(sp[OSpaid])); + teamDI.setString("Nationality", sp[OSnat]); + + //Import runners! + int runner=0; + while( (rindex+OSRrentcard)0 ){ + int year = extendYear(atoi(sp[rindex+OSRyb])); + int cardNo = atoi(sp[rindex+OSRcard]); + pRunner r = event.addRunner(string(sp[rindex+OSRfname])+" "+string(sp[rindex+OSRsname]), ClubId, + ClassId, cardNo, year, false); + + r->setEntrySource(externalSourceId); + oDataInterface DI=r->getDI(); + //DI.setInt("BirthYear", extendYear(atoi(sp[rindex+OSRyb]))); + r->setSex(interpretSex(sp[rindex + OSRsex])); + DI.setString("Nationality", sp[OSnat]); + + if (strlen(sp[rindex+OSRrentcard])>0) + DI.setInt("CardFee", event.getDCI().getInt("CardFee")); + + //r->setCardNo(atoi(sp[rindex+OSRcard]), false); + r->setStartTime(event.convertAbsoluteTime(sp[rindex+OSRstart]), true, false); + r->setFinishTime( event.convertAbsoluteTime(sp[rindex+OSRfinish]) ); + + if (strlen(sp[rindex+OSRstatus])>0) + r->setStatus( ConvertOEStatus( atoi(sp[rindex+OSRstatus]) ), true, false); + + if (r->getStatus()==StatusOK && r->getRunningTime()==0) + r->setStatus(StatusUnknown, true, false); + + r->addClassDefaultFee(false); + + team->setRunner(runner++, r, true); + + rindex+=PostSize; + } + //int nrunners=team->GetNumRunners(); + pClass pc=event.getClass(ClassId); + + if (pc && runner>(int)pc->getNumStages()) + pc->setNumStages(runner); + + team->apply(true, 0, false); + } + } + fin.close(); + + return true; +} + + +bool csvparser::ImportOE_CSV(oEvent &event, const char *file) +{ + enum {OEstno=0, OEcard=1, OEid=2, OEsurname=3, OEfirstname=4, + OEbirth=5, OEsex=6, OEstart=9, OEfinish=10, OEstatus=12, + OEclubno=13, OEclub=14, OEclubcity=15, OEnat=16, OEclassno=17, OEclass=18, OEbib=23, + OErent=35, OEfee=36, OEpaid=37, OEcourseno=38, OEcourse=39, + OElength=40}; + + fin.open(file); + + if (!fin.good()) + return false; + + char bf[1024]; + fin.getline(bf, 1024); + + nimport=0; + vector sp; + while (!fin.eof()) { + fin.getline(bf, 1024); + split(bf, sp); + + if (sp.size()>20) { + nimport++; + + int clubId = atoi(sp[OEclubno]); + string clubName; + string shortClubName; + //string clubCity; + + clubName = sp[OEclubcity]; + shortClubName = sp[OEclub]; + + if (clubName.empty() && !shortClubName.empty()) + swap(clubName, shortClubName); + + pClub pclub = event.getClubCreate(clubId, clubName); + + if (pclub) { + if (strlen(sp[OEnat])>0) + pclub->getDI().setString("Nationality", sp[OEnat]); + + pclub->getDI().setString("ShortName", shortClubName.substr(0, 8)); + //pclub->getDI().setString("City", clubCity.substr(0, 23)); + pclub->setExtIdentifier(clubId); + pclub->synchronize(true); + } + + __int64 extId = oBase::converExtIdentifierString(sp[OEid]); + int id = oBase::idFromExtId(extId); + pRunner pr = 0; + + if (id>0) + pr = event.getRunner(id, 0); + + while (pr) { // Check that the exact match is OK + if (extId != pr->getExtIdentifier()) + break; + id++; + pr = event.getRunner(id, 0); + } + + if (pr) { + if (pr->getEntrySource() != externalSourceId) { + // If not same source, do not accept match (will not work with older versions of MeOS files) + pr = 0; + id = 0; + } + } + + const bool newEntry = (pr == 0); + + if (pr == 0) { + if (id==0) { + oRunner r(&event); + pr = event.addRunner(r, true); + } + else { + oRunner r(&event, id); + pr = event.addRunner(r, true); + } + } + + if (pr==0) + continue; + + pr->setExtIdentifier(extId); + pr->setEntrySource(externalSourceId); + + if (!pr->hasFlag(oAbstractRunner::FlagUpdateName)) { + string name = string(sp[OEsurname]) + ", " + string(sp[OEfirstname]); + pr->setName(name, false); + } + pr->setClubId(pclub ? pclub->getId():0); + pr->setCardNo( atoi(sp[OEcard]), false ); + + pr->setStartTime(event.convertAbsoluteTime(sp[OEstart]), true, false); + pr->setFinishTime(event.convertAbsoluteTime(sp[OEfinish])); + + if (strlen(sp[OEstatus])>0) + pr->setStatus( ConvertOEStatus( atoi(sp[OEstatus]) ), true, false); + + if (pr->getStatus()==StatusOK && pr->getRunningTime()==0) + pr->setStatus(StatusUnknown, true, false); + + //Autocreate class if it does not exist... + int classId=atoi(sp[OEclassno]); + if (classId>0 && !pr->hasFlag(oAbstractRunner::FlagUpdateClass)) { + pClass pc=event.getClassCreate(classId, sp[OEclass]); + + if (pc) { + pc->synchronize(); + if (pr->getClassId() == 0 || !pr->hasFlag(oAbstractRunner::FlagUpdateClass)) + pr->setClassId(pc->getId(), false); + } + } + int stno=atoi(sp[OEstno]); + bool needSno = pr->getStartNo() == 0 || newEntry; + bool needBib = pr->getBib().empty(); + + if (needSno || newEntry) { + if (stno>0) + pr->setStartNo(stno, false); + else + pr->setStartNo(nimport, false); + } + oDataInterface DI=pr->getDI(); + + pr->setSex(interpretSex(sp[OEsex])); + DI.setInt("BirthYear", extendYear(atoi(sp[OEbirth]))); + DI.setString("Nationality", sp[OEnat]); + + if (sp.size()>OEbib && needBib) + pr->setBib(sp[OEbib], 0, false, false); + + if (sp.size()>=38) {//ECO + DI.setInt("Fee", atoi(sp[OEfee])); + DI.setInt("CardFee", atoi(sp[OErent])); + DI.setInt("Paid", atoi(sp[OEpaid])); + } + + if (sp.size()>=40) {//Course + if (pr->getCourse(false) == 0) { + const char *cid=sp[OEcourseno]; + const int courseid=atoi(cid); + if (courseid>0) { + pCourse course=event.getCourse(courseid); + + if (!course) { + oCourse oc(&event, courseid); + oc.setLength(int(atof(sp[OElength])*1000)); + oc.setName(sp[OEcourse]); + course = event.addCourse(oc); + if (course) + course->synchronize(); + } + if (course) { + if (pr->getClassId() != 0) + event.getClass(pr->getClassId())->setCourse(course); + else + pr->setCourseId(course->getId()); + } + } + } + } + if (pr) + pr->synchronize(); + } + } + fin.close(); + + return true; +} + +bool csvparser::openOutput(const char *filename) +{ + //Startnr;Bricka;Databas nr.;Efternamn;Förnamn;År;K;Block;ut;Start;Mål;Tid;Status;Klubb nr.;Namn;Ort;Land;Klass nr.;Kort;Lång;Num1;Num2;Num3;Text1;Text2;Text3;Adr. namn;Gata;Rad 2;Post nr.;Ort;Tel;Fax;E-post;Id/Club;Hyrd;Startavgift;Betalt;Bana nr.;Bana;km;Hm;Bana kontroller + fout.open(filename); + + if (fout.bad()) + return false; + return true; +} + +bool csvparser::OutputRow(const string &row) +{ + fout << row << endl; + return true; +} +bool csvparser::OutputRow(vector &out) +{ + int size=out.size(); + + for(int i=0;i0) fout << ";"; + + if (p.find_first_of("; ,\t.")!=string::npos) + fout << "\"" << p << "\""; + else fout << p; + } + fout << endl; + fout.flush(); + return true; +} + +bool csvparser::closeOutput() +{ + fout.close(); + return true; +} + + +int csvparser::split(char *line, vector &split_vector) +{ + split_vector.clear(); + int len=strlen(line); + bool cite=false; + + for(int m=0;m sp; + while(!fin.eof()) { + fin.getline(bf, 1024); + split(bf, sp); + if (sp.size()>7) { + size_t firstIndex = 7; + bool hasLengths = true; + int offset = 0; + if (atoi(sp[firstIndex]) < 30) { + firstIndex = 6; + offset = -1; + } + + if (atoi(sp[firstIndex])<30 || atoi(sp[firstIndex])>1000) { + string str = "Ogiltig banfil. Kontroll förväntad på position X, men hittade 'Y'.#" + + itos(firstIndex+1) + "#" + sp[firstIndex]; + throw std::exception(str.c_str()); + } + + while (firstIndex > 0 && atoi(sp[firstIndex])>30 && atoi(sp[firstIndex])>1000) { + firstIndex--; + } + string Start = lang.tl("Start ") + "1"; + double Length = 0; + string Course = event.getAutoCourseName(); + string Class = ""; + + if (firstIndex>=6) { + Class = sp[0]; + Course = sp[1+offset]; + Start = sp[5+offset]; + Length = atof(sp[3+offset]); + + if (Start[0]=='S') { + int num = atoi(Start.substr(1).c_str()); + if (num>0) + Start = lang.tl("Start ") + Start.substr(1); + } + } + else + hasLengths = false; + + //Get controls + pCourse pc=event.getCourse(Course); + + if (!pc) { + pc = event.addCourse(Course, int(Length*1000)); + } + else { + // Reset control + pc->importControls("", false); + pc->setLength(int(Length*1000)); + } + + + vector legLengths; + + if (hasLengths) { + double legLen = atof(sp[firstIndex-1]); // Length in km + if (legLen > 0.001 && legLen < 30) + legLengths.push_back(int(legLen*1000)); + } + + if (pc) { + for (size_t k=firstIndex; k= 30 && ctrl < 1000) + pc->addControl(atoi(sp[k])); + else { + string str = "Oväntad kontroll 'X' i bana Y.#" + ctrlStr + "#" + pc->getName(); + throw std::exception(str.c_str()); + } + } + if (hasLengths) { + double legLen = atof(sp[k+1]); // Length in km + if (legLen > 0.001 && legLen < 30) + legLengths.push_back(int(legLen*1000)); + } + } + pc->setLength(int(Length*1000)); + pc->setStart(Start, true); + + if (legLengths.size() == pc->getNumControls()+1) + pc->setLegLengths(legLengths); + + if (!Class.empty() && addClasses) { + pClass cls = event.getBestClassMatch(Class); + if (!cls) + cls = event.addClass(Class); + + if (cls->getNumStages()==0) { + cls->setCourse(pc); + } + else { + for (size_t i = 0; igetNumStages(); i++) + cls->addStageCourse(i, pc->getId()); + } + + cls->synchronize(); + } + + pc->synchronize(); + } + } + } + return true; +} + + +bool csvparser::ImportRAID(oEvent &event, const char *file) +{ + enum {RAIDid=0, RAIDteam=1, RAIDcity=2, RAIDedate=3, RAIDclass=4, + RAIDclassid=5, RAIDrunner1=6, RAIDrunner2=7, RAIDcanoe=8}; + + fin.open(file); + + if (!fin.good()) + return false; + + char bf[1024]; + fin.getline(bf, 1024); + vector sp; + + nimport=0; + while (!fin.eof()) { + fin.getline(bf, 1024); + split(bf, sp); + + if (sp.size()>7) { + nimport++; + + int ClubId=0; + //Create class with this class number... + int ClassId=atoi(sp[RAIDclassid]); + pClass pc = event.getClassCreate(ClassId, sp[RAIDclass]); + ClassId = pc->getId(); + + //Club is autocreated... + pTeam team=event.addTeam(sp[RAIDteam], ClubId, ClassId); + + team->setStartNo(atoi(sp[RAIDid]), false); + if (sp.size()>8) + team->getDI().setInt("SortIndex", atoi(sp[RAIDcanoe])); + oDataInterface teamDI=team->getDI(); + teamDI.setDate("EntryDate", sp[RAIDedate]); + + if (pc) { + if (pc->getNumStages()<2) + pc->setNumStages(2); + + pc->setLegType(0, LTNormal); + pc->setLegType(1, LTIgnore); + } + + //Import runners! + pRunner r1=event.addRunner(sp[RAIDrunner1], ClubId, ClassId, 0, 0, false); + team->setRunner(0, r1, false); + + pRunner r2=event.addRunner(sp[RAIDrunner2], ClubId, ClassId, 0, 0, false); + team->setRunner(1, r2, false); + + team->apply(true, 0, false); + } + } + fin.close(); + + return true; +} + +int csvparser::selectPunchIndex(const string &competitionDate, const vector &sp, + int &cardIndex, int &timeIndex, int &dateIndex, + string &processedTime, string &processedDate) { + int ci = -1; + int ti = -1; + int di = -1; + string pt, date; + int maxCardNo = 0; + processedDate.clear(); + for (size_t k = 0; k < sp.size(); k++) { + processGeneralTime(sp[k], pt, date); + if (!pt.empty()) { + if (ti == -1) { + ti = k; + pt.swap(processedTime); + } + else { + return -1; // Not a unique time + } + if (!date.empty()) { + date.swap(processedDate); + di = k; + } + } + else if (k == 2 && strlen(sp[k]) == 2 && processedDate.empty()) { + processedDate = sp[k]; // Old weekday format + dateIndex = 2; + } + else { + int cno = atoi(sp[k]); + if (cno > maxCardNo) { + maxCardNo = cno; + ci = k; + } + } + + } + + if (ti == -1) + return 0; // No time found + if (ci == -1) + return 0; // No card number found + + if (timeIndex >= 0 && timeIndex != ti) + return -1; // Inconsistent + + if (cardIndex >= 0 && cardIndex != ci) + return -1; // Inconsistent + + timeIndex = ti; + cardIndex = ci; + dateIndex = di; + return 1; +} + +bool csvparser::importPunches(const oEvent &oe, const char *file, vector &punches) +{ + punches.clear(); + fin.clear(); + fin.open(file); + if (!fin.good()) + return false; + + //const size_t siz = 1024 * 1; + //char bf[siz]; + string bfs; + + //fin.getline(bf, siz); + std::getline(fin, bfs); + + nimport=0; + int cardIndex = -1; + int timeIndex = -1; + int dateIndex = -1; + + string processedTime, processedDate; + const string date = oe.getDate(); + vector sp; + while (!fin.eof()) { + if (fin.fail()) + throw meosException("Reading file failed."); + + //fin.getline(bf, siz); + std::getline(fin, bfs); + sp.clear(); + char *bf = (char *)bfs.c_str(); + split(bf, sp); + + int ret = selectPunchIndex(date, sp, cardIndex, timeIndex, dateIndex, + processedTime, processedDate); + if (ret == -1) + return false; // Invalid file + if (ret > 0) { + int card = atoi(sp[cardIndex]); + int time = oe.getRelativeTime(processedTime); + + if (card>0) { + PunchInfo pi; + pi.card = card; + pi.time = time; + strncpy_s(pi.date, sizeof(pi.date), processedDate.c_str(), 26); + pi.date[26] = 0; + punches.push_back(pi); + nimport++; + } + } + } + fin.close(); + + return true; +} + +int analyseSITime(const oEvent &oe, const char *dow, const char *time) +{ + int t=-1; + if (trim(dow).length()>0) + t = oe.getRelativeTime(time); + else + t = oe.getRelativeTimeFrom12Hour(time); + + if (t<0) + t=0; + + return t; +} + +void csvparser::checkSIConfigHeader(const vector &sp) { + siconfigmap.clear(); + if (sp.size() < 200) + return; + + //No;Read on;SIID;Start no;Clear CN;Clear DOW;Clear time;Clear_r CN;Clear_r DOW;Clear_r time;Check CN;Check DOW;Check time;Start CN;Start DOW;Start time;Start_r CN;Start_r DOW;Start_r time;Finish CN;Finish DOW;Finish time;Finish_r CN;Finish_r DOW;Finish_r time;Class;First name;Last name;Club;Country;Email;Date of birth;Sex;Phone;Street;ZIP;City;Hardware version;Software version;Battery date;Battery voltage;Clear count;Character set;SEL_FEEDBACK;No. of records;Record 1 CN;Record 1 DOW;Record 1 time;Record 2 CN;Record 2 DOW;Record 2 time;Record 3 CN;Record 3 DOW;Record 3 time;Record 4 CN;Record 4 DOW;Record 4 time;Record 5 CN;Record 5 DOW;Record 5 time;Record 6 CN;Record 6 DOW;Record 6 time;Record 7 CN;Record 7 DOW;Record 7 time;Record 8 CN;Record 8 DOW;Record 8 time;Record 9 CN;Record 9 DOW;Record 9 time;Record 10 CN;Record 10 DOW;Record 10 time;Record 11 CN;Record 11 DOW;Record 11 time;Record 12 CN;Record 12 DOW;Record 12 time;Record 13 CN;Record 13 DOW;Record 13 time;Record 14 CN;Record 14 DOW;Record 14 time;Record 15 CN;Record 15 DOW;Record 15 time;Record 16 CN;Record 16 DOW;Record 16 time;Record 17 CN;Record 17 DOW;Record 17 time;Record 18 CN;Record 18 DOW;Record 18 time;Record 19 CN;Record 19 DOW;Record 19 time;Record 20 CN;Record 20 DOW;Record 20 time;Record 21 CN;Record 21 DOW;Record 21 time;Record 22 CN;Record 22 DOW;Record 22 time;Record 23 CN;Record 23 DOW;Record 23 time;Record 24 CN;Record 24 DOW;Record 24 time;Record 25 CN;Record 25 DOW;Record 25 time;Record 26 CN;Record 26 DOW;Record 26 time;Record 27 CN;Record 27 DOW;Record 27 time;Record 28 CN;Record 28 DOW;Record 28 time;Record 29 CN;Record 29 DOW;Record 29 time;Record 30 CN;Record 30 DOW;Record 30 time;Record 31 CN;Record 31 DOW;Record 31 time;Record 32 CN;Record 32 DOW;Record 32 time;Record 33 CN;Record 33 DOW;Record 33 time;Record 34 CN;Record 34 DOW;Record 34 time;Record 35 CN;Record 35 DOW;Record 35 time;Record 36 CN;Record 36 DOW;Record 36 time;Record 37 CN;Record 37 DOW;Record 37 time;Record 38 CN;Record 38 DOW;Record 38 time;Record 39 CN;Record 39 DOW;Record 39 time;Record 40 CN;Record 40 DOW;Record 40 time;Record 41 CN;Record 41 DOW;Record 41 time;Record 42 CN;Record 42 DOW;Record 42 time;Record 43 CN;Record 43 DOW;Record 43 time;Record 44 CN;Record 44 DOW;Record 44 time;Record 45 CN;Record 45 DOW;Record 45 time;Record 46 CN;Record 46 DOW;Record 46 time;Record 47 CN;Record 47 DOW;Record 47 time;Record 48 CN;Record 48 DOW;Record 48 time;Record 49 CN;Record 49 DOW;Record 49 time;Record 50 CN;Record 50 DOW;Record 50 time;Record 51 CN;Record 51 DOW;Record 51 time;Record 52 CN;Record 52 DOW;Record 52 time;Record 53 CN;Record 53 DOW;Record 53 time;Record 54 CN;Record 54 DOW;Record 54 time;Record 55 CN;Record 55 DOW;Record 55 time;Record 56 CN;Record 56 DOW;Record 56 time;Record 57 CN;Record 57 DOW;Record 57 time;Record 58 CN;Record 58 DOW;Record 58 time;Record 59 CN;Record 59 DOW;Record 59 time;Record 60 CN;Record 60 DOW;Record 60 time;Record 61 CN;Record 61 DOW;Record 61 time;Record 62 CN;Record 62 DOW;Record 62 time;Record 63 CN;Record 63 DOW;Record 63 time;Record 64 CN;Record 64 DOW;Record 64 time;Record 65 CN;Record 65 DOW;Record 65 time;Record 66 CN;Record 66 DOW;Record 66 time;Record 67 CN;Record 67 DOW;Record 67 time;Record 68 CN;Record 68 DOW;Record 68 time;Record 69 CN;Record 69 DOW;Record 69 time;Record 70 CN;Record 70 DOW;Record 70 time;Record 71 CN;Record 71 DOW;Record 71 time;Record 72 CN;Record 72 DOW;Record 72 time;Record 73 CN;Record 73 DOW;Record 73 time;Record 74 CN;Record 74 DOW;Record 74 time;Record 75 CN;Record 75 DOW;Record 75 time;Record 76 CN;Record 76 DOW;Record 76 time;Record 77 CN;Record 77 DOW;Record 77 time;Record 78 CN;Record 78 DOW;Record 78 time;Record 79 CN;Record 79 DOW;Record 79 time;Record 80 CN;Record 80 DOW;Record 80 time;Record 81 CN;Record 81 DOW;Record 81 time;Record 82 CN;Record 82 DOW;Record 82 time;Record 83 CN;Record 83 DOW;Record 83 time;Record 84 CN;Record 84 DOW;Record 84 time;Record 85 CN;Record 85 DOW;Record 85 time;Record 86 CN;Record 86 DOW;Record 86 time;Record 87 CN;Record 87 DOW;Record 87 time;Record 88 CN;Record 88 DOW;Record 88 time;Record 89 CN;Record 89 DOW;Record 89 time;Record 90 CN;Record 90 DOW;Record 90 time;Record 91 CN;Record 91 DOW;Record 91 time;Record 92 CN;Record 92 DOW;Record 92 time;Record 93 CN;Record 93 DOW;Record 93 time;Record 94 CN;Record 94 DOW;Record 94 time;Record 95 CN;Record 95 DOW;Record 95 time;Record 96 CN;Record 96 DOW;Record 96 time;Record 97 CN;Record 97 DOW;Record 97 time;Record 98 CN;Record 98 DOW;Record 98 time;Record 99 CN;Record 99 DOW;Record 99 time;Record 100 CN;Record 100 DOW;Record 100 time;Record 101 CN;Record 101 DOW;Record 101 time;Record 102 CN;Record 102 DOW;Record 102 time;Record 103 CN;Record 103 DOW;Record 103 time;Record 104 CN;Record 104 DOW;Record 104 time;Record 105 CN;Record 105 DOW;Record 105 time;Record 106 CN;Record 106 DOW;Record 106 time;Record 107 CN;Record 107 DOW;Record 107 time;Record 108 CN;Record 108 DOW;Record 108 time;Record 109 CN;Record 109 DOW;Record 109 time;Record 110 CN;Record 110 DOW;Record 110 time;Record 111 CN;Record 111 DOW;Record 111 time;Record 112 CN;Record 112 DOW;Record 112 time;Record 113 CN;Record 113 DOW;Record 113 time;Record 114 CN;Record 114 DOW;Record 114 time;Record 115 CN;Record 115 DOW;Record 115 time;Record 116 CN;Record 116 DOW;Record 116 time;Record 117 CN;Record 117 DOW;Record 117 time;Record 118 CN;Record 118 DOW;Record 118 time;Record 119 CN;Record 119 DOW;Record 119 time;Record 120 CN;Record 120 DOW;Record 120 time;Record 121 CN;Record 121 DOW;Record 121 time;Record 122 CN;Record 122 DOW;Record 122 time;Record 123 CN;Record 123 DOW;Record 123 time;Record 124 CN;Record 124 DOW;Record 124 time;Record 125 CN;Record 125 DOW;Record 125 time;Record 126 CN;Record 126 DOW;Record 126 time;Record 127 CN;Record 127 DOW;Record 127 time;Record 128 CN;Record 128 DOW;Record 128 time;Record 129 CN;Record 129 DOW;Record 129 time;Record 130 CN;Record 130 DOW;Record 130 time;Record 131 CN;Record 131 DOW;Record 131 time;Record 132 CN;Record 132 DOW;Record 132 time;Record 133 CN;Record 133 DOW;Record 133 time;Record 134 CN;Record 134 DOW;Record 134 time;Record 135 CN;Record 135 DOW;Record 135 time;Record 136 CN;Record 136 DOW;Record 136 time;Record 137 CN;Record 137 DOW;Record 137 time;Record 138 CN;Record 138 DOW;Record 138 time;Record 139 CN;Record 139 DOW;Record 139 time;Record 140 CN;Record 140 DOW;Record 140 time;Record 141 CN;Record 141 DOW;Record 141 time;Record 142 CN;Record 142 DOW;Record 142 time;Record 143 CN;Record 143 DOW;Record 143 time;Record 144 CN;Record 144 DOW;Record 144 time;Record 145 CN;Record 145 DOW;Record 145 time;Record 146 CN;Record 146 DOW;Record 146 time;Record 147 CN;Record 147 DOW;Record 147 time;Record 148 CN;Record 148 DOW;Record 148 time;Record 149 CN;Record 149 DOW;Record 149 time;Record 150 CN;Record 150 DOW;Record 150 time;Record 151 CN;Record 151 DOW;Record 151 time;Record 152 CN;Record 152 DOW;Record 152 time;Record 153 CN;Record 153 DOW;Record 153 time;Record 154 CN;Record 154 DOW;Record 154 time;Record 155 CN;Record 155 DOW;Record 155 time;Record 156 CN;Record 156 DOW;Record 156 time;Record 157 CN;Record 157 DOW;Record 157 time;Record 158 CN;Record 158 DOW;Record 158 time;Record 159 CN;Record 159 DOW;Record 159 time;Record 160 CN;Record 160 DOW;Record 160 time;Record 161 CN;Record 161 DOW;Record 161 time;Record 162 CN;Record 162 DOW;Record 162 time;Record 163 CN;Record 163 DOW;Record 163 time;Record 164 CN;Record 164 DOW;Record 164 time;Record 165 CN;Record 165 DOW;Record 165 time;Record 166 CN;Record 166 DOW;Record 166 time;Record 167 CN;Record 167 DOW;Record 167 time;Record 168 CN;Record 168 DOW;Record 168 time;Record 169 CN;Record 169 DOW;Record 169 time;Record 170 CN;Record 170 DOW;Record 170 time;Record 171 CN;Record 171 DOW;Record 171 time;Record 172 CN;Record 172 DOW;Record 172 time;Record 173 CN;Record 173 DOW;Record 173 time;Record 174 CN;Record 174 DOW;Record 174 time;Record 175 CN;Record 175 DOW;Record 175 time;Record 176 CN;Record 176 DOW;Record 176 time;Record 177 CN;Record 177 DOW;Record 177 time;Record 178 CN;Record 178 DOW;Record 178 time;Record 179 CN;Record 179 DOW;Record 179 time;Record 180 CN;Record 180 DOW;Record 180 time;Record 181 CN;Record 181 DOW;Record 181 time;Record 182 CN;Record 182 DOW;Record 182 time;Record 183 CN;Record 183 DOW;Record 183 time;Record 184 CN;Record 184 DOW;Record 184 time;Record 185 CN;Record 185 DOW;Record 185 time;Record 186 CN;Record 186 DOW;Record 186 time;Record 187 CN;Record 187 DOW;Record 187 time;Record 188 CN;Record 188 DOW;Record 188 time;Record 189 CN;Record 189 DOW;Record 189 time;Record 190 CN;Record 190 DOW;Record 190 time;Record 191 CN;Record 191 DOW;Record 191 time;Record 192 CN;Record 192 DOW;Record 192 time; + string key; + for (size_t k = 0; k < sp.size(); k++) { + key = sp[k]; + if (key == "SIID" || key == "SI-Card") + siconfigmap[sicSIID] = k; + else if (key == "Check CN" || key == "CHK_CN") { + siconfigmap[sicCheck] = k; + siconfigmap[sicCheckDOW] = k + 1; + siconfigmap[sicCheckTime] = k + 2; + } + else if (key == "Check time") { + siconfigmap[sicCheckTime] = k; + } + else if (key == "Start CN" || key == "ST_CN") { + siconfigmap[sicStart] = k; + siconfigmap[sicStartDOW] = k + 1; + siconfigmap[sicStartTime] = k + 2; + } + else if (key == "Start time") { + siconfigmap[sicStartTime] = k; + } + else if (key == "Finish CN" || key == "FI_CN") { + siconfigmap[sicFinish] = k; + siconfigmap[sicFinishDOW] = k + 1; + siconfigmap[sicFinishTime] = k + 2; + } + else if (key == "Finish time") { + siconfigmap[sicFinishTime] = k; + } + else if (key == "First name") { + siconfigmap[sicFirstName] = k; + } + else if (key == "Last name") { + siconfigmap[sicLastName] = k; + } + else if (key == "No. of records" || key == "No. of punches") { + siconfigmap[sicNumPunch] = k; + } + else if (siconfigmap.count(sicRecordStart) == 0) { + size_t pos = key.find("Record 1"); + if (pos == string::npos) { + pos = key.find("1.CN"); + } + if (pos != string::npos) { + siconfigmap[sicRecordStart] = k; + if (siconfigmap.count(sicRecordStart) == 0 && k > 0) + siconfigmap[sicNumPunch] = k-1; + } + } + } + + if (!siconfigmap.empty()) { + + } +} + +const char *csvparser::getSIC(SIConfigFields sic, const vector &sp) const { + map::const_iterator res = siconfigmap.find(sic); + if (res == siconfigmap.end() || size_t(res->second) >= sp.size()) + return ""; + + return sp[res->second]; +} + +bool csvparser::checkSIConfigLine(const oEvent &oe, const vector &sp, SICard &card) { + if (siconfigmap.empty()) + return false; + + int startIx = siconfigmap[sicRecordStart]; + if (startIx == 0) + return false; + + int cardNo = atoi(getSIC(sicSIID, sp)); + + if (cardNo < 1000 || cardNo > 99999999) + return false; + + int check = analyseSITime(oe, getSIC(sicCheckDOW, sp), getSIC(sicCheckTime, sp)); + int start = analyseSITime(oe, getSIC(sicStartDOW, sp), getSIC(sicStartTime, sp)); + int finish = analyseSITime(oe, getSIC(sicFinishDOW, sp), getSIC(sicFinishTime, sp)); + int startCode = atoi(getSIC(sicStart, sp)); + int finishCode = atoi(getSIC(sicFinish, sp)); + int checkCode = atoi(getSIC(sicCheck, sp)); + string fname = getSIC(sicFirstName, sp); + string lname = getSIC(sicLastName, sp); + + vector< pair > punches; + int np = atoi(getSIC(sicNumPunch, sp)); + + + for (int k=0; k < np; k++) { + size_t ix = startIx + k*3; + if (ix+2 >= sp.size()) + return false; + int code = atoi(sp[ix]); + int time = analyseSITime(oe, sp[ix+1], sp[ix+2]); + if (code > 0) { + punches.push_back(make_pair(code, time)); + } + else { + return false; + } + } + + if ( (finish > 0 && finish != NOTIME) || punches.size() > 2) { + card.clear(0); + card.CardNumber = cardNo; + if (start > 0 && start != NOTIME) { + card.StartPunch.Code = startCode; + card.StartPunch.Time = start; + } + else { + card.StartPunch.Time = 0; + card.StartPunch.Code = -1; + } + + if (finish > 0 && finish != NOTIME) { + card.FinishPunch.Code = finishCode; + card.FinishPunch.Time = finish; + } + else { + card.FinishPunch.Time = 0; + card.FinishPunch.Code = -1; + } + + if (check > 0 && check != NOTIME) { + card.CheckPunch.Code = checkCode; + card.CheckPunch.Time = check; + } + else { + card.CheckPunch.Time = 0; + card.CheckPunch.Code = -1; + } + + for (size_t k = 0; k &sp, SICard &card) { + if (sp.size() <= 11) + return false; + + int cardNo = atoi(sp[1]); + + if (strchr(sp[1], '-') != 0) + cardNo = 0; // Ensure not a date 2017-02-14 + + if (cardNo < 1000 || cardNo > 99999999) + return false; + + int start = convertAbsoluteTimeMS(sp[5]); + int finish = convertAbsoluteTimeMS(sp[6]); + vector< pair > punches; + for (size_t k=10; k + 1 0) { + punches.push_back(make_pair(code, time)); + } + else { + return false; + } + } + + if (punches.size() > 2) { + card.clear(0); + card.CardNumber = cardNo; + if (start > 0) { + card.StartPunch.Code = 0; + card.StartPunch.Time = start; + } + else { + card.StartPunch.Code = -1; + } + + if (finish > 0) { + card.FinishPunch.Code = 0; + card.FinishPunch.Time = finish; + } + else { + card.FinishPunch.Code = -1; + } + + for (size_t k = 0; k &cards) +{ + cards.clear(); + fin.clear(); + fin.open(file); + + if (!fin.good()) + return false; + + //[1024*16]; + int s = 1024*256; + vector bbf(s); + char *bf = &bbf[0]; + fin.getline(bf, s); + vector sp; + split(bf, sp); + checkSIConfigHeader(sp); + nimport=0; + + while (!fin.eof()) { + fin.getline(bf, s); + split(bf, sp); + SICard card; + + if (checkSimanLine(oe, sp, card)) { + cards.push_back(card); + nimport++; + } + else if (checkSIConfigLine(oe,sp, card)) { + cards.push_back(card); + nimport++; + } + else if (sp.size()>28) { + int no = atoi(sp[0]); + card.CardNumber = atoi(sp[2]); + strncpy_s(card.FirstName, sp[5], 20); + strncpy_s(card.LastName, sp[6], 20); + strncpy_s(card.Club, sp[7], 40); + + if (trim(sp[21]).length()>1) { + card.CheckPunch.Code = atoi(sp[19]); + card.CheckPunch.Time = analyseSITime(oe, sp[20], sp[21]); + } + else { + card.CheckPunch.Code = -1; + card.CheckPunch.Time = 0; + } + + if (trim(sp[24]).length()>1) { + card.StartPunch.Code = atoi(sp[22]); + card.StartPunch.Time = analyseSITime(oe, sp[23], sp[24]); + } + else { + card.StartPunch.Code = -1; + card.StartPunch.Time = 0; + } + + if (trim(sp[27]).length()>1) { + card.FinishPunch.Code = atoi(sp[25]); + card.FinishPunch.Time = analyseSITime(oe, sp[26], sp[27]); + } + else { + card.FinishPunch.Code = -1; + card.FinishPunch.Time = 0; + } + + card.nPunch = atoi(sp[28]); + if (no>0 && card.CardNumber>0 && card.nPunch>0 && card.nPunch < 200) { + if (sp.size()>28+3*card.nPunch) { + for (unsigned k=0;k > &data) { + data.clear(); + + fin.open(file.c_str()); + const size_t bf_size = 4096; + char bf[4096]; + if (!fin.good()) + throw meosException("Failed to read file"); + + bool isUTF8 = false; + bool isUnicode = false; + bool firstLine = true; + wstring wideString; + vector sp; + + while(!fin.eof()) { + memset(bf, 0, bf_size); + fin.getline(bf, bf_size); + if (firstLine) { + if (bf[0] == -17 && bf[1] == -69 && bf[2] == -65) { + isUTF8 = true; + for (int k = 0; k 0) { + int untranslated; + WideCharToMultiByte(CP_ACP, 0, wideString.c_str(), wideString.length(), bf, bf_size-2, "?", &untranslated); + bf[wideString.length()-1] = 0; + } + else { + bf[0] = 0; + } + } + + firstLine = false; + split(bf, sp); + + if (!sp.empty()) { + data.push_back(vector()); + data.back().resize(sp.size()); + for (size_t k = 0; k < sp.size(); k++) { + data.back()[k] = sp[k]; + } + } + } + + if (isUTF8) { + list< vector > dataCopy; + for (list< vector >::iterator it = data.begin(); it != data.end(); ++it) { + vector &de = *it; + dataCopy.push_back(vector()); + vector &out = dataCopy.back(); + + wchar_t buff[buff_pre_alloc]; + char outstr[buff_pre_alloc]; + for (size_t k = 0; k < de.size(); k++) { + if (de[k].empty()) { + out.push_back(""); + continue; + } + int len = de[k].size(); + len = min(min(len+1, 1024), buff_pre_alloc-10); + + int wlen = MultiByteToWideChar(CP_UTF8, 0, de[k].c_str(), len, buff, buff_pre_alloc); + buff[wlen-1] = 0; + + BOOL untranslated = false; + WideCharToMultiByte(CP_ACP, 0, buff, wlen, outstr, buff_pre_alloc, "?", &untranslated); + outstr[wlen-1] = 0; + out.push_back(outstr); + } + } + data.swap(dataCopy); + } + + fin.close(); +} + +void csvparser::importTeamLineup(const string &file, + const map &classNameToNumber, + vector &teams) { + list< vector > data; + parse(file, data); + teams.clear(); + teams.reserve(data.size()/3); + int membersToRead = 0; + int lineNo = 1; + while (!data.empty()) { + vector &line = data.front(); + if (!line.empty()) { + if (membersToRead == 0) { + if (line.size() < 2 || line.size() > 3) + throw meosException("Ogiltigt lag på rad X.#" + itos(lineNo) + ": " + line[0]); + const string cls = trim(line[0]); + map::const_iterator res = classNameToNumber.find(cls); + if (res == classNameToNumber.end()) + throw meosException("Okänd klass på rad X.#" + itos(lineNo) + ": " + cls); + if (res->second <= 1) + throw meosException("Klassen X är individuell.#" + cls); + + membersToRead = res->second; + teams.push_back(TeamLineup()); + teams.back().teamClass = cls; + teams.back().teamName = trim(line[1]); + if (line.size() >= 3) + teams.back().teamClub = trim(line[2]); + } + else { + membersToRead--; + teams.back().members.push_back(TeamLineup::TeamMember()); + TeamLineup::TeamMember &member = teams.back().members.back(); + member.name = trim(line[0]); + if (line.size()>1) + member.cardNo = atoi(line[1].c_str()); + else + member.cardNo = 0; + + if (line.size()>2) + member.club = trim(line[2]); + + if (line.size() > 3) + member.course = trim(line[3]); + + if (line.size() > 4) + member.cls = trim(line[4]); + } + } + else if (membersToRead>0) { + membersToRead--; + teams.back().members.push_back(TeamLineup::TeamMember()); + } + lineNo++; + data.pop_front(); + } +} diff --git a/code/csvparser.h b/code/csvparser.h new file mode 100644 index 0000000..e8310ae --- /dev/null +++ b/code/csvparser.h @@ -0,0 +1,139 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +// csvparser.h: interface for the csvparser class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_CSVPARSER_H__FD04656A_1D2A_4E6C_BE23_BD66052E276E__INCLUDED_) +#define AFX_CSVPARSER_H__FD04656A_1D2A_4E6C_BE23_BD66052E276E__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include +#include + +class oEvent; +struct SICard; +class ImportFormats; + +struct PunchInfo { + int code; + int card; + int time; + char date[28]; +}; + + +struct TeamLineup { + struct TeamMember { + string name; + string club; + int cardNo; + string course; + string cls; + }; + + string teamName; + string teamClass; + string teamClub; + vector members; +}; + +class csvparser +{ +protected: + ofstream fout; + ifstream fin; + + int LineNumber; + string ErrorMessage; + + // Returns true if a SI-manager line is identified + bool checkSimanLine(const oEvent &oe, const vector &sp, SICard &cards); + + // Check and setup header for SIConfig import + void checkSIConfigHeader(const vector &sp); + + // Return true if SIConfig line was detected + bool checkSIConfigLine(const oEvent &oe, const vector &sp, SICard &card); + + enum SIConfigFields { + sicSIID, + sicCheck, + sicCheckTime, + sicCheckDOW, + sicStart, + sicStartTime, + sicStartDOW, + sicFinish, + sicFinishTime, + sicFinishDOW, + sicNumPunch, + sicRecordStart, + sicFirstName, + sicLastName, + }; + + map siconfigmap; + const char *getSIC(SIConfigFields sic, const vector &sp) const; + + // Check and process a punch line + static int selectPunchIndex(const string &competitionDate, const vector &sp, + int &cardIndex, int &timeIndex, int &dateIndex, + string &processedTime, string &date); + +public: + void parse(const string &file, list< vector > &dataOutput); + + void importTeamLineup(const string &file, + const map &classNameToNumber, + vector &teams); + + bool openOutput(const char *file); + bool closeOutput(); + bool OutputRow(vector &out); + bool OutputRow(const string &row); + + int nimport; + bool ImportOCAD_CSV(oEvent &event, const char *file, bool addClasses); + bool ImportOS_CSV(oEvent &event, const char *file); + bool ImportRAID(oEvent &event, const char *file); + + bool importPunches(const oEvent &oe, const char *file, + vector &punches); + + bool importCards(const oEvent &oe, const char *file, + vector &punches); + + int split(char *line, vector &split); + + bool ImportOE_CSV(oEvent &event, const char *file); + int iscsv(const char *file); + csvparser(); + virtual ~csvparser(); + +}; + +#endif // !defined(AFX_CSVPARSER_H__FD04656A_1D2A_4E6C_BE23_BD66052E276E__INCLUDED_) diff --git a/code/danish.lng b/code/danish.lng new file mode 100644 index 0000000..3feca23 --- /dev/null +++ b/code/danish.lng @@ -0,0 +1,2237 @@ +%s m = %s m +%s meter = %s meter +%s, block: %d = %s, blok: %d +(har stämplat) = (har stemplet) +(ledare) = (leder) +(lokalt) = (lokalt) +(okänd) stämplade vid = (ukendt) stemplede ved +(på server) = (på server) +(sekunder) = (sekunder) +(sträckseger) = (strækvinder) +ALLA( = Alle( +API-nyckel = API-nøgle +Accepterade elektroniska fakturor = Godkendte elektroniske fakturaer +Adress = Adresse +Adress och kontakt = Adresse og kontakt +Aktivera = Aktivér +Aktuell tid = Aktuel tid +Alla = Alle +Alla banfiler = Alle banefiler +Alla deltagare måste ha ett namn = Alle deltagere skal have et navn +Alla fakturor = Alle fakturaer +Alla funktioner = Alle funktioner linjenumre +Alla händelser = Alle begivenheder +Alla lag måste ha ett namn = Alle hold skal have et navn +Alla listor = Alle lister +Alla lopp = Alle løb +Alla lopp som individuella = Alle løb som individuelle +Alla sträckor = Alle ture +Alla sträckor/lopp i separata filer = Alle ture/løb i separate filer +Alla typer = Alle typer +Allmänna resultat = Generelle resultater +Andel vakanser = Andel vakante +Ange en gruppstorlek (som repeteras) eller flera kommaseparerade gruppstorlekar = Angiv en gruppestørrelse (der gentages) eller flere gruppestørrelser separeret med komma +Ange första nummerlappsnummer eller lämna blankt för inga nummerlappar = Angiv første nummer for brystnumre eller efterlad blank for ingen brystnumre +Ange löpande numrering eller första nummer i klassen = Angiv løbende nummerering eller angiv første nummer for klassen +Ange om kontrollen fungerar och hur den ska användas = Angiv om postenheden virker og hvordan den skal bruges +Ange relation mellan lagets och deltagarnas nummerlappar = Angiv relationen mellem holdets og deltagernes brystnumre +Ange startintervall för minutstart = Angiv startinterval for minutstart +Ange tiden relativt klassens första start = Angiv tid i forhold til klassens først startende +Anm. avg. = Startafg. +Anm. avgift = Startafgift +Anm. datum = Tilmeldingsfrist +Anmäl = Tilmeld +Anmäl X = Tilmeld X +Anmäl inga deltagare nu = Opret uden tilmelding af deltagere +Anmäl till efterföljande etapper = Tilmeld til efterfølgende etapper +Anmälda = Tilmeldte +Anmälda per distrikt = Tilmeldte pr. kreds +Anmälningar = Tilmeldinger +Anmälningar (IOF (xml) eller OE-CSV) = Tilmeldinger (IOF,XML) eller OE,CSV) +Anmälningsavgift = Startafgift +Anmälningsläge = Hurtig tilmelding +Anonymt namn = Anonymt navn +Anslut = Forbind +Anslut till en server = Forbind til en server +Ansluten till = Forbundet til +Ansluter till Internet = Forbinder til Internettet +Anslutna klienter = Forbundne klienter +Anslutningar = Forbindelser +Anslutningsinställningar = Opsætning af forbindelser +Antal = Antal +Antal besökare X, genomsnittlig bomtid Y, största bomtid Z = Antal løbere X, gennemsnitligt tidstab Y, største tidstab Z +Antal deltagare = Antal deltagere +Antal deltagare: X = Antal deltagere: X +Antal hämtade uppdateringar X (Y kb) = Antal hentede opdateringer X (Y kb) +Antal ignorerade: X = Antal ikke importerede: X +Antal importerade = Antal importerede +Antal kartor = Antal kort +Antal klasser = Antal klasser +Antal löpare = Antal løbere +Antal löpare på vanligaste banan X = Antal løbere på den mest valgte bane X +Antal misslyckade: X = Antal mislykkede tilmeldinger: X +Antal reserverade nummerlappsnummer mellan klasser = Antal reserverede brystnumre mellem klasser +Antal skickade uppdateringar X (Y kb) = Antal sendte opdateringer X (Y kb) +Antal startande per block = Antal startende i hver blok +Antal startande per intervall (inklusive redan lottade) = Antal startende i hvert interval (inklusive allerede lodtrukne) +Antal sträckor = Antal ture +Antal vakanser = Antal vakante +Antal: %d = Antal: %d +Antal: X = Antal: X +Antalet rader i urklipp får inte plats i selektionen = Antallet af rækker i udklipsholder passer ikke med det valgte +Använd Eventor = Brug Eventor +Använd ROC-protokoll = Brug ROC-protokollen +Använd banpool = Brug frit banevalg +Använd befintliga deltagare = Brug de eksisterende deltagere +Använd endast en bana i klassen = Brug kun en bane i klassen +Använd enhets-id istället för tävlings-id = Brug enheds ID i stedet for løbs ID +Använd funktioner för fleretappsklass = Brug funktioner for klasser med flere etaper +Använd första kontrollen som start = Brug første post som startpost +Använd löpardatabasen = Brug løberdatabase +Använd sista kontrollen som mål = Brug sidste post som målpost +Använd speakerstöd = Brug speakerfunktion +Använd stor font = Brug stor skrifttype +Använd symbolen X där MeOS ska fylla i typens data = Brug symbolet X hvor MeOS skal indsætte data +Användarnamn = Brugernavn +Applicera för specifik sträcka = Tilføj for specifikt stræk +Applying rules to the current competition = Anvend reglerne i det aktuelle løb +Arrangör = Arrangør +Assign courses and apply forking to X = Tildel baner og anvend gafling på X +Assign selected courses to selected legs = Tildel udvalgte baner til udvalgte ture +Att betala = At betale +Att betala: X = At betale: X +Automater = Autofunktioner +Automatic rogaining point reduction = Automatisk pointfradrag +Automatisera = Udfør automatisk +Automatisk = Automatisk +Automatisk lottning = Automatisk lodtrækning +Automatisk skroll = Automatisk rulning +Automatisk utskrift = Automatisk udskrift +Automatisk utskrift / export = Automatisk udskrift / eksport +Av MeOS: www.melin.nu/meos = Af MeOS: www.melin.nu/meos +Available symbols = Tilgængelige symboler +Avancerat = Avanceret +Avbryt = Afbryd +Avdrag = Fradrag +Avgift = Afgift +Avgifter = Afgifter +Avgifter och valuta ställer du in under = Startafgifter og valuta sættes fra +Avgiftshöjning (procent) = Afgiftsstigning (procent) +Avgjorda klasser (prisutdelningslista) = Afgjorte klasser (prisuddelingsliste) +Avgjorda placeringar - %s = Afgjorte placeringer - %s +Avgörande händelser = Afgørende begivenheder +Avgörs X = Afgøres X +Avgörs kl = Afgøres klokken +Avkortad banvariant = Afkortet variant af bane +Avkortar: X = Afkorter: X +Avkortning = Afkortning +Avläsning/radiotider = Aflæsning/radiotider +Avmarkera 'X' för att hantera alla bricktildelningar samtidigt = Fjern 'X' for at tildele alle brikker på en gang +Avmarkera allt = Afmarkér alt +Avrundad tävlingsavgift = Afrundet løbsafgift +Avsluta = Afslut +Avstånd = Afstand +Bad file format = Forkert filformat +Bakåt = Tilbage +Bana = Bane +Bana %d = Bane %d +Bana med slingor = Bane med sløjfer +Banan används och kan inte tas bort = Banen er i brug og kan ikke fjernes +Banan måste ha ett namn = Banen skal have et navn +Banan saknar rogainingkontroller = Banen har ingen pointløbsposter +Banan saknas = Banen mangler +Banans kontroller ger för få poäng för att täcka poängkravet = Banens poster giver ikke tilstrækkeligt med points til at dække pointkravet +Bananvändning = Brug af bane +Banmall = Baneskabelon +Banor = Baner +Banor (antal kontroller) = Baner (antal poster) +Banor för %s, sträcka %d = Baner for %s, tur %d +Banor, IOF (xml) = Baner, IOF (XML) +Banor, OCAD semikolonseparerat = Baner, OCAD semikolonsepareret +Banpool = Frit banevalg +Banpool, gemensam start = Frit banevalg, samlet start +Banpool, lottad startlista = Frit banevalg, lodtrukken startliste +Bantilldelning = Banetildeling +Bantilldelning, individuell = Banetildeling, individuel +Bantilldelning, stafett = Banetildeling, stafet +Bantilldelningslista - %s = Banetildelingsliste - %s +Basintervall (min) = Basisinterval (min) +Begränsa antal per klass = Begræns antal pr. klasse +Begränsa per klass = Begræns pr. klasse +Begränsning, antal visade per klass = Begræns antal viste pr. klasse +Behandlar löpardatabasen = Bearbejder løberdatabasen +Behandlar tävlingsdata = Bearbejder løbsdata +Behandlar: X = Bearbejder: X +Bekräfta att %s byter klass till %s = Bekræft at %s skifter klasse til %s +Bekräfta att deltagaren har lämnat återbud = Bekræft at deltageren har meldt afbud +Besökare = Besøgende +Betalat = Betalt +Betalningsinformation = Betalingsinformation +Bevakar händelser i X = Overvåger begivenheder i X +Bevakningsprioritering = Overvågningsprioritering +Bibs = Brystnumre +Block = Blok +Blockbredd = Blokkens bredde +Bläddra = Gennemse +Bold = Fed +BoldHuge = Fed, enorm +BoldLarge = Fed, stor +BoldSmall = Fed, lille +Bomfritt lopp / underlag saknas = Fejlfrit løb / mangler data +Bomkvot = Bom kvotient +Bommade kontroller = Poster med tidstab +Bomtid = Tidstab +Bomtid (max) = Tidstab (max) +Bomtid (medel) = Tidstab (gennemsnit) +Bomtid (median) = Tidstab (median) +Bomtid: X = Tidstab: X +Bricka = Brik +Bricka %d används redan av %s och kan inte tilldelas = Brik %d bruges af %s og kan ikke tildeles +Bricka X = Brik X +Brickan används av X = Brikken bruges af X +Brickan redan inläst = Brikken er allerede aflæst +Brickhantering = Brikhåndtering +Brickhyra = Leje af brik +Bricknr = Brik nummer +Bricknummret är upptaget (X) = Briknummeret er optaget (X) +Brickor = Brikker +Bygg databaser = Dan databaser +Byt till rätt klass (behåll eventuell starttid) = Skift til korrekt klasse (behold eventuel starttid) +Byt till vakansplats i rätt klass (om möjligt) = Skift til vakant plads i korrekt klasse (om muligt) +COM-Port = COM-Port +Calculate and apply forking = Beregn og brug gafling +Cancel = Annuller +Centrera = Centrer +Check = Check +Check: X = Check: X +Choose result module = Vælg resultatmodul +ClassCourseResult = Klasse, bane, resultat +ClassFinishTime = Klasse, måltid +ClassLength = Banelængde for klasse +ClassName = Klasse +ClassPoints = Klasse, points +ClassResult = Klasse, resultat +ClassResultFraction = Andel af klasse klar +ClassStartName = Startnavn +ClassStartTime = Klasse, starttid, navn +ClassStartTimeClub = Klasse, starttid, klub +ClassTeamLeg = Klasse, Hold, Tur +ClassTotalResult = Klasse, totalresultat +Clear Memory = Slet hukommelse +Clear selections = Slet valg +Club = Klub +Club and runner database = Klub og løber database +Club id number = Klub id nummer +ClubName = Klub +ClubRunner = Klub / løber +Clubs = Klubber +CmpDate = Løbsdato +CmpName = Løbsnavn +Control = Post +Control Overview = Post oversigt +Control Statistics = Post statistik +Control Statistics - X = Post statistik - X +ControlClasses = Klasser for post +ControlCodes = koder for post +ControlCourses = Baner for post +ControlMaxLostTime = Post, tidstab, maks. +ControlMedianLostTime = Post, tidstab, gennemsnit +ControlMistakeQuotient = Post, brøkdel af løbere med tidstab +ControlName = Postnavn +ControlPunches = Antal løbere der har stemplet post +ControlRunnersLeft = Antal løbere der mangler at stemple post +ControlVisitors = Forventet antal løbere til post +Country = Land +Course = Bane +CourseClasses = Banen klasser +CourseClimb = Banens stigning +CourseLength = Banelængde, specifik bane +CourseName = Banenavn +CourseResult = Bane, resultat +CourseShortening = Afkortning af banen +CourseUsage = Antal nødvendige kort for banen +CourseUsageNoVacant = Antal løbere på banen, uden vakantpladser +Create Competition = Opret løb +Created X distinct forkings using Y courses = Dannede X gaflinger ved brug af Y baner +CurrentTime = Aktuel tid +CustomSort = Tilpasset sortering +DATABASE ERROR = DATABASEFEJL +Data from result module (X) = Data fra resultatmodul (X) +Databasanslutning = Databaseforbindelse +Databasvarning: X = Database advarsel: X +Datorröst som läser upp förvarningar = Computerstemme der læser forvarslinger op +Datum = Dato +Datum (för första start) = Dato (for første start) +Debug = Debug +Debug Output = Debug Output +Debug X for Y = Debug X for Y +Decimalseparator = Decimal separator +DefaultFont = Standard skrifttype +Define forking = Definer gaflinger +Definierade mappningar = Definerede mappninger +Dela = Opdel +Dela efter placering = Fordel efter placering +Dela efter ranking = Opdel efter ranking +Dela efter tid = Fordel efter tid +Dela klass: X = Opdel klasse: X +Dela klassen = Opdel klasse +Dela klubbvis = Opdel efter klub +Dela slumpmässigt = Tilfældig fordeling +Dela upp = Fordel +Deltagare = Deltagere +Deltagare %d = Deltager %d +Deltagaren 'X' deltar i patrullklassen 'Y' men saknar patrull. Klassens start- och resultatlistor kan därmed bli felaktiga = Deltageren 'X' deltager i patruljeklassen 'Y' men mangler en patrulje. Klassens start- och resultatlister kan dermed blive fejlbehæftede +Deltagaren 'X' deltar i stafettklassen 'Y' men saknar lag. Klassens start- och resultatlistor kan därmed bli felaktiga = Deltageren 'X' deltager i stafetklassen 'Y' men mangler et hold. Klassens start- och resultatlister kan dermed blive fejlbehæftede +Deltagaren 'X' saknar klass = Der er ikke angivet klasse for deltageren 'X' +Deltagarens klass styrs av laget = Deltagerens klasse bestemmes af hold +Deltar ej = Delt. ej +Denna etapps nummer = Denne etapes nummer +Description = Beskrivelse +Destinationskatalog = Mappe at gemme i +Det går endast att sätta in vakanser på sträcka 1 = Der kan kun indsættes vakante pladser på første tur +Det här programmet levereras utan någon som helst garanti. Programmet är = Dette program leveres uden nogen som helst garanti. Programmet er +Deviation +/- from expected time on course leg = Afvigelse +/- fra forventet tid på strækket +Direktanmälan = Tilmelding på stævnepladsen +Disk. = Diskv. +District id number = Kreds id nummer +Distriktskod = Kredskode +Do you want to clear the card memory? = Vil du slette indlæste brikdata? +Don't know how to align with 'X' = Kan ikke justeres i forhold til 'X' +Du kan importera banor och klasser från OCADs exportformat = Du kan importere baner og klasser fra OCAD's eksportformat +Du måste välja en klass = Du skal vælge en plads +Duplicera = Dupliker +Döp om = Omdøb +Döp om X = Omdøb X +E-post = Email +Economy and fees = Økonomi og afgifter +Edit Clubs = Rediger klubber +Edit Result Modules = Rediger resultatmoduler +Edit rule for = Rediger regel for +Efter = Efter +Efteranm. avg. = Eftertilm. afg. +Efteranmälda (efter ordinarie) = Eftertilmeldte (Efter ordinære) +Efteranmälda (före ordinarie) = Eftertilmeldte (Før ordinære) +Efteranmälda före ordinarie = Eftertilmeldte først +Efteranmälningar = Eftertilmeldte +Egen listrubrik = Egen listeoverskrift +Egen text = Egen tekst +Egenskaper = Egenskaber +Eget fönster = Nyt vindue +Egna listor = Egne lister +Egna textrader = Egne tekstlinjer +Ej accepterade elektroniska fakturor = Afviste elektroniske fakturaer +Ej elektronisk = Ikke elektronisk +Ej lottade = Ikke lodtrukne +Ej lottade, efter = Ikke lodtrukne, sidst +Ej lottade, före = Ikke lodtrukne, først +Ej start = Ej startet +Ej tidtagning = Ingen tidtagning +Ekonomi = Økonomi +Ekonomisk sammanställning = Økonomisk sammentælling +Elektronisk = Elektronisk +Elektronisk godkänd = Electronisk godkendt +Elit = Elite +Elitavgift = Eliteafgift +Elitklasser = Eliteklasser +En bana med slingor tillåter deltagaren att ta slingorna i valfri ordning = En bane med sløjfer tillader løberen at ta sløjferne i valgfri rækkefølge. +En gafflad sträcka = En gaflet tur +En klass kan inte slås ihop med sig själv = En klasse kan ikke slås sammen med sig selv +En klubb kan inte slås ihop med sig själv = En klub kan ikke slås sammen med sig selv +Endast en bana = Kun en bane +Endast grundläggande = Grundfunktioner +Endast på obligatoriska sträckor = Håndter kun obligatoriske stræk. +Enhetens ID-nummer (MAC) = Enhedens ID (MAC) +Enhetstyp = Enhedstype +Error in result module X, method Y (Z) = Fejl i resultatmodul 'X', metode 'Y'\n\nZ +Etapp = Etape +Etapp X = Etape X +Etappresultat = Etaperesultater +Ett startblock spänner över flera starter: X/Y = En startblok skænder over flere starter: X/Y +Ett startintervall måste vara en multipel av basintervallet = Et startinterval skal være et multiplum af basisinterval +Ett värde vars tolkning beror på listan = En værdi hvis der fortolkning er afhængig af listen +Eventor server = Eventor server +Eventorkoppling = Eventor forbindelse +Eventors tider i UTC (koordinerad universell tid) = Eventor tider som UTC (Universal Coordinated Time) +Export av resultat/sträcktider = Eksport af resultater / stræktider +Exportera = Eksporter +Exportera / Säkerhetskopiera = Eksporter / Sikkerhedskopi +Exportera alla till HTML = Eksporter alle til HTML +Exportera alla till PDF = Exporter alt til PDF +Exportera datafil = Eksporter datafil +Exportera elektroniska fakturor = Eksporter elektroniske fakturaer +Exportera individuella lopp istället för lag = Eksporter individuelle løb istedet for hold +Exportera inställningar och löpardatabaser = Eksporter opsætning og løberdatabaser +Exportera klubbar (IOF-XML) = Eksporter klubber (IOF-XML) +Exportera löpardatabas = Eksporter løberdatabase +Exportera nu = Eksporter nu +Exportera personer (IOF-XML) = Eksporter personer (IOF-XML) +Exportera på fil = Eksporter til fil +Exportera resultat på fil = Eksporter resultater til fil +Exportera startlista = Exporter startliste +Exportera startlista på fil = Eksporter startliste til fil +Exportera sträcktider = Eksporter stræktider +Exportera tider i UTC = Exporter tider som UTC +Exportera till fil = Exporter til fil +Exportera tävlingsdata = Eksporter løbsdata +Exporterar om = Exporterer om +Exportformat = Exportformat +Exporttyp = Eksporttype +Exportval, IOF-XML = Eksportindst, IOF-XML +Externt Id = Eksternt Id +Extra = Ekstra +Extra avstånd ovanför textblock = Ekstra plads over tekstblok +Extra stämplingar = Ekstra stemplinger +Extralöparstafett = Ekstraløberstafet +FAKTURA = FAKTURA +FEL, inget svar = FEJL, intet svar +FEL: Porten kunde inte öppnas = FEJL: Porten kunne ikke åbnes +Failed to generate card = FEJL: Kunne ikke indlæse +Failed to open 'X' for reading = FEJL: Kunne ikke læse 'X' +Failed to read file = Kunne ikke læse fil +Faktiskt startdjup: X minuter = Faktisk startdybde: X minutter +Faktura = Faktura +Faktura nr = Faktura nr. +Fakturainställningar = Faktura indstillinger +Fakturanummer = Faktura nummer +Faktureras = Faktureres +Fakturor = Fakturaer +Fel: X = Fejl: X +Fel: hittar inte filen X = Fejl: Kan ikke finde filen 'X' +Felaktig kontroll = Forkert post +Felaktig nyckel = Forkert nøgle +Felaktig sträcka = Forkert tur +Felaktigt filformat = Forkert filformat +Felst. = Fejlklip +Fil att exportera till = Fil at eksportere til +Fil: X = Filnavn: X +Filen finns redan: X = Filen findes allerede: X +Filnamn = Filnavn +Filnamn (OCAD banfil) = Filnavn (OCAD banefil) +Filnamn IOF (xml) med klubbar = Filnavn IOF (XML) med klubber +Filnamn IOF (xml) med löpare = Filnavn IOF (XML) med løbere +Filnamnet får inte vara tomt = Filnavnet må ikke være tomt +Filnamnsprefix = Prefix for filnavn +Filter = Filter +FilterHasCard = Med brik +FilterNoCard = Uden brik +FilterNotVacant = Ikke vakant +FilterOnlyVacant = Kun vakant +FilterPrelResult = Foreløbigt resultat +FilterRentCard = Lejebrik +FilterResult = Med resultat +FilterSameParallel = Samlede parallelle stræk +FilterSameParallelNotFirst = Paralelle efterfølgende stræk +FilterStarted = Er startet +Filtrering = Filtrerer +Finish time for each team member = Måltid for hvert holdmedlem +FinishTime = Måltid, navn +FinishTimeReverse = Omvendt måltid (sidste først) +Flera banor = Flere baner +Flera banor / stafett / patrull / banpool = Flere baner / Stafet / Patrulje / Frit banevalg +Flera banor/stafett = Flere baner / Stafet +Flytta höger = Flyt til højre +Flytta vänster = Flyt til venstre +Forked individual courses = Gaflede individuelle baner +Forking setup = Opsætning af gaflinger +Forkings = Gaflinger +Forkings for X = Gaflinger til X +Format = Format +Formaterat webbdokument (html) = Formateret webdokument (html) +Formatering = Formattering +Formateringsregler = Formateringsregler +Formulärläge = Formularindstilling +Fortsätt = Fortsæt +Fri anmälningsimport = Tilmeldinger i frit format +Fri starttid = Fri starttid +Fria starttider = Frie starttider +Från klassen = Fra klassen +Från klubben = Fra klubben +Från kontroll = Fra post +Från laget = Fra holdet +Fullskärm = Fuldskærm +Funktion = Funktion +Funktioner = Funktioner +Funktioner i MeOS = Funktioner i MeOS +Fyll obesatta sträckor i alla lag med anonyma tillfälliga lagmedlemmar (N.N.) = Udfyld ubesatte ture på alle hold med anonyme midlertidige deltager (X) +Färg = Farve +Födelseår = Fødselsår +Följande deltagare deltar ej = Følgende deltagere deltager ikke +Följande deltagare har bytt klass = Følgende deltagere har skiftet klasse +Följande deltagare har bytt klass (inget totalresultat) = Følgende deltagere har skiftet klasse (intet samlet resultat) +Följande deltagare har tilldelats en vakant plats = Følgende deltagere er tildelt en vakant plads +Följande deltagare är anmälda till nästa etapp men inte denna = Følgende deltagere er tilmeldt næste etape, men ikke denne +Följande deltagare är nyanmälda = Følgende deltagere er nytilmeldte +Följande deltagare överfördes ej = Følgende deltagere blev ikke overført +För att delta i en lagklass måste deltagaren ingå i ett lag = En deltager skal være på et hold for at kunne deltage i en holdklasse. +För att ändra måltiden måste löparens målstämplingstid ändras = For at ændre måltid, skal løberens målstemplingstid ændres +För muspekaren över en markering för att få mer information = Før cursoren hen over en markering for at få mere information +För många kontroller = For mange poster +Förbered lottning = Forbered lodtrækning +Fördefinierade tävlingsformer = Foruddefinerede løbsformer +Fördela starttider = Fordel starttider +Föregående = Forrige +Föregående etapp = Forrige etape +Föregående kontroll = Foregående postenhed +Förekomst = Forekomst +Förhandsgranskning, import = Forhåndsvisning, import +Förhöjd avgift = Forhøjet afgift +Först-i-mål, gemensam = Først i mål, fælles +Först-i-mål, klassvis = Først i mål, klassevis +Första (ordinarie) start = Første (ordinære) start +Första fakturanummer = Første fakturanummer +Första kontrollen = Første post +Första omstartstid = Første efterstartstid +Första ordinarie starttid = Første ordinære starttid +Första start = Første start +Första starttid = Første starttid +Första sträckan kan inte vara parallell = Første stræk kan ikke være parallelt +Första tillåtna starttid = Først start tidligst +Försöket misslyckades = Forsøget mislykkedes +Förvarning på (SI-kod): alla stämplingar = Forvarsel (SI kode): alle stemplinger +Förvarningsröst = Forvarselsstemme +Förväntad andel efteranmälda = Forventet andel eftertilmeldte +Gafflade banor = Gaflede baner +Gafflingsnyckel X = Gafflingsnøgle X +Gata = Gade +Gemensam start = Fælles start +General = Generelt +Generera = Generer +Generera testtävling = Generer testløb +Genererad = Genereret +Geografisk fördelning = Geografisk fordeling +Global sorteringsordning = Global sorteringsorden +Godkänd = Godkendt +Godkänd API-nyckel = API-nøgle godkendt +Granska inmatning = Forhåndsvisning +Grund avg. = Grundafg. +Grundavgift = Grundafgift +Grundinställningar = Grundindstillinger +Gruppera = Grupper +Gräns för maxtid = Indstilling af maksimal løbstid +HTML med AutoRefresh = HTML med AutoRefresh +Hantera brickor = Håndter brikker +Hantera deltagare som bytt klass = Håndtering af deltagere der har skiftet klasse +Hantera egna listor = Håndter egne lister +Hantera flera etapper = Håndter flere etaper +Hantera jaktstart = Håndter jagtstart +Hantera klubbar = Håndter klubber +Hantera klubbar och ekonomi = Håndter klubber og økonomi +Hantera kvar-i-skogen = Håndter løbere-i-skoven +Hantera laget = Håndter holdet +Hantera löparbrickor = Håndter løberbrikker +Hela banan = Hele banen +Hemsida = Hjemmeside +Hindra att deltagare från samma klubb startar på angränsande tider = Sørg for at løbere fra samme klub ikke har starttider efter hinanden. +Hittar inte hjälpfilen, X = Kan ikke finde hjælpefilen, X +Hjälp = Hjælp +Hoppar över stafettklass: X = Spring stafetklasse over: X +Huvudlista = Hovedliste +Hyravgift = Lejeafgift +Hyrbricka = Lejebrik +Hyrbricksrapport = Lejebriksrapport +Hyrbricksrapport - %s = Lejebriksrapport - %s +Hyrd = Lejet +Hämta (efter)anmälningar från Eventor = Hent (efter)tilmeldinger fra Eventor +Hämta data från Eventor = Hent data fra Eventor +Hämta efteranmälningar = Hent eftertilmeldinger +Hämta löpardatabasen = Hent løberdatabasen +Hämta stämplingar m.m. från nätet = Hent stemplinger m.m. fra nettet. +Hämta svar om elektroniska fakturor = Hens svar om elektroniske fakturaer +Hämta tävlingsdata = Hent løbsdata +Hämta tävlingsdata för X = Hent løbsdata for X +Hämtar anmälda = Henter tilmeldte +Hämtar information om = Henter information om +Hämtar klasser = Henter klasser +Hämtar klubbar = Henter klubber +Hämtar löpardatabasen = Henter løberdatabasen +Hämtar tävling = Henter løb +Händelser = Begivenheder +Händelser - tidslinje = Begivenheder - tidslinje +Hög avgift = Forhøjet afgift +Höger = Højre +IOF (xml) = IOF (XML) +IOF Klubbdatabas, version 3.0 (xml) = IOF Klubdatabase, version 3.0 (xml) +IOF Löpardatabas, version 3.0 (xml) = IOF Løberdatabase, version 3.0 (xml) +IOF Resultat (xml) = IOF Resultater (XML) +IOF Resultat, version 2.0.3 (xml) = IOF Resultater, version 2.0.3 (XML) +IOF Resultat, version 3.0 (xml) = IOF Resultater, version 3.0 (XML) +IOF Startlista (xml) = IOF Startliste (XML) +IOF Startlista, version 2.0.3 (xml) = IOF Startliste, version 2.0.3 (xml) +IOF Startlista, version 3.0 (xml) = IOF Startliste, version 3.0 (xml) +IP-adress eller namn på en MySQL-server = IP addresse eller navn på en MySQL server +Id = Id +Identifierar X unika inledningar på banorna = Identificerer X unikke indledninger på banerne +Importera = Importer +Importera IOF (xml) = Importer IOF (XML) +Importera anmälda = Importer tilmeldte +Importera anmälningar = Importer tilmeldinger +Importera banor = Importer baner +Importera banor/klasser = Importer baner/klasser +Importera en tävling från fil = Importer løb fra fil +Importera fil = Importer fil +Importera från OCAD = Importer fra OCAD +Importera från fil = Importer fra fil +Importera laguppställningar = Importer holdopstillinger +Importera löpardatabas = Importer løberdatabase +Importera löpare = Importer løbere +Importera löpare och klubbar / distriktsregister = Importer løbere og klubber +Importera stämplingar = Importer stemplinger +Importera tävling = Importer løb +Importera tävlingsdata = Importer løbsdata +Importerar = Importerer +Importerar OCAD csv-fil = Importerer OCAD csv-fil +Importerar OE2003 csv-fil = Importerer OE2003 csv-fil +Importerar OS2003 csv-fil = Importerer OS2003 csv-fil +Importerar anmälningar (IOF, xml) = Importerer tilmeldinger (IOF, XML) +Importerar banor (IOF, xml) = Importerer baner (IOF, XML) +Importerar klasser (IOF, xml) = Importerer klasser (IOF, XML) +Importerar klubbar (IOF, xml) = Importerer klubber (IOF, XML) +Importerar tävlingsdata (IOF, xml) = Importerer løbsdata (IOF, XML) +Importerbara = Importerbare formater +Index = Index +Index in X[index] = Indeks i X[index] +Individual Example = Eksempel på individuelt resultat +Individual results in a club = Individuelle resultater for i klub. +Individuell = Individuel +Individuell resultatlista, alla lopp = Individuel resultatliste, alle løb +Individuell resultatlista, sammanställning av flera lopp = Individuel resultatliste, sammentælling af flere løb +Individuell resultatlista, visst lopp = Individuel resultatliste, bestemt løb +Individuell resultatlista, visst lopp (STOR) = Individuel resultatliste, bestemt løb (STOR) +Individuell startlista, visst lopp = Individuel startliste, bestemt løb +Individuell tävling = Individuelt løb +Individuella deltagare = Individuelle deltagere +Individuella resultat = Individuelle resultater +Individuella slutresultat = Individuelle slutresultater +Individuella totalresultat = Individuelle totalresultater +Individuellt, gafflat = Individuelt, gaflet +Info = Information +Inga = Ingen +Inga bommar registrerade = +Inga deltagare = Ingen deltagere +Inga vakanser tillgängliga. Vakanser skapas vanligen vid lottning = Ingen vakante. Vakante pladser oprettes normalt ved lodtrækning +Ingen = Ingen +Ingen / okänd = Ingen / ukendt +Ingen bana = Ingen bane +Ingen deltagare matchar sökkriteriet = Ingen deltagere matcher søgekriteriet +Ingen deltagare vald = Ingen deltagere valgt +Ingen klass = Ingen klasse +Ingen klass vald = Ingen klasse valgt +Ingen löpare saknar bricka = Ingen løbere mangler SI-brik +Ingen matchar 'X' = Ingen matcher 'X' +Ingen rogaining = Ingen pointløb +Inget nummer = Intet nummer +Inkommande = Indkommende +Inläst bricka ställd i kö = Aflæst brik sat i kø +Inlästa brickor = Aflæste brikker +Inmatning av mellantider = Indtastning af mellemtider +Inmatning online = Online indlæsning +Input Results = Input resultater +Input Results - X = Input resultater - X +Inspekterar klasser = Undersøger klasser +Installera = Installer +Installerbara listor = Installerbare lister +Inställningar = Indstillinger +Inställningar MeOS = MeOS, Opsætning +Inställningar startbevis = Instilliger for udskrift af startkvittering +Inställningar sträcktidsutskrift = Indstilling af stræktidsudskrifter +Interaktiv inläsning = Interaktiv indlæsning +Intervall = Interval +Intervall (sekunder). Lämna blankt för att uppdatera när tävlingsdata ändras = Interval (sekunder). Efterlad blank for at opdatere når løbsdata ændres +Intervallet måste anges på formen MM:SS = Intervallet skal angives som MM:SS +Invalid operator X = Ugyldig operator X +Italic = Kursiv +ItalicMediumPlus = Kursiv, større +Ja = Ja +Jag sköter lottning själv = Jeg foretager lodtrækning manuelt +Jaktstart = Jagtstart +Justera blockvis = Blokvis justering +Justera mot = Juster i forhold til +Jämna klasser (placering) = Udjævn klasser (placering) +Jämna klasser (ranking) = Udjævn klasser (ranking) +Jämna klasser (tid) = Udjævn klasser (tid) +Klart = Færdig +Klart. Antal importerade: X = Færdig. Antal importerede: X +Klart. X deltagare importerade = Færdig. X deltagere importeret +Klart. X lag importerade = Færdig. X hold importeret +Klart. X patruller importerade = Færdig. X patruljer importeret +Klart: alla klasser lottade = Færdig. Alle klasser er lodtrukne. +Klart: inga klasser behövde lottas = Færdig: Ingen klasser behøvede lodtrækning +Klass = Klasse +Klass %d = Klasse %d +Klass / klasstyp = Klasse / Klassetype +Klass X = Klasse X +Klass att slå ihop = Klasser der slås sammen +Klass saknad = Manglende klasse +Klassbyte = Skift af klasse +Klassen 'X' har jaktstart/växling på första sträckan = Klassen 'X' har jagtstart/skifte på første tur +Klassen X är individuell = Klassen X er individuel +Klassen används och kan inte tas bort = Klassen er i brug og kan ikke fjernes +Klassen lottas inte, startstämpling = Der foretages ikke lodtrækning i klassen, brug startstempling +Klassen måste ha ett namn = Klassen skal have et navn +Klassen saknas = Klassen mangler +Klassens bana = Klassens bane +Klasser = Klasser +Klasser (IOF, xml) = Klasser (IOF, XML) +Klasser där nyanmälningar ska överföras = Klasser hvortil nytilmeldinger skal overføres +Klassinställningar = Klasseindstillinger +Klassnamn = Klassenavn +Klasstyp = Klassetype +Klassval = Valg af klasse +Klientnamn = Klientnavn +Klistra in = Indsæt +Klistra in data från urklipp (X) = Indsæt fra udklipsholder (X) +Klocktid: X = Urtid: X +Klubb = Klub +Klubb att ta bort = Klub der fjernes +Klubb: X = Klub: X +KlubbId = Klub Id +Klubbar = Klubber +Klubbar (IOF, xml) = Klubber (IOF, XML) +Klubbar som inte svarat = Klubber som ikke har svaret +Klubbdatabasen = Klubdatabasen +Klubblös = Uden klub +Klubbresultat = Klubresultater +Klubbresultatlista = Klubresultatliste +Klubbresultatlista - %s = Klubresultatliste - %s +Klubbstartlista = Klubstartliste +Klubbstartlista - %s = Klubstartliste - %s +Klungstart = Gruppevis start +Knyt automatiskt efter inläsning = Knyt automatisk sammen efter aflæsning +Knyt bricka / deltagare = Knyt brik til løber +Knyt löpare till sträckan = Knyt løbere til turen +Knyt löparna till banor från en pool vid målgång = Knyt løbere til valgfrie baner ved målgang +Knyt redan anmälda deltagare till laget (identifiera genom namn och/eller bricka) = Tilknyt tilmeldte deltagere til holdet (identificeres ved navn og/eller brik) +Kod = Kode +Kom ihåg listan = Husk listen +Kommentar / version = Kommentar / Version +Kommunikation = Kommunikation +Kontant = Kontant +Kontant betalning = Kontant betaling +Konto = Konto +Kontroll = Post +Kontroll %s = Post %s +Kontroll X = Post X +Kontroll inför tävlingen = Kontrol før løbet +Kontrollen används och kan inte tas bort = Posten er i brug og kan ikke fjernes +Kontrollens ID-nummer = Postens ID-nummer +Kontroller = Poster +Kontrollmappning = Mappning af postenheder +Kontrollnamn = Postnavn +Kontrollrapport - X = Postrapport - X +Koordinater (mm) för adressfält = Koordinater (mm) for adressefelt +Kopia (X) = Kopi (X) +Kopia X = Kopi X +Kopiera länken till urklipp = Kopier link til udklipsholder +Kopiera selektionen till urklipp (X) = Kopier det valgte til udklipsholder (X) +Koppla ifrån = Afbryd +Koppla ner databas = Luk database +Kopplar ifrån SportIdent på = Afbryder SPORTident på +Kortast teoretiska startdjup utan krockar är X minuter = Korteste teoretiske startdybde uden sammenfald er X minutter +Kortnamn = Forkortet navn +Kunde inte ansluta till Eventor = Kunne ikke forbinde til Eventor +Kunde inte ladda X\n\n(Y) = Kunne ikke indlæse X\n\n(Y) +Kunde inte ladda upp tävlingen (X) = Kunne ikke uploade løbet (X) +Kunde inte öppna tävlingen = Kan ikke åbne løbet +Kvar-i-skogen = Løbere i skoven +Kvinna = Kvinde +Kvinnor = Kvinder +Källa = Kilde(fra) +Källkatalog = Mappe at hente fra +Kön = Køn +Kör kontroll inför tävlingen = Foretag kontrol før løbet +Ladda upp öppnad tävling på server = Upload åbnet løb til server +Lag = Hold +Lag %d = Hold %d +Lag(flera) = Hold +Laget 'X' saknar klass = Der er ikke angivet klasse for holdet 'X' +Laget hittades inte = Holdet blev ikke fundet +Lagmedlem = holddeltager +Lagnamn = Holdnavn +Lagrade säkerhetskopior = Gemte sikkerhedskopier +Laguppställning = Holdopstilling +Laguppställningen hade fel, som har rättats = Der var fejl i holdopsætningen som er blevet rettet +Land = Land +LargeFont = Stor tekst +Latest Results = Seneste resultarter +Latitud = Breddegrad +Leg X = Stræk X +Leg X: Do not modify = Stræk X: Ingen ændring +Leg X: Use Y = Stræk X: Brug Y +Leg number in team, zero indexed = Stræk nummer på hold, nul indekseret +Legs = Stræk +Length of course = Banelængde +List Error: X = Fejlliste: X +Lista = Liste +Lista av typ 'X' = Liste af type 'X' +Lista med mellantider = Liste med mellemtider +Lista med sträcktider = Liste med stræktider +Listan kan inte visas = Listen kan ikke vises +Listan togs bort från tävlingen = Listen blev fjernet fra løbet +Listegenskaper = Egenskaber for liste +Listnamn = Listenavn +Listor = Lister +Listor i tävlingen = Lister brugt i løb +Listor och sammanställningar = Lister og sammentællinger +Listparameter = Liste parameter +Listpost = Listepost +Listredigerare = Liste editor +Listredigerare – X = Liste editor – X +Listrubrik = Listeoverskrift +Listtyp = Listetype +Listval = Listevalg +Liveresultat, deltagare = Live resultater, individuelt +Ljudfiler, baskatalog = Lydfiler, hovedmappe +Lokalt = Lokalt +Long = Lang +Longitud = Længdegrad +Lopp %d = Løb %d +Lopp %s = Løb %s +Lopp X = Løb X +Lopp-id = Løbs ID +Lotta = Træk lod +Lotta / starttider = Lodtrækning / starttider +Lotta flera klasser = Lodtrækning flere klasser +Lotta klassen = Lodtrækning, klasse +Lotta klassen X = Lodtrækning, klasse 'X' +Lotta löpare som saknar starttid = Lodtrækning blandt løbere der mangler starttid +Lotta om hela klassen = Ny lodtrækning for hele klassen +Lottad = Lodtrukken +Lottad startlista = Lodtrukken startliste +Lottar efteranmälda = Trækker lod blandt eftertilmeldte +Lottar: X = Trækker lod: X +Lottning = Lodtrækning +Lyssna = Lyt +Lyssnar på X = Lytter på X +Lägg till = Tilføj +Lägg till alla = Tilføj alle +Lägg till en ny rad i tabellen (X) = Tilføj række i tabellen (X) +Lägg till klasser = Tilføj klasser +Lägg till ny = Tilføj ny +Lägg till ny etapp = Tilføj ny etape +Lägg till rad = Tilføj række +Lägg till stämpling = Tilføj stempling +Lägger till klubbar = Tilføjer klubber +Lägger till löpare = Tilføjer løbere +Längd = Længde +Längd (m) = Længde (m) +Länk till resultatlistan = Link til resultatlisten +Länk till startlistan = Link til startlisten +Läs brickor = Læs brikker +Läser klubbar = Læser klubber +Läser löpare = Læser løbere +Långt namn = Langt navn +Låt de bästa start först = Lad de bedste starte først +Låt klassen ha mer än en bana eller sträcka = Lad klassen have mere end en bane eller en tur +Löpande = Løbende +Löpande information om viktiga händelser i tävlingen = Løbende information om vigtige begivenheder i løbet +Löparbricka %d = Løberbrik %d +Löpardatabasen = Løberdatabase +Löpare = Løber +Löpare per klass = Løbere pr. klasse +Löpare saknar klass eller bana = Løbere uden klasse eller brik +Löpare som förekommer i mer än ett lag = Løbere som forekommer på mere end et hold +Löpare utan SI-bricka: %d = Løbere uden SI-brik: %d +Löpare utan bana: %d = Løbere uden bane: %d +Löpare utan klass: %d = Løbere uden klasse: %d +Löpare utan klubb: %d = Løbere uden klub: %d +Löpare utan starttid: %d = Løbere uden starttid: %d +Löpare, Ej Start, med registrering (kvar-i-skogen!?) = Løbere, ikke startet, registreret (i skoven!?) +Löpare, Status Okänd, med registrering (kvar-i-skogen) = Løbere, Status ukendt, registreret (i skoven) +Löpare, Status Okänd, som saknar registrering = Løbere, Status ukendt, mangler registrering +Löpare: = Løber: +Löpare: X, kontroll: Y, kl Z = Løber: X, post: Y, kl: Z +Löparen hittades inte = Løber ikke fundet +Löptid = Løbstid +Lösenord = Password +Man = Mand +Manual point reductions and adjustments = Manuel pointreduktion og justering +Manual time penalties and adjustments = Manuelle tidsstraf og justeringer +Manuell = Manuel +Manuell inmatning = Manuel indtastning +Manuell lottning = Manuel lodtrækning +Manuella avgifter = Manuelle afgifter +Mapp = Mappe +Mappnamnet får inte vara tomt = Mappenavnet må ikke være tomt +Markera 'X' för att hantera deltagarna en och en = Marker med 'X' for at håndtere deltagerne enkeltvis +Mata in första nummerlappsnummer, eller blankt för att ta bort nummerlappar = Indtast første nummer for brystnumre, eller lad stå blank for at fjerne brystnumre +Mata in radiotider manuellt = Indtast radiotider manuelt +Matched control ids (-1 for unmatched) for each team member = Matchende kontrol id'er (-1 for umatchet) for hvert holdmedlem +Max antal gemensamma kontroller = Maks. antal fælles poster +Max parallellt startande = Maks. antal samtidigt startende +Max. vakanser (per klass) = Maks. vakante (pr klasse) +Maxbom = Maks. bom +Maximal tid efter ledaren för att delta i jaktstart = Maks. tid efter førende løber for at deltage i jagtstart +Maximum allowed running time = Maksimal løbstid +Maxtid = Maks.tid +Maxtid efter = Maks. tid efter +MeOS = MeOS +MeOS Features = MeOS Specialfunktioner +MeOS Funktioner = MeOS Funktioner +MeOS Three Days Race X = MeOS Tredages Løb X +MeOS lokala datakatalog är = MeOS lokale datamappe er +MeOS – Funktioner = MeOS – Funktioner +MeOS – Resultatkiosk = MeOS – Resultatformidling +Med anmälningsavgift (lagets klubb) = Med tilmeldingsafgift (holdets klub) +Med avkortning = Med afkortning +Med km-tid = Med km-tid +Med stafettklasser = Med stafetklasser +Med sträcktidsanalys = Med stræktidsanalyse +Medianbom = Median bom +Medium = Mellem +MediumFont = Medium tekst +MediumPlus = Noget større tekst +Medlöpare = Medløber +Mellantider visas för namngivna kontroller = Mellemtider vises for navngivne poster +Metod = Metode +Min. vakanser (per klass) = Min. vakante (pr klasse) +Minitid = Min. tid +Minst MySQL X krävs. Du använder version Y = MeOS kræver MySQL X eller nyere. Du bruger version Y +Minsta intabbning = Mindste indrykning +Minsta intervall i klass = Korteste interval i klasse +Minsta startintervall = Korteste startinterval +Minsta sträcktid = Korteste stræktid +Minutstartlista = Minutstartliste +Misslyckades med att ladda upp onlineresultat = Kunne ikke flytte resultater op online +Motion = Motion +Multipel = Multiple +MySQL Server / IP-adress = MySQL Server / IP-addresse +Män = Mænd +Mål = Mål +Målfil = Destinationsfil +Målstämpling saknas = Manglende målstempling +Måltid = Måltid +Måltid saknas = Måltid mangler +Måltid: X = Måltid: X +N.N. = N.N. +Name of result module = Navn på resultatmodul +Namn = Navn +Namn och tidpunkt = Navn og løbsperiode +Namnet kan inte vara tomt = Navn må ikke være tomt +Narrow Results = Smal resultatliste +Nationalitet = Nationalitet +Nationality = Nationalitet +Nej = Nej +New Result Module = Nyt resultatmodul +New Set of Result Rules = Nyt sæt resultatregler +Nollställ avgifter = Nulstil afgifter +Nollställ databaser = Nulstil databaser +Nollställde avgift för X deltagare = Nulstillede afgifter for X deltager(e) +Nolltid = Nultid +None = Ingen +Normal = Normal +NormalFont = Normal tekst +Normalavgift = Normal afgift +Not implemented = Ikke implementeret +Not yet implemented = Endnu ikke tilgægelig +Nr = Nummer +Number of shortenings = Antal afkortninger +Nummerlapp = Brystnummer +Nummerlapp, SI eller Namn = Brystnummer, SI-brik eller Navn +Nummerlapp, lopp-id eller namn = Brystnummer, løbsnummer eller navn +Nummerlappar = Brystnumre +Nummerlappar i X = Brystnumre i X +Nuvarande innehavare: X = Nuværende indehaver: X +Ny bana = Ny bane +Ny deltagare = Ny deltager +Ny klass = Ny klasse +Ny klubb = Ny klub +Ny kontroll = Ny post +Ny lista = Ny liste +Ny tävling = Nyt løb +Nyckel för Eventor = Eventor nøgle +Nytt fönster = Nyt vindue +Nytt lag = Nyt hold +Nästa = Næste +Nästa etapp = Næste etape +Nästa försök = Næste forsøg +OE Semikolonseparerad (csv) = OE semikolonsepareret (csv) +OK = OK +OL-Skytte med tidstillägg = Biatlon med tidstillæg +OL-Skytte stafettresultat = Biatlon, stafetresultat +OL-Skytte utan tidstillägg = Biatlon uden tidstillæg +Oberoende = Uafhængig +Ogiltig banfil. Kontroll förväntad på position X, men hittade 'Y' = Ugyldig banefil. Post forventet på position X, men fandt 'Y' +Ogiltig funktion = Ugyldig funktion +Ogiltig föregående/efterföljande etapp = Ugyldig foregående / efterfølgende etape +Ogiltig första starttid. Måste vara efter nolltid = Ugyldig første starttid. Skal være efter nultid. +Ogiltig kontrollkod = Ugyldigt nummer på postenhed +Ogiltig omstartstid = Ugyldig efterstartstid +Ogiltig repdragningstid = Ugyldig tid for sidste skift +Ogiltig starttid i 'X' på sträcka Y = Ugyldig starttid i 'X' på tur Y +Ogiltig starttid: X = Ugyldig starttid: X +Ogiltig storlek på seedningsgrupper X = Ugyldig størrelse på seeding gruppe: X +Ogiltig tid = Ugyldig tid +Ogiltigt basintervall = Ugyldigt basis interval +Ogiltigt bricknummer = Ugyldigt briknummer +Ogiltigt bricknummer X = Ugyldigt briknummer X +Ogiltigt filformat = Ugyldigt filformat +Ogiltigt lag på rad X = Ugyldigt hold i linje X +Ogiltigt maximalt intervall = Ikke tilladt maksimalt interval +Ogiltigt minimalt intervall = Ikke tilladt minimalt interval +Okänd = Ukendt +Okänd bricka = Ukendt brik +Okänd funktion = Ukendt funktion +Okänd klass = Ukendt klasse +Okänd klass på rad X = Ukendt klasse i linje X +Okänd klubb med id X = Ukendt klub med id X +Om MeOS = Om MeOS +Om MeOS – ett Mycket Enkelt OrienteringsSystem = Om MeOS – et Meget Enklere Orienterings System +Omstart = Efterstart +Omstart i stafettklasser = Efterstart i stafetklasser +Omstartstid = Efterstartstid +Omvänd jaktstart = Omvendt jagtstart +Online Input Error X = Online inddata fejl X +Online Results Error X = Onlineresultatsfejl X +Onlineinput = Online inddata +Onlineresultat = Onlineresultat +Onlineservern svarade felaktigt = Online server gav uventet svar (Forkert konfiguration?) +Onlineservern svarade: Felaktigt lösenord = Online server svarede: Forkert password +Onlineservern svarade: Felaktigt tävlings-id = Online server svarede: forkert konkurrence-id +Onlineservern svarade: Serverfel = Online server svarede: server fejl +Onlineservern svarade: ZIP stöds ej = Online server svarede: Zip-formet understøttes ikke. +Oordnade parallella sträckor = Ikke sorterede parallelle stræk +Oparad = Uparret +Open = Åben +Open X = Åben X +Open a Copy = Åbn som kopi +Operationen misslyckades = Handlingen mislykkedes +Operationen stöds ej = Handlingen understøttes ikke +Optimerar startfördelning = Optimerer startfordeling +Ordinarie anmälningsdatum = Ordinær tilmeldingsdato +Ordinarie avgift = Ordinær afgift +Ordnat = Ordnede +Organisation = Organisation +Organisatör = Arrangør +Oväntad kontroll 'X' i bana Y = Uventet post 'X' på bane Y +PDF = PDF +Packa stora filer (zip) = Komprimer store filer (zip) +Packar upp löpardatabas = Pakker løberdatabase ud +Par- eller singelklass = Par- eller singleklasse +Para ihop = Dan par +Para ihop bricka X med en deltagare = Par brik X med en deltager +Parallell = Parallel +PatrolClubNameNames = Deltagers (eller patruljes) klub(ber) +PatrolNameNames = Deltagers (eller patruljes) navn(e) +Patrols = Patruljer +Patrull = Patrulje +Patrull, 1 SI-pinne = Patrulje, 1 SI-brik +Patrull, 2 SI-pinnar = Patrulje, 2 SI-brikker +Personer = Personer +Plac. = Plac. +Place on course leg = Placering på strækket +Placering = Placering +Placering in = Placering i +Plats = Plads +Point calculation for runner = Pointberegning for løber +Point calculation for team = Pointberegning for hold +Points as computed by your point method = Point udregnet efter din beregningsmetode +Port = Port +Port för TCP = Port for TCP +Portable Document Format (PDF) = Portable Document Format (PDF) +Postadress = Postadresse +Postkod = Postnummer +Poäng = Points +Poäng in = Points i +Poängavdrag = Pointfradrag +Poängavdrag (per minut) = Pointfradrag (pr minut) +Poängavdrag per påbörjad minut = Pointfradrag for hvert påbegyndt minut +Poänggräns = Pointgrænse +Poängjustering = Pointjustering +Prel. bomtid = Forel. tidstab +Prel. placering = Forel. placering +Prepare start lists = Forbered startliste +Press Enter to continue = Tast for at fortsætte +Print Card Data = Udskriv brikdata +Print card data = Udskriv brikdata +Prioritering = Prioritering +Prisutdelningslista = Prisuddelingsliste +Programinställningar = Programindstillinger +Prolog + jaktstart = Prolog + jagtstart +Prologue + Pursuit = Prolog + Jagtstart +Publicera resultat = Offentliggør resultat +Publicera resultat direkt på nätet = Publicer resultater på nettet med løbende +Publicera resultat och sträcktider på Eventor och WinSplits online = Offentligør resultat og stræktider på Eventor og WinSplits online +Publicera startlista = Offentliggør startliste +Publicera startlistan på Eventor = Offentliggør startliste på Eventor +Publicerar resultat = Offentliggør resultat +Publicerar startlistan = Offentliggører startlisten +Punch codes for each team member = Stempelkoder for hvert holdmedlem +Punch times for each team member = Stempeltider for hvert holdmedlem +PunchControlCode = Postenheds kode +PunchControlNumber = Post nummer +PunchControlPlace = Placering, tur, ved post +PunchControlPlaceAcc = Samlet placering, ved post +PunchLostTime = Tidstab ved post +PunchNamedTime = Navngivet mellemtid +PunchTime = Stemplingstid +Punches = Stemplinger +På banan = På banen +Rader markerade med (*) kommer från en lista i tävlingen = Rækker mærket med (*) kommer fra en liste tilknyttet løbet +Radera = Slet +Radera alla klubbar = Slet alle klubber +Radera alla klubbar och ta bort klubbtillhörighet = Slet alle klubber og klubmedlemsskaber +Radera listan från aktuell tävling = Slet listen fra dette løb +Radera permanent = Slet permanent +Radera starttider = Slet starttider +Radera tävlingen = Slet løbet +Radera vakanser = Slet vakante +Radiotider, kontroll = Radiotider, post +Ranking = Rangliste +Ranking (IOF, xml) = Rangliste (IOF, XML) +Rapport inför = Rapport før +Rapporter = Rapporter +Rapportläge = Rapportindstilling +Red. avg. efteranm = Red.efteranm.afg. +Red. avgift = Red. afgift +Redigera = Ret +Redigera deltagaren = Rediger løberen +Redigera lista = Rediger liste +Redigera listpost = Rediger listepost +Redigera sträcklängder = Rediger længde af stræk +Redigera sträcklängder för X = Rediger længder af stræk for 'X' +Reducerad avg = Reduceret afgift +Reduktionsmetod = Reduktionsmetode +Region = Region +Regler för resultatuträkning = Regler for resultatberegning +Regler för resultatuträkning - X = Regler for resultatberegning - X +Relativ skalfaktor för typsnittets storlek i procent = Relativ faktor for skalering af font (procent) +Relay Example = Stafet eksempel +Relays = Stafetter +Rep = Sidste veksling +Reparera vald tävling = Reparer valgte løb +Reparerar tävlingsdatabasen = Reparerer løbsdatabasen +Repdragningstid = Tidspunkt for sidste skift +Repdragningstiden måste ligga före omstartstiden = Tidspunkt for sidste skift skal ligge før efterstarttidspunktet +Reserverade = Reserveret +Result Calculation = Resultatberegning +Result Module – X = Resultatmodul – X +Result Modules = Resultatmoduler +Result module identifier = Resultatmodul ID +Result score calculation for runner = Resultatberegning for løber +Result score calculation for team = Resultatberegning for hold +ResultDescription = Navn på resultattype +ResultModuleNumber = Resultatmodul: Nummer +ResultModuleNumberTeam = Resultat Modul: Placering (for hold) +ResultModuleTime = Resultmodul: Tid +ResultModuleTimeTeam = Resultat Modul: Samlet tid (for hold) +Resultat = Resultater +Resultat && sträcktider = Resultater && stræktider +Resultat (STOR) = Resultater (STOR) +Resultat - %s = Resultater - %s +Resultat - X = Resultater - X +Resultat banvis per klass = Resultater banevis pr klasse +Resultat efter klass och bana - X = Resultat efter klasse og bane - X +Resultat efter sträcka X = Resultat efter tur X +Resultat efter sträckan = Resultat efter turen +Resultat från tidigare etapper = Resultater fra tidligere etaper +Resultat för ett visst lopp = Resultater for et bestemt løb +Resultat lopp X - Y = Resultater løb X - Y +Resultat online = Resultater online +Resultat per bana = Resultater pr bane +Resultat per bana - X = Resultater pr bane - X +Resultat vid målstämpling = Resultater efter målstempling +Resultat, generell = Resultater, generelt +Resultat, individuell = Resultater, individuelle +Resultat, patrull = Resultater, patrulje +Resultatkiosk = Resultatformidling +Resultatlista - %s = Resultatliste - %s +Resultatlista – inställningar = Resultatliste – indstillinger +Resultatlistor = Resultatlister +Resultatmodulen används i X = Resultatmodulet bruges i X +Resultatuträkning = Resultatberegning +Resultatutskrift = Udskriv resultater +Resultatutskrift / export = Udskriv resultater / eksport +Rogaining = Pointløb +Rogaining points for each team member = Pointløbs points for hvert holdmedlem +Rogaining, individuell = Pointløb, individuelt +Rogaining-poäng = Points +RogainingPunch = Stempling, pointløb +Rogainingresultat - %s = Rogaining resultater - %s +Rubrik = Overskrift +Rulla upp och ner automatiskt = Rul op og ned automatisk +Runner = Løber +Runner's card, matched control ids (-1 for unmatched punches) = Løbers SI-brik, matchende kontrol id'er (-1 for ikke matchende stemplinger) +Runner's card, punch codes = Løbers SI-brik, stempelkoder +Runner's card, punch times = Løbers SI-brik, stempeltider +Runner's course = Løbers bane +Runner's method output numbers = Løber metode - output numre +Runner's method output times = Løber metode, output tider +Runner's split times = Løbers mellemtider +Runner's total running time to control = Løbers samlede løbstid til post +Runner/team fee = Løber/hold afgift +Runner/team finish time = Løber/hold sluttid +Runner/team input place = Løber/hold indgående placering +Runner/team input points = Løber/hold indgående points +Runner/team input running time = Løber/hold indgående løbstid +Runner/team input status = Løber/hold indgående status +Runner/team place = Løber/hold placering +Runner/team rogaining overtime = Løber/hold pointløbs tidsoverskridelse +Runner/team rogaining points = Løber/hold pointløbs point +Runner/team rogaining points adjustment = Løber/hold pointløbs points justering +Runner/team running time = Løber/hold løbstid +Runner/team start time = Løber/hold starttid +Runner/team status = Løber/hold status +Runner/team time adjustment = Løber/hold tidsjustering +Runner/team total place = Løber/hold samlet placering +Runner/team total running time = Løber/hold samlet løbstid +Runner/team total status = Løber/hold samlet status +RunnerAge = Løbers alder +RunnerBib = Løbers brystnummer +RunnerBirthYear = Løbers fødselsår +RunnerCard = Briknummer +RunnerClassCoursePlace = Placering på bane indenfor klasse +RunnerClassCourseTimeAfter = Tid efter på bane indenfor klasse +RunnerClub = Løbers klub +RunnerCompleteName = Fulde navn +RunnerCourse = Løbers bane +RunnerFamilyName = Efternavn +RunnerFee = Startafgift +RunnerFinish = Løbers måltid +RunnerGeneralPlace = Hold eller individuel løbers placering +RunnerGeneralTimeAfter = Hold eller individuel løbers tid efter +RunnerGeneralTimeStatus = Hold eller individuel løbers tid /status +RunnerGivenName = Fornavn +RunnerGlobal = Løber (klasser sammenlagt) +RunnerLeg = Løber (specifik tur) +RunnerLegNumberAlpha = Formateret turnummer +RunnerName = Løbers navn +RunnerNationality = Løbers nationalitet +RunnerPhone = Løbers telefonnummer +RunnerPlace = Løbers placering +RunnerPlaceDiff = Løbers placering, forskel +RunnerPointAdjustment = Løbers pointjustering +RunnerRank = Rangliste +RunnerRogainingOvertime = Løbers tidsoverskridelse(pointløb) +RunnerRogainingPoint = Points +RunnerRogainingPointTotal = Løbers total points +RunnerRogainingReduction = Løbers pointsfradrag +RunnerSex = Løbers køn +RunnerStart = Løbers starttid +RunnerStartNo = Løbers startnummer +RunnerTempTimeAfter = Løbers tid efter ved udvalgt post +RunnerTempTimeStatus = Løbers tid / status ved udvalgt post +RunnerTime = Løbers tid +RunnerTimeAdjustment = Løbers tidsjustering +RunnerTimeAfter = Løbers tid efter +RunnerTimeAfterDiff = Løbers tid efter, forskel +RunnerTimeLost = Løbers mistede tid +RunnerTimePerKM = Tempo min/km +RunnerTimePlaceFixed = Tidspunkt hvor løbers placering er endelig +RunnerTimeStatus = Løbers tid / status +RunnerTotalPlace = Løbers totalplacering +RunnerTotalTime = Løbers totaltid +RunnerTotalTimeAfter = Løbers totaltid efter +RunnerTotalTimeStatus = Løbers totaltid / status +RunnerUMMasterPoint = Uppsala möte, mesterskabspoints +Running time for each team member = Løbstid for hvert holdmedlem +SI X inläst. Brickan tillhör Y som saknar klass = SI X blev aflæst. Brikken tilhører Y, der mangler klasse +SI X inläst. Brickan är inte knuten till någon löpare (i skogen) = SI X blev aflæst. Brikken er ikke tilknyttet nogen løber (i skoven) +SI X är redan inläst. Använd interaktiv inläsning om du vill läsa brickan igen = SI X er allerede aflæst. Brug interaktiv aflæsning for at aflæse igen. +SI X är redan inläst. Ska den läsas in igen? = SI X er allerede aflæst. Læs den igen? +SI på = SI på +SI-dubbletter: %d = SI-dubletter: %d +SOFT-avgift = DO-F afgift +SOFT-lottning = Svensk lodtrækning +Saknad starttid = Manglende starttid +Samma = Samme +Sammanställning = Sammenfatning +Sammanställning, ekonomi = Sammenfatning, økonomi +Sammanställning, klasser = Sammenfatning, klasser +Samtliga deltagare tilldelades resultat = Samtlige deltagere blev tildelt et resultat +Save = Gem +Save changes = Gem ændringer +Save changes in rule code? = Gem ændringer i regelkode? +Seedad lottning = Seedet lodtrækning +Seedningsgrupper = Seedningsgrupper +Seedningskälla = Kilde til seedning +Sekundär typ = Sekundær type +Selektionens storlek matchar inte urklippets storlek. Klistra in i alla fall? = Det valgte områdes størrelse matcher ikke udklippets størrelse. Sæt ind alligevel? +Semikolonseparerad (csv) = Semikolon separeret (csv) +Sen avgift = Eftertilm. +Sen red. avgift = Red.eftertilm. +Server = Server +Server: [X] Y = Server: [X] Y +Several MeOS Clients in a network = Flere MeOS-klienter i et netværk +Several races for a runner = Flere løb for en løber +Several stages = Flere etaper +Short = Kort +Shortest time in class = Korteste tid i klassen +Show forking = Vis gaflinger +Sidbrytning mellan klasser = Sideskift mellem klasser +Sidbrytning mellan klasser / klubbar = Sideskift mellem klasser / klubber +Simulera inläsning av stämplar = Simuler aflæsning af stemplinger +Sista betalningsdatum = Sidste betalingsdato +Sista ordinarie anmälningsdatum = Sidste ordinære tilmeldingsdato +Sista start (nu tilldelad) = Sidste start (nu tildelt) +Sista start (nu tilldelad): X = Sidste start (nu tildelt): X +Sista sträckan = Sidste tur +Ska X raderas från tävlingen? = Skal X fjernes fra løbet? +Skalfaktor = Skaleringsfaktor +Skapa = Opret +Skapa anonyma lagmedlemmar = Opret anonyme deltagere på hold +Skapa en ny tävling med data från Eventor = Dan et nyt løb med data fra Eventor +Skapa en ny, tom, tävling = Opret et nyt, tomt, løb +Skapa fakturor = Dan fakturaer +Skapa generell lista = Opret generel liste +Skapa listan = Opret listen +Skapa ny klass = Opret ny klasse +Skapa tävlingen = Opret løb +Skapad av = Oprettet af +Skapade en bana för klassen %s med %d kontroller från brickdata (SI-%d) = Oprettede en bane for klassen %s med %d poster ud fra SI-%d +Skapade en lokal kopia av tävlingen = Oprettede en lokal kopi af løbet +Skapar ny etapp = Opretter ny etape +Skapar ny tävling = Opretter nyt løb +Skapar saknad klass = Opretter manglende klasse +Skapar tävling = Opretter løb +Skattad avgift = Beskattet afgift +Skicka och ta emot snabb förhandsinformation om stämplingar och resultat = Send og modtag hurtig forhåndsinformation om stemplinger og resultater +Skicka till webben = Overfør til Web'en +Skippar lottning = Springer over lodtrækning +Skript = Script +Skript att köra efter export = Script til at køre efter eksport +Skriv endast ut ändade sidor = Udskriv kun ændrede sider +Skriv första bokstaven i klubbens namn och tryck pil-ner för att leta efter klubben = Skriv første bogstav i klubbens navn og tryk pil-ned for at finde klubben +Skriv första starttid på formen HH:MM:SS = Skriv første starttid på formen HH:MM:SS +Skriv ut = Udskriv +Skriv ut alla = Udskriv alle +Skriv ut dem utan e-post = Udskriv dem uden e-post +Skriv ut ej accepterade elektroniska = Udskriv ikke accepterede elektroniske +Skriv ut eller exportera listan automatiskt = Udskriv eller eksporter listen automatisk +Skriv ut fakturan = Udskriv fakturaen +Skriv ut listan = Udskriv listen +Skriv ut nu = Udskriv nu +Skriv ut rapporten = Udskriv rapporten +Skriv ut startbevis = Udskriv Startkvittering +Skriv ut startbevis för deltagaren = Udskrive startkvittering for løberen +Skriv ut sträcktider = Udskriv stræktider +Skriv ut tabellen = Udskriv tabellen +Skriv ut tabellen (X) = Udskriv tabellen (X) +Skriv över existerande bricknummer? = Overskriv eksisterende briknummer? +Skrivare = Printer +Skrivarinställningar = Printer indstilling +Skrivarinställningar för sträcktider = Printerindstillinger for stræktider +Skrivarinställningar för sträcktider och startbevis = Printerinstillinger for stræktider og startkvittering +Skriver sträcktider när tävlingsdata ändras = Skriver stræktider så snart løbsdata ændrer sig +Skriver sträcktider om = Udskriver stræktider om +Slutresultat = Endelige resultater +Sluttid = Sluttid +Slå ihop = Slå sammen +Slå ihop klass: X = Slå klasse X sammen +Slå ihop klass: X (denna klass behålls) = Slå klasse X sammen: (behold denne klasse) +Slå ihop klasser = Slå klasser sammen +Slå ihop klubb = Slå klub sammen +Slå ihop text med föregående = Slå tekst sammen med foregående +SmallFont = Lille skrifttype +SmallItalic = Lille, kursiv skrifttype +Snabbinställningar = Hurtigindstillinger +SortNameOnly = navn +Sortering = Sorterer +Sortering: %s, antal rader: %d = Sorterer: %s, antal rækker: %d +Source code = Kildekode +Spara = Gem +Spara anmälningar = Gem tilmeldinger +Spara den här listan som en favoritlista = Gem denne liste som en foretrukken liste +Spara fil = Gem fil +Spara för webben = Gem web dokument +Spara i aktuell tävling = Gem i aktuelt løb +Spara laguppställningar = Gem holdopstillinger +Spara på disk = Gem på disk +Spara som = Gem som +Spara som PDF = Gem som PDF +Spara som fil = Gem som fil +Spara sträcktider till en fil för automatisk synkronisering med WinSplits = Gem stræktider i en fil for automatisk synkronisering med WinSplits +Spara tid = Gem tid +Sparade listval = Gemte listevalg +Speaker = Speaker +Speakerstöd = Speaker funktion +SportIdent = SPORTident +Språk = Sprog +Stad = By +Stafett = Stafet +Stafett (sammanställning) = Stafet (sammenfatning) +Stafett - sammanställning = Stafet - sammenfatning +Stafett - sträcka = Stafet - tur +Stafett - total = Stafet - total +Stafettklasser = Stafetklasser +Stafettresultat = Stafet Resultater +Stafettresultat, delsträckor = Stafetresultater, delstræk +Stafettresultat, lag = Stafetresulater, hold +Stafettresultat, sträcka = Stafetresultater, tur +Stafettresultat, sträcka (STOR) = Stafetresultater, tur (STOR) +Standard = Standard +Start = Start +Start nr = Start nr +Start time for each team member = Starttid for hvert holdmedlem +Start: X = Start: X +StartTime = Starttid, navn +StartTimeForClass = Fælles starttid, klasse +Starta = Start +Starta automaten = Start autofunktion +Starta en guide som hjälper dig göra klassinställningar = Start en guide som hjælper dig med at foretage klasseindstillinger +Startade automater = Startede autofunktioner +Startande = Startende +Startar SI på = Starter SI på +Startbevis = Startkvittering +Startbevis X = Startkvittering X +Startblock = Startblok +Startblock: %d = Startblok: %d +Startintervall = Startinterval +Startintervall (min) = Startinterval (min) +Startintervallet får inte vara kortare än basintervallet = Startinterval må ikke være kortere end basisintervallet +Startlista = Startliste +Startlista %%s - sträcka %d = Startliste %%s - tur %d +Startlista - %s = Startliste - %s +Startlista - X = Startliste - X +Startlista ett visst lopp = Startliste for et bestemt løb +Startlista lopp X - Y = Startliste løb X - Y +Startlista, individuell = Startliste, individuel +Startlista, patrull = Startliste, patruljer +Startlista, stafett (lag) = Startliste, stafet (hold) +Startlista, stafett (sträcka) = Startliste, stafet (tur) +Startlistor = Startlister +Startmetod = Startmetode +Startnamn = Start navn +Startnummer = Startnummer +Starttid = Starttid +Starttid (HH:MM:SS) = Starttid (HH:MM:SS) +Starttid: X = Starttid: X +Starttiden är upptagen = Starttiden er optaget +Starttyp = Start type +Status = Status +Status OK = Status OK +Status as computed by your status method = Status som udregnet efter din statusmetode +Status calculation for runner = Statusberegning for løber +Status calculation for team = Statusberegning for hold +Status code for a missing punch = Statuskode for manglende stempling +Status code for a time over the maximum = Statuskode for tid over maksimumtid +Status code for a valid result = Statuskode for et gyldigt resultat +Status code for an unknown result = Statuskode for et ukendt resultat +Status code for disqualification = Statuskode for diskvalifikation +Status code for not competing = Statuskode for ikke deltaget +Status code for not finishing = Statuskode for udgået +Status code for not starting = Statuskode for ikke startet +Status for each team member = Status for hvert holdmedlem +Status in = Status ind +Status matchar inte data i löparbrickan = Status matcher ikke data i SI-brikken. +Status matchar inte deltagarnas status = Status matcher ikke deltagerens status. +Stoppa automaten = Stop autofunktionen +Stor = Stor +Str. = Str. +Str. %d = Str. %d +Str. X = Tur X +String = Tekst +Struken = Afbud +Struken med återbetalning = Afbud med tilbagebetaling +Struken utan återbetalning = Afbud uden tilbagebetaling +Strukturerat exportformat = Struktureret eksportformat +Strukturerat webbdokument (html) = Struktureret webdokument (html) +Sträcka = Tur +Sträcka %d = Tur %d +Sträcka X = Tur X +Sträcka att lotta = Ture til lodtrækning +Sträckans banor = Strækkets baner +Sträcktider = Stræktider +Sträcktider (WinSplits) = Stræktider (WinSplits) +Sträcktider / WinSplits = Stræktider / WinSplits +Sträcktider/WinSplits = Stræktider/WinSplits +Sträcktidsfil = Stræktidsfil +Sträcktidsutskrift = Udskriv stræktider +Sträcktidsutskrift[check] = Udskriv stræktider automatisk +Sträcktilldelning, stafett = Turtildeling, stafet +Sträcktyp = Stræktype +Stämpelkod = stempelkode +Stämpelkod(er) = Stempelkode(r) +Stämpelkoder = Stempelkoder +Stämplar om = Stempler om +Stämpling = Stempling +Stämplingar = Stemplinger +Stämplingar saknas: X = Stemplinger mangler: X +Stämplingsautomat = Kontrolenhed +Stämplingsintervall (MM:SS) = Stemplingsinterval (MM:SS) +Stämplingstest = Stemplingstest +Stämplingstest [!] = Stemplingstest [!] +Stämplingstid = Stemplingstid +Stäng = Luk +Stäng tävlingen = Luk løbet +Större = Større +Störst = Meget stor +Största gruppen med samma inledning har X platser = Største gruppe med samme indledning har X pladser +Största intervall i klass = Største interval i klasse +SubCounter = Sekundær tæller +SubSubCounter = Tertiær tæller +Summera = Tæl sammen +Support time from control = Understøt tid fra post +Support time to control = Understøt tid til post +Symboler = Symboler +Synkronisera med Eventor = Synkroniser med Eventor +Säkerhetskopiera = Lav sikkerhedskopi +Sätt okända löpare utan registrering till = Sæt ukendte løbere uden registrering til +Sätt som oparad = Sæt som uparret +Sätter reptid (X) och omstartstid (Y) för = Sætter sidste skiftetid (X) og omstarttid (Y) for +Sök = Søg +Sök (X) = Søg (X) +Sök deltagare = Søg deltagere +Sök och starta automatiskt = Søg og start automatisk +Sök på namn, bricka eller startnummer = Søg efter et navn, en brik eller et startnummer +Söker efter SI-enheter = Søger efter SI-enheder +TCP: Port %d, Nolltid: %s = TCP: Port %d, Nultid: %s +TRASIG( = DEFEKT( +Ta bort = Fjern +Ta bort / slå ihop = Fjern / slå sammen +Ta bort eventuella avanmälda deltagare = Fjern evt. afmeldte deltagere +Ta bort listposten = Fjern listeposten +Ta bort markerad = Fjern valgte +Ta bort stämpling = Fjern stempling +Ta bort valda rader från tabellen (X) = Fjern valgte rækker fra tabellen (X) +Tabell = Tabel +Tabellverktyg = Tabelværktøj +Tabelläge = Tabelindstilling +Tar bort X = Fjerner X +Team = Hold +Team Rogaining = Hold pointløb +TeamBib = Holdets startnummer +TeamClub = Holdets klub +TeamFee = Holdafgift +TeamGlobal = Hold (klasser sammen) +TeamLegTimeAfter = Holdets tid efter på tur +TeamLegTimeStatus = Holdets tid / status på tur +TeamName = Holdets navn +TeamPlace = Holdets placering +TeamPlaceDiff = Ændring af holdets placering (denne etape) +TeamPointAdjustment = Holdets pointjustering +TeamRogainingOvertime = Holdets tidsoverskridelse (pointløb) +TeamRogainingPoint = Holdets pointløbspoints +TeamRogainingPointTotal = Holdets samlede points +TeamRogainingReduction = Holdets pointfradrag +TeamRunner = Navn på holdmedlem +TeamRunnerCard = Briknumre for holdmedlem +TeamStart = Holdets starttid +TeamStartNo = Holdets startnummer +TeamStatus = Holdets status +TeamTime = Holdets tid +TeamTimeAdjustment = Holdets tidsjustering +TeamTimeAfter = Holdets tid efter +TeamTimeStatus = Holdets tid / status +TeamTotalPlace = Holdets sammenlagte placering (samtlige etaper) +TeamTotalTime = Holdets samlede tid (samtlige etaper) +TeamTotalTimeAfter = Holdet efter førende (samtlige etaper) +TeamTotalTimeDiff = Ændring i holdets tid efter førende (denne etape) +TeamTotalTimeStatus = Holdets samlede tid eller status (samtlige etaper) +Teams and forking = Hold og gaflinger +Telefon = Telefon +Test = Test +Test Result Module = Test resultatmodul +Test av stämplingsinläsningar = Test af stemplingsindlæsninger +Testa rösten = Afprøv stemme +Text = Tekst +Text: X = Tekst: X +Texten ska innehålla tecknet X, som byts ut mot tävlingsspecifik data = Teksten skal indeholde tegnet X der erstattes med løbsspecifikke data +Textfiler = Tekstfiler +Textjustering = Tekstjustering +Textstorlek = Tekst størrelse +The forking is fair = Gaflingen er retfærdig +The forking is not fair = Gaflingen er uretfærdig +Tid = Tid +Tid efter: X = Tid efter: X +Tid efter: X; har tagit in Y = Tid efter: X; har hentet Y +Tid efter: X; har tappat Y = Tid efter: X; har tabt Y +Tid in = Tid ind +Tid: X, nuvarande placering Y/Z = Tid: X, nuværende placering Y/Z +Tidpunkt = Tidspunkt +Tidsavdrag: X poäng = Tidsfradrag: X points +Tidsförluster (kontroll-tid) = Tidstab (post/tid) +Tidsgräns = Tidsgrænse +Tidsinmatning = Tidsindtastning +Tidsintervall (MM:SS) = Tidsinterval (MM:SS) +Tidsintervall (sekunder) = Tidsinterval (sekunder) +Tidsjustering = Tidsjustering +Tidslinje – X = Tidslinje – X +Tidsskalning = Tidsskalering +Tidstillägg = Tidstillæg +Tidszon = Tidszone +Till exempel X = For eksempel X +Till huvudsidan = Til hovedside +Till kontroll = Til post +Tilldela = Tildel +Tilldela avgifter = Tildel afgifter +Tilldela endast avgift till deltagare utan avgift = Tildel kun afgift til deltagere uden afgift +Tilldela hyrbrickor = Tildel lejebrikker +Tilldela nummerlappar = Tildel brystnumre +Tilldela nya fakturanummer till alla klubbar? = Tildel nye fakturanumre til alle klubber? +Tilldela starttider = Tildel starttider +Tilldelad = Tildelt +Tilldelning av hyrbrickor = Tildel lejebrikker +Tillgängliga automater = Tilgængelige autofunktioner +Tillgängliga filer installerades. Starta om MeOS. = Opsætning er installeret. Genstart MeOS. +Tillgängliga listor = Tilgængelige lister +Tillsatte vakans = Besatte vakant +Tillsätt = Tilføj +Tillsätt tillfälliga anonyma lagmedlemmar = Tilføj annyme holddeltager +Tillsätt vakans = Besæt vakant +Tillsätt ytterligare vakans = Tilføj yderligere vakante +Tillämpa parstart = Anvend parstart +Tillåt decimaler = Tillad decimaler +Tillåt direktanmälan = Tillad tilmelding på stævnepladsen +Tillåt löpare inom en parallell grupp att springa gruppens banor i godtycklig ordning = Tillad løbere i en parallel gruppe at løbe gruppens baner i en vilkårlig rækkefølge +Tillåt ny klass, behåll resultat från annan klass = Tillad ny klasse, behold resultatet fra tidligere klasse +Tillåt ny klass, inget totalresultat = Tillad ny klasse, uden totalresultat +Tillåt samma bana inom basintervall = Tillad samme bane indenfor basisinterval +Tillåt valutauttryck med decimaler = Tillad valutaangivelse med decimaler +Time after leg winner = Tid efter strækvinder +Time as computed by your time method = Tiden er udregnet efter din startmetode +Time calculation for runner = Tidsberegning for løber +Time calculation for team = Tidsberegning for hold +Time: X = Tid: X +TimingFrom = Navn på startpunkt +TimingTo = Navn på målpunkt +Topplista, N bästa = Topliste, N bedste +Total = Total +Total tävlingsavgift = Total løbsafgift +TotalCounter = Primær tæller +Totalresultat = Totalresultat +Totalresultat - X = Totalresultat - X +Totalt = Total +Totalt antal etapper = Totalt antal etapper +Totalt faktureras = Totalt faktureres +Totalt kontant = Totalt kontant +Totaltid = Totaltid +Track runners in forest = Følg løbere i skoven +Trasig = Defekt +Träning = Træning +Tvåmannastafett = Tomandsstafet +Typ = Type +Typ av delning = Type af opdeling +Typ av export = Type af eksport +Typ av lista = Type af liste +Typsnitt = Skrifttype +Tävling = Løb +Tävling från Eventor = Løb fra Eventor +Tävling med lag = Løb med hold +Tävlingen innehåller inga resultat = Løbet indeholder ingen resultater +Tävlingen måste avgöras mellan X och Y = Løbet afvikles mellem X og Y. Stemplinger udenfor denne periode registreres ikke. +Tävlingen måste ha ett namn = Løbet skal have et navn +Tävlingens ID-nummer = Konkurrencens ID nummer +Tävlingens namn = Løbsnavn +Tävlingens namn: X = Løbets navn: X +Tävlingsdata har sparats = Løbsdata er gemt +Tävlingsinställningar = Løbsopsætninger +Tävlingsinställningar (IOF, xml) = Løbsindstillinger (IOF, XML) +Tävlingsnamn = Løbsnavn +Tävlingsrapport = Løbsrapport +Tävlingsregler = Løbsreglement +Tävlingsstatistik = Løbsstatistik +Töm = Clear +Töm databasen = Ryd database +URL = URL +URL måste anges = URL mangler +Ultra Long = Ultralang +Underfilter = Underfilter +Underlag för tävlingsavgift = Grundlag for løbsafgift +Underlag saknas för bomanalys = Intet grundlag for analyse af tidstab +Underlista = Underliste +Underrubrik = Underoverskrift +Undre datumgräns = Nedre datogrænse +Undre gräns (år) = Nedre grænse (år) +Undre ålder = Laveste alder +Unfair control legs = Uretfærdige stræk +Ungdom = Ungdom +Ungdomsavgift = Ungdomsafgift +Ungdomsklasser = Ungdomsklasser +Unknown symbol X = Ukendt symbol X +Unroll split times for loop courses = Udjævn splittider for loops +Uppdatera = Opdater +Uppdatera alla klubbar = Opdater alle klubber +Uppdatera alla värden i tabellen = Opdater alle værdier i tabellen +Uppdatera alla värden i tabellen (X) = Opdater alle værdier i tabellen (X) +Uppdatera från Eventor = Opdater fra Eventor +Uppdatera fördelning = Opdater fordeling +Uppdatera fördelningen av starttider med hänsyn till manuella ändringar ovan = Opdater fordelingen af starttider med hensyn til manuelle ændringer ovenfor +Uppdatera klubbar && löpare = Opdater klubber && løbere +Uppdatera klubbarnas och löparnas uppgifter med data från löpardatabasen/distriktsregistret = Opdater oplysninger om klubber og løbere med data fra løberdatabasen +Uppdatera klubbarnas uppgifter med data från löpardatabasen/distriktsregistret = Opdater oplysninger om klubber med data fra løberdatabasen +Uppdatera klubbens uppgifter med data från löpardatabasen/distriktsregistret = Opdater oplysninger om klub med data fra løberdatabasen +Uppdatera löpardatabasen = Opdater løberdatabasen +Urval = Sorter efter +Urval %c%s = Udvælg %c%s +Use initials in names = Brug initialer i navne +User input number = Bruger defineret input parameter +Utan inställningar = Uden indstillinger +Utan tidtagning = Uden tidtagning +Utbyt tävlingsdata med Eventor = Udveksl løbsdata med Eventor +Utför lottning = Foretag lodtrækning +Utfört = Færdig +Utg. = Udgået +Utgått = Udgået +Utskrift = Udskrift +Utskrift / export = Udskrift / Eksport +Utskriftsintervall (MM:SS) = Udskriftsinterval (MM:SS) +Utökat protokoll = Udvidet protokol +VALFRI( = VALGFRI( +Vacancies and entry cancellations = Vakante og sletning af tilmeldinger +Vak. ranking = Vak. rangliste +Vakanser = Vakante +Vakanser / klassbyte = Vakante / skift klasse +Vakanser och efteranmälda = Vakante og eftertilmeldte +Vakanser stöds ej i stafett = Vakante understøttes ikke i stafet +Vakant = Vakant +Val av export = Valg af eksport +Valbar = Valgbar +Vald bricka = Valgt brik +Valfri = Valgfri +Valuta = Valuta +Valutakod = Valutakode +Valutasymbol = Valutasymbol +Valutasymbol före = Valutasymbol før beløb +Variabler = Variable +Varning: Banan 'X' finns inte = Advarsel: Banen 'X' findes ikke +Varning: Banan 'X' förekommer flera gånger = Advarsel: Banen 'X' forekommer flere gange +Varning: Deltagaren 'X' finns inte = Advarsel: Deltageren 'X' findes ikke +Varning: Ingen organisatör/avsändare av fakturan angiven (Se tävlingsinställningar) = Advarsel: Ingen arrangør/afsender af fakturaen angivet (Se løbsindstillinger) +Varning: Inget kontonummer angivet (Se tävlingsinställningar) = Advarsel: Intet kontonummer angivet (Se løbsindstillinger) +Varning: Inget sista betalningsdatum angivet (Se tävlingsinställningar) = Advarsel: Ingen sidste betalingsdato angivet (Se løbsindstillinger) +Varning: Laget 'X' finns inte = Advarsel: Holdet 'X' findes ikke +Varning: deltagare med blankt namn påträffad. MeOS kräver att alla deltagare har ett namn, och tilldelar namnet 'N.N.' = Advarsel: Deltager uden navn forekommer. MeOS kræver et navn og har tildelt navnet 'N.N.' +Varning: lag utan namn påträffat. MeOS kräver att alla lag har ett namn, och tilldelar namnet 'N.N.' = Advarsel: Et hold uden navn forekommer. MeOS kræver et navn og har tildelt navnet 'N.N.' +Varning: ändringar i X blev överskrivna = Advarsel: ændringerne i X blev overskrevet +Varvningskontroll = Sløjfepost +Verkställ = Anvend +Verktyg = Værktøjer +Version X = Version X +Vi stöder MeOS = Vi støtter MeOS +Viktiga händelser = Vigtige begivenheder +Vill du använda den nya brickan till alla etapper? = Ønsker du at bruge den nye brik på alle etapper? +Vill du att X går in i laget? = Ønsker du at X er en del af holdet? +Vill du att X och Y byter sträcka? = Ønsker du at X og Y skifter ture? +Vill du att X tar sträckan istället för Y? = Ønsker du at X løber turen i stedet for Y? +Vill du dumpa aktuellt tävling och skapa en testtävling? = Ønsker du at glemme den nuværende løb og danne en testløb? +Vill du flytta löpare från X till Y och ta bort Z? = Vil du flytte løbere fra X to Y og fjerne Z? +Vill du klistra in X nya rader i tabellen? = Vil du sætte X nye rækker ind i tabellen? +Vill du lägga till banan 'X' (Y)? = Vil du tilføje banen 'X' (Y)? +Vill du lägga till deltagaren 'X'? = Vil du tilføje deltageren 'X'? +Vill du lägga till klassen 'X'? = Vil du tilføje klassen 'X'? +Vill du lägga till laget 'X'? = Vil du tilføje holdet 'X'? +Vill du nollställa alla manuellt tilldelade banor? = Ønsker du at nulstille alle manuelt tildelte baner? +Vill du radera X rader från tabellen? = Vil du slette X rækker fra tabellen? +Vill du radera alla vakanser från tävlingen? = Vil du fjerne alle vakante fra løbet? +Vill du skapa en ny klass? = Vil du oprette en ny klasse? +Vill du spara ändringar? = Vil du gemme ændringer? +Vill du sätta resultatet från tidigare etapper till ? = Vil du sætte resultatet fra tidligere etaper til ? +Vill du ta bort 'X'? = Vil du fjerne 'X'? +Vill du ta bort alla klubbar från tävlingen? Alla deltagare blir klubblösa = Vil du fjerne alle klubber fra løbet. Alle deltager bliver så uden klub. +Vill du uppdatera alla nummerlappar? = Ønsker du at opdatere alle brystnumre? +Vill du verkligen radera alla starttider i X? = Vil du virkelig slette alle starttider i X? +Vill du verkligen radera starttider i X klasser? = Vil du virkelig slette starttider i X klasser? +Vill du verkligen radera tävlingen? = Vil du virkelig slette løbet? +Vill du verkligen stänga MeOS? = Vil du virkelig lukke MeOS? +Vill du verkligen ta bort laget? = Vil du virkelig slette holdet +Vill du verkligen ta bort löparen? = Vil du virkelig slette løberen? +Visa = Vis +Visa alla = Vis alle +Visa avancerade funktioner = Vis avancerede funktioner +Visa en tabell över alla stämplingar = Vis en tabel over alle stemplinger +Visa klubbdatabasen = Vis klubdatabasen +Visa listan i fullskärm = Vis listen i fuldskærm +Visa löpardatabasen = Vis løberdatabasen +Visa mellantider = Vis mellemtider +Visa och hantera löpardatabasen = Vis og håndter løberdatabasen +Visa senast inlästa deltagare = Vis senest indlæste deltager +Visa startlistan = Vis startliste +Visa tillgängliga säkerhetskopior = Vis tilgængelige sikkerhedskopier +Visa valda deltagare = Vis valgte deltagere +Visar de X bästa = Vis de X bedste +Visualisera startfältet = Visualiser startfeltet +Vuxen = Voksen +Vuxenklasser = Voksenklasser +Vuxna = Voksne +Välj Spara för att lagra brickorna. Interaktiv inläsning är INTE aktiverad = Vælge Gem for at gemme brikker. Interaktiv indlæsning er IKKE aktiveret +Välj Spara för att lagra brickorna. Interaktiv inläsning är aktiverad = Vælg Gem for at gemme brikker. Interaktiv indlæsning er aktiveret +Välj X = Vælg X +Välj alla = Vælg alle +Välj alla klasser = Vælg alle klasser +Välj allt = Vælg alle +Välj automatiskt = Vælg automatisk +Välj den etapp som föregår denna tävling = Vælg den etape der går forud for dette løb +Välj den etapp som kommer efter denna tävling = Vælg den etape som følger efter dette løb +Välj en vakant plats nedan = Vælg en vakant plads nedenfor +Välj från lista = Vælg fra liste +Välj ingen = Vælg ingen +Välj inget = Vælg intet +Välj klass = Vælg klasse +Välj klass och starttid nedan = Vælg klasse og starttid nedenfor +Välj klasser = Vælg klasser +Välj klasser där alla löpare saknar starttid = Vælg klasser hvor alle løbere mangler starttid +Välj klasser där någon löpare saknar starttid = Vælg klasser hvor nogle løbere mangler starttid +Välj klasser med nya anmälningar = Vælg klasser hvor nye tilmeldinger er tilladt +Välj kolumner = Vælg kolonner +Välj kolumner att visa = Vælg kolonner der skal vises +Välj kolumner för tabellen X = Vælg kolonner til tabellen X +Välj lista = Vælg liste +Välj lopp = Vælg løb +Välj löpare = Vælg løber +Välj löpare att prioritera bevakning för = Vælg løbere hvor overvågning prioriteres +Välj löpare för sträcka X = Vælg løbere til tur X +Välj skrivare = Vælg printer +Välj tävling = Vælg løb +Välj vilka funktioner du vill använda = Vælg hvilke funktioner du vil bruge +Välj vilka klasser och kontroller du vill bevaka = Vælg hvilke klasser og poster du vil overvåge +Välj vilka klasser och kontroller som bevakas = Vælg hvilke klasser og poster der overvåges +Välj vilka kolumner du vill visa = Vælg hvilke kolonner du vil vise +Välj vy = Vælg visning +Välkommen till MeOS = Velkommen til MeOS +Vänligen betala senast = Vær venlig at betale senest +Vänligen återlämna hyrbrickan = Vær venlig at aflevere din lejebrik +Vänster = Venstre +Växel = Skifte +Växling = Veksling +Webb = Web +Webbdokument = Webdokument +Webbdokument (html) = Webdokument (html) +Webben (html) = Webben (html) +X (Saknar e-post) = X (Mangler email) +X (Y deltagare, grupp Z, W) = X (Y deltagere, gruppe Z, W) +X (press Ctrl+Space to confirm) = X (tast + for at bekræfte) +X har redan bricknummer Y. Vill du ändra det? = X har allerede brik nr. Y. Vil du ændre det? +X har redan ett resultat. Vi du fortsätta? = X har allerede et resultat. Vil du fortsætte? +X har startat = X er startet +X kontroller = X poster +X meter = X meter +X poäng fattas = X points mangler +X rader kunde inte raderas = X rækker kunne ikke slettes +X senaste = X seneste +X är inget giltigt index = X er ikke et gyldigt indeks +X är inget giltigt sträcknummer = X er ikke et gyldigt turnummer +X: Y. Tryck för att spara = X: Y. Tryk for at gemme +X:e = X'e +Zooma in (Ctrl + '+') = Zoom ind (Ctrl + '+') +Zooma ut (Ctrl + '-') = Zoom ud (Ctrl + '-') +[Bevaka] = [Overvåg] +[Bort] = [Fjern] +[Flytta ner] = [Flyt ned] +[Klassens bana] = [Klassens bane] +[Uppdaterad anmälan] = [Opdateret tilmelding] +[VARNING] ingen/okänd = [ADVARSEL] ingen/ukendt +[Återställ] = [Reset] +andra = anden +ask:addpunches = Ingen brik er aflæst for denne løber. Vil du tilføje stemplinger manuelt? +ask:changedclassfee = Løbsafgiften er ændret i visse klasser. Vil du tilføje nye gebyrer til eksistende løbere i disse klasser?\n\nAdvarsel: Manuelt tildelte gebyrer bliver overskrevet. +ask:changedcmpfee = Løbsafgiften er ændret. Vil du tilføje nye gebyrer til eksisterende løbere og klasser?\n\nAdvarsel: Manuelt tildelte gebyrer bliver overskrevet. +ask:cleardb = Vil du slette løber og klubdatabase? +ask:firstasstart = Banen har allerede deltagere med resultat. Hvis du anvender første post til start vil eksisterende starttider blive overskrevet.\n\nVil du fortsætte? +ask:kiosk = Hvis du starter resultatformidling havner MeOS i en tilstand hvor det kun er muligt at vise resultatrapporter. Ingen andre funktioner er tilgængelige før programmet genstartes. Hvis du har en aktiveret SI-enhed koblet til computeren viser MeOS automatisk resultater for sidste aflæste brik.\n\nDu bør overveje at beskytte databasen med et password hvis stiller em PC med resultatformidling frit tilgængeligt.\n\nVil du starte resultatformidling? +ask:missingcourse = Nogle klasser (X) har ingen bane.\n\nMeOS bruger banerne til lodtrækning for at undgå at løbere med samme førsteposter starter samtidigt.\n\nVil du trække lod alligevel? +ask:overwrite_server = Løbet er allerede på serveren. Vil du overskrive løbet på serveren? +ask:overwriteconfirm = Du har valgt at overskrive løbet. Kontroller at der ikke er andre tilsluttet.\n\nVil du fortsætte? +ask:overwriteresult = X har allerede et resultat. Skal det overskrives? +ask:repair = Reparer kun databasen hvis du har problemer med den.\n\nVigtigt:\n- Kontroller at der ikke er andre tilsluttet databasen.\n- Hvis serveren crasher eller lukkes mens den repareres, skal du som det første genstarte den og omgående forsøge en ny reparation. Hvis du gør noget andet inden går alle data tabt.\n\nVil du fortsætte? +ask:updatelegs = Rettelsen kan kræve at længden af de enkelte stræk opdateres.\n\ Ønsker du at rette det nu? +backup = backup +c/o = c/o +check (X) = check (X) +classcourseresult = Klasse of baneresultater +documentation = meos_doc_eng.html +edit_in_forest = Håndter\nLøbere i skoven +edit_inforest = Håndter løbere\ni skoven +ej aktiv = ikke aktiv +elfte = elvte +elva = elleve +encoding = ANSI +error:invalidmethod = Den valgte metode gav ikke nogen fordeling. Kildedata utilstrækkelige. +ett Mycket Enkelt OrienteringsSystem = et Meget Enklere OrienteringsSystem +eventor:help = Hvis du bruger MeOS i Sverige, anbefaler vi at du bruger MeOs's Eventor opkobling +eventor:question = X\n\nVil du bruge Eventor opkobling? +femma = fem +femte = femte +fjärde = fjerde +fritt att använda och du är välkommen att distribuera det under vissa villkor = gratis at bruge og du er velkommen til at distribuere det på visse betingelser +fyra = fire +går i mål på X plats med tiden Y = går i mål på X plads med tiden Y +går i mål på X plats, efter Y, på tiden Z = går i mål på X plads, efter Y, med tiden Z +går upp i delad ledning med tiden X = tager en delt førsteplads med tiden X +går upp i delad ledning vid X med tiden Y = deler føringen ved X med tiden Y +handskakning = handshaking +har startat = er startet +help:10000 = En autofunktion i MeOS er et lille program som automatisk gør noget med jævne mellemrum eller når løbsdata ændres. +help:12138 = Vælg den klasse der skal slås sammen med den valgte klasse. Hvis der er trukket lod i klassen skal du trække lod igen, idet løberne ellers beholder deres starttid. +help:12290 = Det valgte løb er oprettet i en anden version af MeOS og kan ikke åbnes fra serveren. Du kan imidlertid importere løbet fra en fil. +help:12352 = Denne handling sletter den klub du har valgt (%s, id=%d) og flytter alle løbere fra denne klub til den nye klub du vælger nedenfor. Dette kan ikke fortrydes. +help:12662 = Tilføj poster ved at tilføje en sekvens med postnumre. Det er ikke nødvendigt at angive målposten. Eksempel: 31, 50, 36, 50, 37, 100. +help:14070 = TCP-porten bruges til at importere stemplinger over netværk med TCP fra andre systemer. Angiv hvilken port der skal bruges. Protokollens nultid er 00:00:00. +help:14343 = Her vises en liste med aflæste løberbrikker. For at ændre en løbers brik, dobbeltklik på den brik eller løber du vil flytte. +help:146122 = Du kan udvide MeOS's kendskab til løbere, klubber og klasser ved at gennemsøge databaser i MeOS-format eller IOF XML-format.\n\nVil du fortsætte? +help:14692 = Indtast post (SI-nummer), løber (startnummer eller briknummer) og urtid (HH:MM:SS). Du kan efterlade tiden blank, hvorved computerens tid anvendes. Tryk på for at gemme. +help:15491 = Du kan eksportere din lokale opsætning samt klub- og løberdatabaser til en mappe du angiver. Derefter kan du importere denne opsætning på anden computer. +help:21576 = Tip: Hvis du gør noget forkert, klik på løberens navn for at ændre tilmelding. På faneblad deltagere kan du fjerne tilmeldinger. De klasser du kan tilmelde i er dem, hvor der er krydset af i tilmelding på stævnepladsen (se faneblad klasser). +help:25041 = Her definerer du de baner du har brug for. En bane knyttes til en eller flere klasser (eller løbere). Det er også muligt at importere baner direkte fra OCAD, Condes eller andre banelægningsprogrammer. Hvis du angiver antallet af tilgængelige kort, holder MeOS styr på hvor mange kort der er til rådighed for tilmelding på stævnepladsen. +help:26963 = Valgfrie baner anvendes for at skabe valgmuligheder for hvert delstræk. Banen knyttes til løberen ved målgang gennem matchning. Definer banerne ved at tilføje dem under flere baner/stafet. Et [S] efter klassen betyder att alle deltagere er tildelt en starttid. +help:29191 = Du kan hente opsætning af MeOS samt klub- och løberdatabaser fra den mappe du angiver. De lokale opsætning bliver herved overskrevet. Efter installationen skal MeOS måske genstartes.\n\nKnappen fører til en side, hvorfra du kan kan eksportere din nuværende lokale opsætning. +help:29758 = Her håndterer du klubber, genererer og udskriver fakturaer. Du kan efterfølgende tildele løbsafgifter, baseret på klassetype og tilmeldingsdato. Dobbeltoprettede (fejlstavede) klubber kan slås sammen med den rigtige klub og fjernes. Du kan også opdatere klubberne med data fra evt. eksternt register. +help:30750 = Her kan du oprette forskellige slags lister og rapporter. Du kan vise dem på skærmen, udskrive dem eller gemme dem til webben. Når løbsdata ændres opdateres listen automatisk. Automatiske udskrifter finder du under faneblad autofunktioner. Eksport af løbsdata f.eks. stræktider, sker under faneblad løb. +help:31661 = En efterstart defineres af en sidste skiftetidtid og en efterstarttid. Ved sidste skiftetid lukkes skiftezonen, og ingen startende slippes ud i skoven. Ved efterstartstiden går efterstarten. Det er muligt at angive forskellig efterstartstartstid på forskellige ture, men med hjælp af denne funktion sætter du hurtigt efterstartstid for hele klasser. +help:33940 = Importer tilmeldingsdata i fritekstformat. Angiv Navn, Klub, Klasse og SI (og eventuel starttid) gerne adskilte med et komma; en person (et hold) pr linje. Det er også muligt at tilmelde flere personer i samme klub/klasse ved at (delvis) udelade felterne klub/klasse. Det er også muligt at importere tilmeldinger formateret på andre måder.\n\nKlasser oprettes automatisk, men hvis du importerer hold til stafet eller patrulje skal du selv oprette klasserne inden du importerer tilmeldingerne. Ellers kan der opstå fejl i tildeling af tur. +help:41072 = Marker i listen af stemplinger for at slette eller ændre tiden. Manglende stemplinger kan tilføjes fra baneskabelon. Mangler måltid får løberen status udgået. Mangler stempling får løberen status fejlstempling. Det er ikke muligt at sætte en status på en løber som ikke passer med løberens stemplingsdata. Hvis der er en målstempling skal tiden for denne ændres for at ændre måltiden; det samme gælder for startstempling. +help:41641 = Udfyld første starttid og startinterval. Lodtrækning indebærer tilfældig lodtrækning, SOFT-lodtrækning en lodtrækning i overensstemmelse med SOFT:s klubfordelingsregler. Klyngestart indebærer at hele klassen starter i småklynger med det interval du angiver ("forlænget" fællesstart). \n\nAngiv interval 0 for samlet start.\n\nStartnumre: Angiv første nummer eller efterlad blankt for ingen startnumre. I feltet ture (Tur) angiver du hvilken tur der skal lodtrækkes (hvis klassen har flere ture). +help:425188 = Du kan automatisk håndtere ved at indlæse fra SI-enhed(er) (Clear, Check eller Start post) i SI-Config (Read out Station), gemme indlæsningen som en semikolonsepareret tekstfil og importere denne i MeOS. De løbere som forekommer i denne import får en registrering. Derefter kan du sætte på løbere uden registrering. Indlæser du senere flere løbere kan du ændre de løbere som tidligere har fået men nu har fået registrering.\n\nDu kan også løbende få indlæst status af løberne ved at lade dine Check enheder i starten være radioposter. Det kommer så løbende ind i programmet. Husk postnummer for Check skal være '3'. +help:471101 = Aktivér SI-enheden ved at vælge den rette COM-port, eller ved at søge efter installerede SI-enheder. Info giver dig information om den valgte enhed/port. For at aflæse brikker skal enheden være programmeret uden autosend (for radioposter bruges dog autosend). Udvidet protokol anbefales, da det giver en mere stabil forbindelse. Enheden programmeres med SPORTidents program SI-Config.\n\nHvis du bruger SPORTident SRR radioposter gælder der følgende reggler for postnumre:\nNormale poster skal have et nummer fra 31 til 255.\nStartpost(er) skal have postnummer=1.\nPostenhed med Check skal have postnummer =3\nPoster med numrene 2 samt 4-30 håndteres som Mål.\n\nInteraktiv aflæsning anvendes hvis du vil håndtere eventuelle problemer med forkerte briknumre ved aflæsningen; afmarker hvis det i stedet skal foregå f.eks. ved 'Klagemuren' eller på på stævnekontoret.\n\nLøberdatabasen bruges hvis du automatisk vil tilføje indkomne løbere ved hjælp af løberdatabasen. Løberens stemplinger bruges til at vælge den rigtige klasse. +help:50431 = Du er nu koblet op mod en server. For at åbne et løb fra serveren, marker det i listen og vælg åbn. For at tilføje et løb til serveren, åbn først løbet lokalt, og brug derefter knappen upload løb. Når du har åbnet et løb på på serveren ser du hvilke andre MeOS-klienter som er tilsluttet til serveren.\n\nHvis der efter løbet står (på server) er løbet åbnet på en server og kan deles af andre MeOS-klienter. Står der (lokalt) kan man kun tilgå løbet fra den aktuelle computer. +help:52726 = Tilslut til en server nedenfor. \n\nInstallation:\nHent og installer MySQL 5 (Community Edition) fra www.mysql.com, standardindstillinger anbefales. MySQL behøver kun at være kun installeret på den computer der skal være server. Start derefter et MySQL Administrationsprogram som phpMyAdmin og opret en brugerkonto for MeOS. Hvis du bruger MySQL Command Line Client og vil oprette en brugerkonto for MeOS er kommandoerne:\n\n> CREATE USER meos;\n> GRANT ALL ON *.* TO meos;\n\nDu har nu oprettet en bruger meos (med blankt password). Angiv serverens navn nedenfor (hvis du ikke kan få forbindelse så kontroller evt. firewall).\n\nEt alternativ er at bruge MySQL's indbyggede rodkonto, det vil sige, brugernavn 'root' og det password du angav ved installationen af MySQL. +help:5422 = Fandt ingen SI-enhed(er). Er de(n) tilsluttet og startet? +help:59395 = I denne formular kan du hurtigt lave de grundlæggende indstillinger for alle klasser i en arbejdsgang. \n\nStart angiver navnet på starten, som det skrives på startlisten. \n\nBlok er et tal mellem 0 og 100 som angiver en mere finkornet opdeling af de startende. Klasser som tillhører same blok udskrives på samme minutstartliste. \n\nIndeks angiver en sorteringsnøgle. Alle lister sorterer klasserne stigende efter denne nøgle. \n\nBane kan angives for de klasser som kun har én bane; har klassen flere baner eller gaflinger skal det indstilles klassevist. \n\nTilmelding på stævnepladsen angiver om klassen tillader tilmelding på stævnepladsen. +help:59395_more = Startafgifter, der vises hvis du har aktiveret økonomifunktioner, bruges for nye tilmeldinger. Hvis du ændrer afgifterne vil du blive spurgt om du ønsker at ændre afgifterne for eksistrende tilmeldinger. \n\nFor brystnumre er mulighederne ingen, løbende eller manuelt. Der kan også indtastes det første nummer i klassen f.eks. A100 eller 50. Løbende betyder at det sidste nummer i den forudgående klasse bruges som grundlag i denne klasse. Reserverede brystnumre betyder at der kommer det specificerede spring i numrene mellem de forskellige klasser. \n\nMeOS opdaterer brystnumrene når der foretages lodtrækning eller når indstilningerne for løbet ændres. Manuelt betyder at MeOS aldrig vil opdatere brystnumrene af sig selv.\n\nFor klasser med hold er det opsætningen Hold deltager der styrer relationen mellem hold og brystnummer. Her er mulighederne stigende (100, 101, 102), tur baseret (100-1, 100-2, etc.) eller uafhængigt. +help:7618 = Antallet af løbere på holdet indstilles på siden klasser. +help:7620 = Interval (sekunder). Efterlad blank for at opdatere når løbsdata ændres +help:89064 = Til hver post angiver man et eller flere kodecifre (SI-kode). Under banelægningen refererer man til postens ID-nummer. Man behøver normalt ikke selv at tilføje poster, idet MeOS automatisk tilføjer de poster der anvendes. \n\nFlere kodeciffre er brugbare for at erstatte poster der er defekte eller for at skabe enkle gaflinger. For en almindelig post kræves at løberen har besøgt en af de angivne poster. Sættes status til multipel skal løberen besøge listede poster i valgfri rækkefølge.\n\nHvis man sætter postens status til 'Defekt', anvendes den ikke i stemplingskontrollen. \n\nEn post kan tildeles et navn, f.eks. 'Skift'. Det er muligt at udskrive resultatlister som indeholder mellemtider for navngivne poster.\n\nTidsjustering bruges hvis en uret i en postenhed går forkert:formatet er +/-MM:SS eller +/-HH:MM:SS.\n\nKorteste stræktid kan anvendes eksempelvis ved vejpassage. Ingen løber kan få en bedre stræktid ind mod posten end den angivne tid. Overskrider løberen den angivne tid bruges løberens faktiske tid. +help:9373 = Angiv et eller flere kodecifrer (SI-kode) som bruges på denne post, f.eks. 31, 250. Feltet point bruges til pointløbsposter. +help:9615 = Fik intet svar. Skal porten åbnes i passiv indstilling; skal MeOS lytte efter indkommende stemplinger? +help:DirectResult = - Hvis der ikke er nogen bane sættes status til OK ved målstempling.\n\n- Hvis der er en bane med radioposter over det hele er det ikke nødvendigt at aflæse brikken. +help:analyzecard = Denne funktion tillader at udskrive data fra brikken, uden at oprette et løb - som på en stræktidsprinter. Vælg "Udskriv Stræktider" for at vælge og konfigurere printeren.\n\nBrikkens data gemmes i hukommelsen(men ikke i løbet). Du kan rette navn og klub ved at klikke på navn (eller 'Ukendt'). Du kan også gemme brikdata i en fil "Gem" eller oprette et løb udfra brikkens/brikkernes data. Bemærk at der ikke må være noget løb åbent for at funktionen bliver tilgængelig. +help:anonymous_team = Opret og tildel (midlertidige) deltagere for alle hold hvor der kan tildeles SI-brik, bane o.s.v. +help:assignfee = MeOS håndterer i de fleste tilfælde afgifter automatisk. Deltagarne tildeles en løbssafgift ud fra alder og tilmeldingsdato (grænser angiver du under løbsindstillingar). Hver klasse definerer hvilke afgifter der gælder. Standardværdien for forskellige klassetyper definerer du under løbsindstillinger, men du kan også foretage manuelle ændringer på siden klasser, under hurtigindstillinger.\n\nMed funktionerne her kan du tildele og manuelt filtrere forskellige aldre og tilmeldingsfrister, samt tildele forskellige afgifter. På siden deltagere kan du også manuelt justere de enkelte deltageres afgift. +help:assignforking = Denne funktion udregner et optimalt gaflingsmønster fra udvalgte baner. +help:baudrate = Overføringshastighed/Baudrate: brug 4800 eller 38400. +help:bibs = Startnumre kan håndteres automatisk eller manuelt. Startnumre for en klasse kan tildeles manuelt ved at specificere Manuelt og angive det første nummer i klassen.\n\nVed automatisk opdaterer MeOS alle startnumre i alle klasser på en gang. Selv om det er muligt at foretage instillingerne her, er det bedre at bruge Hurtiginstillinger for klasser da det giver et overblik over alle klasser.\n\nAutomatisk er lavet til at bruges sammen med ingen og løbende, så bruges sidste nummer i den foregående klasse som start for den næste klasse. Antallet reserverede brystnumre angiver springet i numre mellem klasser. \n\nFor holdklasser kan der specificeres hvordan løberens brystnummer forholder sig til holdets brystnummer. Det kan være samme, uafhængigt, stigende (Hold 1: 101, 102, 103, 104, Hold 2: 111, 112, 113, 114 etc) or tur (100-1, 100-2, 100-3 etc). +help:computer_voice = De briknumre der indsendes til systemet matches mod startnummer og filen , hvor N är startnummeret, afspilles. Filerne hentes fra nedennævnte mappe. Hvis løberens/holdets nationalitet er NAT, afspilles i første omgang filen . For svenske løbere afspilles f.eks. i første omgang filen +help:dbage = Løberdatabasen er ældre end 2 måneder. Vil du hente en opdateret database fra Eventor? +help:duplicate = Lav en lokal kopi af det aktuelle løb. +help:eventorkey = Indtast klubbens API-nøgle for Eventor, den er nødvendig for at kunne tilslutte til Eventor og hente tilmeldinger og løberregister. Nøglen får du af klubbens Eventor-administrator. +help:fullscreen = Du kan justere hastigheden med Ctrl+M (hurtigere) respektive Ctrl+N (langsommere) på tastaturet. For at forlade fuldskærm, tryk på Esc. +help:import_entry_data = Du kan importere løbere, klasser, klubber og tilmeldinger i et antal forskellige tekst- og XML-formater. Det er ikke nødvendigt at angive samtlige filer. F.eks. indeholder OE-CSV format for tilmeldinger såvel klasser som klubber. I det tilfælde behøver felterne for klasser og klubber ikke at indlæses separat\n\nHvis information om samme løber importeres flere gange, bliver løberens information opdateret de efterfølgende gange. Der dannes ikke flere kopier af løberen i databasen. Det gør at man kan importere eftertilmeldinger ved at importere en opdateret fil med samtlige tilmeldinger. +help:importcourse = Du kan importere baner og klasser fra (eksempelvis) OCAD's eller Condes i IOF XML format. +help:ocad13091 = Hvis du har adgang til banerne på fil (f.eks. fra OCAD eller Condes) kan du angive filens navn her. Ellers kan du lægge banerne ind senere. +help:onlineinput = Denne funktion bruges for at modtage data fra radioposter der er forbundet til Internettet, f.eks. en radiopost der er forbundet til en mobiltelefon. Det er også muligt at lave et simpelt web-skema hvori løberens brystnummer indtastes når de passerer. \n\nFunktionen understøtter også andre typer af data indtastning så som hold opstilling, direkte tilmelding og ændring af briknummer. Hvis du ønsker at udvikle din egen funktion kan yderligere dokumentation og eksempler findes på MeOS hjemmeside: www.melin.nu/meos.\n\nMapning gør det muligt at tilknytte en speciel posttype (Check, Start og Mål) til et specifikt postnummer, da dette overføres på anden vis. +help:onlineresult = Denne funktion bruges til at øjeblikkelig automatisk udgivelse af resultater og startlister på Internettet. Instillingerne du bruger skal passe til den tjeneste du vil udnytte. Tjenesteudbyderen kan give dig yderligere information.\n\n Hvis du ønsker at udvikle din egen funktion kan yderligere dokumentation og eksempler findes på MeOS hjemmeside: www.melin.nu/meos. +help:relaysetup = Anvend guiden nedenfor til at vælge mellem et antal foruddefinerede løbsformer. Når du trykker på anvend gemmes indstillingerne. Derefter er det muligt manuelt at tilpasse indtillinger for hver tur og vælge baner.\n\nNogle forklaringer:\n- Stafet bruges for stafet i forskellige former.\n- Tomandsstafet indebærer at to løbere udgør et hold og løber hveranden tur.\n- Ekstraløberstafet anvendes indimellem i ungdomsklasser og tillader flere løbere på mellemturene (først i mål skifter).\n- Patrulje kan løbes med to SI-brikker (begge løbere stempler) eller en SI-brik pr.patrulje.\n- Prolog + jagtstart indebærer at en løber først løber en prolog, derefter en jagtstart baseret på resultatet.\n- Valgfrie baner indebær gafling, hvor man ikke i forvejen behøver at bestemme, hvem som løber hvilken bane. ved målgang afgøres, hvilken bane løberen har løbet. +help:restore_backup = Vælg en sikkerhedskopi at gendanne ud fra, ved at klikke på det tidspunkt, hvor sikkerhedskopien blev oprettet. +help:runnerdatabase = Ved at importere løberregister og klubregister får du MeOS til automatisk at tilknytte briknummer med løbere ved brikaflæsning og du får hentet adresser og kontaktoplysninger for klubber.\n\nMeOS kan importere IOF (xml)-format fra f.eks. Eventor. +help:save = MeOS gemmer alle ændringer automatisk når det er nødvendigt. +help:seeding_info = Seeded lodtrækning betyder at tidligere resultater eller ranking er med til at styre lodtrækningen. I feltet seeding grupper kan der enten angives en værdi, eller en række værdier. Hvis der angives en værdi opdeles klassen i grupper af denne størrelse. En værdi på "1" betyder at der ikke foretages loktræning eller at ranking bruges direkte. Hvis der angives en række numre, f.eks. "15,1000" betyder det at de 15 bedste løbere kommer i en gruppe og at de efterfølgen (maksimalt 1000) løbere placeres i en ikke seeded gruppe. +help:simulate = Denne funktion tillader dig at simulere aflæsningen af SI-brikker. Der genereres tider og stemplinger for alle løbere. Radioposter kan også simuleres\n\nADVARSEL: Brug kunne denne funktion ved test. Hvis den bruges på et rigtigt løb bliver løbsdata ødelagt. +help:speaker_setup = Vælg hvilke klasser og poster du vil overvåge. +help:speakerprio = Sæt et kryds ved de løbere/hold der skal overvåges fra starten og så længe det går godt for løberen/holdet. Sæt to krydser for at overvåge også når det går dårligt. Intet kryds betyder overvågning kun hvis det går godt (ikke fra start). +help:splitexport = Vælg om du vil eksportere totalresultater eller individuelle resultater for hver tur. Hvis du vælger at eksportere alle ture bliver flere nummererede filer gemt. +help:startmethod = MeOS vælger automatisk startmetode. Uanset hvad du vælger kan du altid ændre startmetode eller foretage ny lodtrækning senere. +help:teamlineup = Her kan du importere holdsammensætning fra et struktureret tekstformat - f.eks. fra et regnearksprogram. Filen skal have følgende format:\n\nKlasse;Holdnavn;[Klub]\nLøber 1;[SI];[Klub];[Bane];[Løbers klasse]\nLøber 2;[SI];[Klub];[Bane];[Løbers klasse]\n...\nKlasse;Holdnavn;[Klub]\n...\n\nFelter markeret med [] kan udelades. Bemærk at de angivne klasser og baner skal findes, og antallet af ture i klassen skal svare til antallet af løbere. Tomme rækker kan bruges hvis der ingen løber er. Valget betyder at kun løbere der allerede er med i løbet kan flyttes til holdet; andre løbere kan ikke angives. +help:teamwork = Løberne skifter plads. Der kan foretages flere skift for at opnå den ønskede holdopstilling. +help:winsplits_auto = Denne autofunktion gemmer stræktider i en IOF-format fil med jævne mellemrum. Hvis du åbner filen med WinSplits, vil stræktiderne der blive opdateret med samme mellemrum +help:zero_time = Nultid bør sættes til før udløbere af poster sendes ud. +help_autodraw = Indtast første (ordinære) starttid, mindste startinterval (indenfor en klasse) og andel vakante. Du kan også vælge lodtrækningsmetode og om eftertilmeldte skal starte først eller sidst. Første starttid skal være efter løbets nultid.\n\nHvis du vælger automatisk lodtrækning, vil MeOS gennemgå samtlige klasser. Der trækkes lod i klasser der ikke er lodtrukne. MeOS lodtrækker hver start for sig og sørger for en jævn strøm af startende. MeOS sørger også for at klasser med samme bane ikke starter samtidigt og om muligt at løbere med samme førstepost ikke starter samtidigt. Desuden efterlades plads til senere at lodtrække eftertilmeldte på samme vilkår.\n\nI de klasser som allerede er lodtrukne bliver eftertilmeldte sat ind før eller efter de ordinært tilmeldte. De løbere som allerede er lodtrukne beholder altså deres starttid. Det er også muligt først at lodtrække visse klasser manuelt og derefter lade MeOS lodtrække resterende klasser automatisk.\n\nHvis du istedet vælger manuel lodtrækning kommer du til en side, med flere indstillingsmuligheder, hvor du skal vælge hvilke klasser der skal lodtrækkes. +help_draw = Lodtrækning udføres i to trin. Først angiver du hvilke klasser du vil lodtrække og foretager de grundlæggende indstillinger. Når du trykker på anvender MeOS indstillingerne til at fordele starttiderne mellem klasserne. MeOS sørger for at klasser med baner der ligner hinanden ikke starter samtidigt og tager hensyn til allerede lodtrukne klasser. Målet er et jævnt flow af startende.\n\nFordelingen præsenteres i en tabel, hvor du kan tilføje dine egne ændringer og eventuelt lade MeOS foretage en ny fordeling i fohold til dine ændringer. Når du er tilfreds med fordelingen lader du MeOS trække lod blandt de valgte klasser.\n\nDe grundlæggende indstillinger som skal foretages er første starttid og mindste startinterval. Indstillingen maks. samtidigt startende angiver hvormange løbere som må starte samtidigt. En større værdi giver en kortere startdybde.\n\nAndel vakante angiver om MeOS skal lodtrække vakante pladser ind i startfeltet. Angiv 0% for ingen vakante. Forventet antal eftertilmeldte bruges til at reservere plads i startfeltet for eftertilmeldte. Ingen vakante pladser indsættes, men der efterlades plads i startlisten med garanti for at ingen samtidigt startende skal have samme bane. +info:multieventnetwork = For at administrere flere etaper skal du arbejde lokalt. Gem en kopi af løbet, åbn den lokalt og overfør resultat til næste etape. Derefter uploader du næste etape til serveren for at afvikle den derfra. +info:readout_action = X: Brik Y aflæst.\nManuel behandling er nødvendig. +info:readout_queue = X: Brik Y aflæst.\nBrikken er sat i kø. +info:runnerdbonline = Da du er tilsluttet en server er det ikke muligt at redigere klub og løberdatabase manuelt. Foretag ændringer før løbet uploades til serveren. Det er muligt at erstatte den eksisterende database på serveren ved at importere en ny database (fra IOF XML). +info_shortening = Vælg en eksisterende bane der afkortes til den nuværende bane. Det er muligt med flere niveauer af afkortning. +inforestwarning = Der skulle ikke være flere løbere i skoven. De de data analysen er baseret på kan være forkerte, bør du som arrangør dog også checke dette på anden måde. +kartor = kort +klar = færdig +kontroll = post +kontroll X (Y) = post X (Y) +listinfo:inputresults = Vis resultater af tidligere dele. +listinfo:singleclub = Dan resultatliste for en enkelt klub.\n\nBrug klub ID som inputparameter +localhost = localhost +lopp = løb +min/km = min/km +mål = mål +målet = målet +målet (X) = målet (X) +newcmp:featuredesc = Vælg hvilke funktioner i MeOS du har brug for i dette løb. Du kan fjerne eller tilføje faciliteter nårsomhelst ved at vælge på siden Løb. +nia = ni +nionde = niende +olshooting:notimepunishment = Resultatliste Biatlon uden tidstillæg.\n\nAktiver MeOS-funktionerne Pointløb og Manuel pointreduktion og justering. Brug feltet Pointreduktion på faneblad Deltagere til at registrere forbiere i formatet LLSS hvor LL er forbiere liggende og SS forbiere stående. Eksempel: 0201 betyder 2 forbiere liggende og 1 forbier stående. +olshooting:timepunishment = Resultatliste Biatlon med tidstillæg.\n\nAktiver MeOS-funktionerne Pointløb og Manuel pointreduktion. Brug feltet Pointreduktion på faneblad Deltagere til at registrere forbiere i formatet PPPLLSS, hvor PPP er fejlindprikning i mm, LL forbiere liggende og SS forbiere stående. Eksempel 0030201 betyder 3 mm fejl, 2 liggende og 1 stående forbier. +open_error = Kan ikke åbne X.\n\nY. +open_error_locked = Dette løb er allerede åbnet i MeOS. \n\nDet er nødvendigt at bruge en database hvis mere end en instans af løbet skal bruges samtidigt. +radio X = radio X +saknas = mangler +se license.txt som levereras med programmet = see license.txt som følger med programmet +serverbackup = server backup +sexa = seks +sjua = syv +sjunde = syvende +sjätte = sjette +skicka stämplar = send stemplinger +sortering: X, antal rader: Y = sortering: X, antal rækker: Y +sortering: X, antal rækker: Y = sorteringsorden: X, antal rækker: Y +starten (X) = starten (X) +sträcka X = tur X +stämplade vid = stemplede ved +stämplar vid X som Y, på tiden Z = stempler ved X som Y, i tiden Z +tar ledningen med tiden X = overtager føringen med tiden X +tar ledningen vid X med tiden Y = tager føringen ved X med tiden Y +tia = ti +till = til +tionde = tiende +tolfte = tolvte +tolva = tolv +tooltip:analyze = Analyser data og forhåndsvis import. +tooltip:builddata = Udvid MeOS's kendskab til løbere, klubber og klasser ved at analysere løbsdata. +tooltip:import = Importer tilmeldinger fra fil. +tooltip:inforest = Liste over løbere i skoven og løbere som ikke er startet. +tooltip:paste = Indsæt fra udklipsholder. +tooltip:resultprint = Udskriv resultater til at hænge op +tooltip:voice = Computerstemme der læser forvarslinger op. +tooltip_explain_status = - = Ukendt status (Intet resultat endnu)\nOK = Godkendt løb\nEj start = Løber ikke startet\nFejlklip = Mangler stempling(klip)\nUdgået = Løber udgået (ingen måltid)\nDiskv. = Løber diskvalificeret\nMaks.tid = Løbstid over maksimal løbstid\nDelt. ej = Deltager ikke i løbet +trea = tre +tredje = tredje +tvåa = toer +vid kontroll X = ved post X +väntas till X om någon minut = ventes til X i løbet af nogle minutter +väntas till X om någon minut, och kan i så fall ta en Y plats = ventes til X indenfor et minut, og kan i så fald tage en Y plads. +väntas till X om någon minut, och kan i så fall ta ledningen = ventes til X indenfor et minut, og kan tage føringen. +växeln = skiftet +växlar på X plats med tiden Y = skifter på X plads med tiden Y +växlar på X plats, efter Y, på tiden Z = skifter på X plads, efter Y, med tiden Z +växlar på delad X plats med tiden Y = skifter på en delt X plads med tiden Y +warn:changedtimezero = Ændrer nultiden for et løb der er i gang, hvilket ikke kan anbefales.\n\nVil du fortsætte alligevel? +warn:notextended = INFO: Programmer enheden til at bruge "Extended Protocol" med brug af SI.Config programmet for at gøre aflæsning af brikkerne hurtigere. +warn:olddbversion = Databasen bruges af en nyere version af MeOS. Opgradering anbefales. +warn:opennewversion = Dette løb er dannet i MeOS X. Du risikerer at tabe data hvis du fortsætter.\n\nVil du fortsætte? +warn:updatelegs = Det kan være nødvendigt at opdatere længden af de enkelte baner. +warning:dbproblem = ADVARSEL. Problemer med databaseforbindelsen: 'X'. Forbindelsen genoprettes automatisk. Fortsæt med at arbejde normalt. +warning:direct_result = OBS. bruf af kræver at alle poster er radioposter eller at MeOS kun bruges til tidtagning uden baner.\n\nSkal resultat ved målstempling aktiveres? +warning:drawresult = Klassen har allerede resultater, starttider overskrives. Vil du fortsætte? +warning:has_entries = Klassen har allerede løbere. Hvis du ændrer turfordelingen kan du miste data.\n\nVil du fortsætte? +warning:has_results = Klassen har allerede resultater. Ændring af turfordelingen er usædvanligt.\n\nVil du fortsætte? +xml-data = XML data +Äldre protokoll = Ældre protokol +Ändra = Skift +Ändra grundläggande inställningar och gör en ny fördelning = Skift grundlæggende indstillinger og foretag en ny fordeling +Ändra inställningar = Skift indstillinger +Ändra klassinställningar = Skift klasseindstillinger +Ändra lag = Skift hold +Ändra lagets gaffling = Ændr holdets gafflinger +Ändra sträckindelning = Skift turfordeling +Ändrad = Ændret +Ändrade avgift för X deltagare = Ændret afgift for X deltager(e) +Åldersfilter = Aldersfilter +Åldersgräns ungdom = Aldersgrænse ungdom +Åldersgräns äldre = Aldersgrænse ældre +Åldersgränser, reducerad anmälningsavgift = Aldersgrænser, reduceret løbsafgift +Ångra = Fortryd +Återansluten mot databasen, tävlingen synkroniserad = Gentilsluttet til databasen, løbet synkroniseret +Återbud = Slet tilmelding +Återgå = Gå tilbage +Återställ = Fortryd +Återställ / uppdatera klasstillhörighet = Gendan / opdater klassetilhørsforhold +Återställ löpare med registrering till = Gendan løber med registrering til +Återställ säkerhetskopia = Gendan fra sikkerhedskopi +Återställ tabeldesignen och visa allt = Gendan tabeldesign og vis alt +ÅÅÅÅ-MM-DD = ÅÅÅÅ-MM-DD +Ökande = Stigende +Öppen = Åben +Öppen klass = Åben klasse +Öppna = Åbn +Öppna fil = Åbn fil +Öppna från aktuell tävling = Åbn fra aktuelt løb +Öppna föregående = Åbn foregående +Öppna föregående etapp = Åbn foregående etape +Öppna i ett nytt fönster = Åbn i nyt vindue +Öppna klasser, ungdom = Åbne klasser, ungdom +Öppna klasser, vuxna = Åbne klasser, voksne +Öppna nästa = Åbn næste +Öppna nästa etapp = Åbn næste etape +Öppna tävling = Åbn løb +Öppna vald tävling = Åbn valgte løb +Öppnad tävling = Åbnet løb +Överför anmälda = Overfør tilmeldte +Överför nya deltagare i ej valda klasser med status "deltar ej" = Overfør nye deltagere i ikke valgte klasser med status "deltager ikke" +Överför resultat = Overfør resultater +Överför resultat till X = Overfør resultater til X +Överför resultat till nästa etapp = Overfør resultat til næste etape +Överföring = Overførsel +Övertid = Tidsoverskridelse +Övre datumgräns = Øvre datogrænse +Övre gräns (år) = Øvre datogrænse (år) +Övre ålder = Øvre alder +Övriga = Øvrige +är först i mål med tiden X = er først i mål med tiden X +är först vid X med tiden Y = er først ved X med tiden Y +är först vid växeln med tiden X = er først ved skiftet med tiden X +är inte godkänd = er diskvalificeret +återställd = gendannet +åtta = otte +åttonde = ottende +Antal banor = Antal baner +Antal per bana = Antal pr. bane +Could not load list 'X' = Kunne ikke indlæse liste 'X' +Från den här listan kan man skapa etiketter att klistra på kartor = Med denne liste kan man lave labels til klistre på kortene +Gafflingar i tabellformat = Gaflinger på tabelformat +Kopiera = Kopier +Kopiera till urklipp = Kopier til udklipsholder +Liveresultat = Live resultater +Result on leg = Result for stræk +RunnerStartCond = Løberens starttid (individuel) +StartTimeForClassRange = Klassens startperiode +TeamStartCond = Holdets starttid (hvis individuel) +Vakanser - X = Vakante - X +Visa rullande tider mellan kontroller i helskärmsläge = Vis rullende tider mellem poster i fuld skærm. +help:liveresultat = Denne funktion starter en timer i fuldskærmformat når en løber i en valgt klasse stempler posten og måler så tiden indtil posten stemples. Ellers vises en liste over de bedste tider på strækket. Begge poster skal naturligvis være online(radio) poster. Hvis data sendes over et netværk bør posterne være sat op til 'hurtig indsendelse' for at få en hurtigt reagerende visning. +Aktivera stöd för tider över 24 timmar = Understøt løb der varer mere end 24 timer +Alla uthyrda brickor har bockats av = Alle lejebrikker er krydset af +Avbockade brickor = Afkrydsede brikker +Avstämning hyrbrickor = Afstemning af lejebrikker +Betalningsmetoder = Måder hvorpå der kan betales +Betalsätt = Betalingsmåde +Bricka X används också av = Brik X bruges også af +Brickor markerade som både uthyrda och egna: X = Brikker der er markeret både som lejebrik og som privat X +Datumfilter = Dato filter +Destination: X = Destination: X +Du kan använda en SI-enhet för att läsa in bricknummer = Du kan bruge en SI enhed til at indlæse nummeret på brikken +Ej startstämpling = Ingen startstempling +Extraplatser = Ekstra pladser +Felaktigt datumformat 'X' (Använd ÅÅÅÅ-MM-DD) = Fejlagtigt datoformat 'X' (Brug YYYY-MM-DD) +Felaktigt tidsformat 'X' (Använd TT:MM:SS) = Fejlagtigt tidsformat 'X' (Brug HH:MM:SS) +Fritt = Frit +Från lag = Fra hold +Förväntat antal besökare: X = Forventet antal deltagere: X +Gafflingsnyckel = Gafflingsnøgle +Hämta inställningar från föregående lottning = Hent indstillinger fra tidligere lodtrækning +Ignorera startstämpling = Ignorer startstempling +Ingen parstart = Individuel start +Inget filter = Intet filter +Inkludera information om flera lopp per löpare = Inkluder information om flere løb for den enkelte løber +Inlästa stämplar = Indlæs stemplinger +Invalid filter X = Ugyldigt filter X +Invalid font X = Ugyldigt font X +Klasserna X och Y har samma externa id. Använd tabelläget för att ändra id = Klasserne X og Y har samme eksterne id. Brug tabeltilstand til at rette id +Lag + sträcka = Hold + tur +Lotta klasser med banan X = Lodtræk klasser med bane 'X' +Lotta klasser med samma bana gemensamt = Lodtræk klasser med samme bane samlet +Lotta starttider = Lodtræk starttider +Löpare saknas = Ingen løbere +MeOS Timing = MeOS Timing +Med resultat = Med resultat +Nollställ = Nulstil +Nollställ minnet; markera alla brickor som icke avbockade = Nulstil hukommelse; glem alle afkrydsede brikker +Nummerlappshantering = Håndtering af brystnumre +Ogiltig destination X = Ugyldig destination X +Ogiltigt antal sekunder: X = Ugyldigt antal sekunder: X +Oordnade parallella = Ikke ordnede paralelle +Parvis (två och två) = Parvis (to og to) +Rapport = Rapport +Result at a control = Resultat ved post +RunnerLegNumber = Løbere grupperet efter stræk +RunnerRogainingPointGross = Rogaining (hold) point før reduktion +RunnerStartZero = Løberes relative starttid (nultid) +Samlade poäng = Samlet antal point +Spara starttider = Gem starttider +Starttiden är definerad genom klassen eller löparens startstämpling = Starttiden er defineret ud fra klassen eller ud fra løberens startstempling +Säkerhetskopierar om = Laver sikkerhedskopi om +Säkerhetskopiering = Interval Backup +TeamStartZero = Holdets relative start tid (nul tid) +Tidsavdrag = Fradrag i tid +Total/team result at a control = Samlet/hold resultat ved en post +Totalt antal unika avbockade brickor: X = Samlet antal (unikke) afkrydsede brikker: X +Uppdatera inte starttiden vid startstämpling = Opdater ikke starttid ved startstempling +Uthyrda brickor som inte avbockats = Lejbrikker som ikke er krydset af +Uthyrda: X, Egna: Y, Avbockade uthyrda: Z = Lejede: X, Private: Y, Lejede/afkrydsede: Z +Varning: Brickan X används redan av Y = Advarsel: Brik x bruges allerede af Y +Vill du göra om avbockningen från början igen? = Vil du starte forfra med afkrydsning? +Vill du koppla isär X från inläst bricka Y? = Vil du fjerne kobling af X til den indlæste brik Y? +Vissa inställningar kräver omstart av MeOS för att ha effekt = Nogle indstiller kræver at MeOS genstartes før de virker +X och Y[N by N] = X og Y +X p = X p +X platser. Startar Y = X pladser. Starter Y +Year of birth = Førdselsår +delar placering med X = deler placering med X +encoding = encoding +false[boolean] = false +help:checkcards = Brug denne funktion for at tælle og krydse lejebrikker af for at se at de alle er returneret. Kobl en SI enhed til PC'en (helst programmeret som postenhed eller mål, da det er hurtigere end hvis den er sat op til aflæs) og stempl alle de returnerede brikker. Tryk på Rapport for at se om der mangler brikker. \n\nDette foregår lokalt på denne PC og ændrer ikke ved selve løbets data. +help:long_times = Løbsdato er dato hvor alle klasser starter. Nultid er midnat. +help:paymentmodes = Man kan definere egne betalingsformer for at kunne skelne i regnskabet. +leder med X = fører med X +leder med X; har tappat Y = fører med X; har tabt Y +leder med X; sprang Y snabbare än de jagande = fører med X; løb Y hurtigere end de efterfølgende +prefsAccount = Standard kontonummer +prefsAddress = Standard adresse +prefsAdvancedClassSettings = Vis avancerede klasseindstillinger +prefsAutoSaveTimeOut = Interval for automatisk backup (ms) +prefsAutoTie = Kobl automatisk løber til brik +prefsCardFee = Standard brikleje +prefsClient = Client navn i netværk +prefsControlFrom = Seneste fra kontrol +prefsControlTo = Seneste til kontrol +prefsCurrencyFactor = Valutakurs +prefsCurrencyPreSymbol = Valutatype før beløb +prefsCurrencySeparator = Decimaltegn for valuta +prefsCurrencySymbol = valutasymbol +prefsDatabase = Brug løberdatabase +prefsDatabaseUpdate = Seneste opdatering af løberdatabase +prefsDefaultDrawMethod = Foretrukken lodtrækningsmetode +prefsDirectPort = Network port for advance punch data +prefsEMail = EMail +prefsEliteFee = Standard elite startgebyr +prefsEntryFee = Standard startgebyr +prefsEventorBase = URL til Eventor +prefsFirstInvoice = First regningsnummer +prefsFirstTime = Første opstart +prefsHomepage = Hjemmeside +prefsInteractive = Interaktiv brikhåndtering +prefsLateEntryFactor = Faktor for sen tilmelding +prefsLiveResultFont = Font brugt til Live resultater +prefsMIPURL = URL for MIP server +prefsMOPFolderName = Lokal MOP mappe +prefsMOPURL = URL for MOP server +prefsManualInput = Brug manuel resultat indlæsning +prefsMaximumSpeakerDelay = Maksimal forsinkelse af speakeropdatering +prefsOrganizer = Arrangør +prefsPort = MySQL netværks port +prefsRentCard = Leje af brik +prefsSeniorAge = Senioraldersgrænse +prefsServer = Standard netværks server +prefsSpeakerShortNames = Brug initialer i navne +prefsStreet = Arrangør adresse +prefsSynchronizationTimeOut = Network update timeout (ms) +prefsTextFont = MeOS text tegnsæt +prefsUseDirectSocket = Use avancerede stemplingsdata +prefsUseEventor = Brug Eventor +prefsUseEventorUTC = Brug UTC (universal coordinated time) mod Eventor +prefsUseHourFormat = Brug tidsformat HH:MM:SS i stedet for MMM:SS +prefsUserName = MySQL user name +prefsYouthAge = Ungdomsaldersgrænse +prefsYouthFee = Ungdoms startgebyr +prefsaddressxpos = Adresse x-koordinat +prefsaddressypos = Adresse y-koordinat +prefsclasslimit = Grænse for antal resultater per klasse +prefsintertime = Vis mellemtider +prefspagebreak = Indsæt sideskift +prefssplitanalysis = Foretag split time analyse +reused card = genbrugt brik +sekund = sekund +sekunder = sekunder +skickar ut X = sender X ud +true[boolean] = true +var först i mål med tiden X = var først i mål med tiden X +var först vid X med tiden Y = var først til X med tiden Y +var först vid växeln med tiden X = var først til skiftet med tiden X +Ändra MeOS lokala systemegenskaper = Skift MeOS lokale systemegenskaber +Ändra X = Ændr X +Ändra lokala inställningar = Skift lokale indstilliger +är X efter = er X efter +är X efter Y = er X efter Y +är X efter; har tagit in Y = er X efter; har indhentet Y +är X efter; har tappat Y = er X efter; har tabt Y +är X före Y = er X foran Y +är nu på X plats med tiden Y = er nu på X plads med tiden Y +är nu på delad X plats med tiden Y = er nu på delt X plads med tiden Y +övriga = øvrige +ClassTeamLegResult = Klasse og tur resultat +Climb (m) = Stigning (m) +Databaskälla = Kildedatabase +Export language = Exportsprog +Export split times = Exporter mellemtider +Filnamn IOF (xml) eller OE (csv) med löpare = Filenavn IOF (xml) eller OE (csv) med løbere +Importinställning = Import opsætning +Längsta tid i sekunder att vänta med utskrift = Det længste, i sekunder, der ventes med udskrift +Max antal brickor per sida = Max antal Si-brikker per side +SortLastNameOnly = Efternavn +Sträcktider i kolumner (för standardpapper) = Stræktider i kolonner (på standard papirformat) +Utrymme: X = Plads: X +[Radera] = [Slet] +prefsExportCSVSplits = Inkluder mellemtider i csv export +prefsExportFormat = Foretrukket eksportformat +prefsImportOptions = Foretrukken import opsætning +prefsNumSplitsOnePage = Antal Si-brikker per side +prefsPayModes = Betalingsmåder +prefsSplitLateFees = Opdel beløb for for sen tilmelding i normal- og tillægsdel ved IOF XML eksport +prefsSplitPrintMaxWait = Maksimal ventetid for udskrift af mellemtider +prefsWideSplitFormat = Udskriv mellemtider i bredformat diff --git a/code/download.cpp b/code/download.cpp new file mode 100644 index 0000000..42da6fd --- /dev/null +++ b/code/download.cpp @@ -0,0 +1,457 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" +#include "Download.h" +#include +#include "Localizer.h" +#include "meos_util.h" +#include "progress.h" + +#include +#include +#include + +#include + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +Download::Download() +{ + hThread = 0; + doExit = false; +//hProgress = NULL; + + fileno = 0; + hInternet = NULL; + hURL = NULL; + + bytesLoaded = 0; + bytesToLoad = 1024; + + success = false; +} + +Download::~Download() +{ + shutDown(); + endDownload(); + + if (hInternet) + InternetCloseHandle(hInternet); +} + +void __cdecl SUThread(void *ptr) +{ + Download *dwl=(Download *)ptr; + dwl->initThread(); +} + +bool Download::createDownloadThread() { + doExit=false; + hThread=_beginthread(SUThread, 0, this); + + if (hThread==-1) { + hThread=0; + return false; + } + + return true; +} + +void Download::shutDown() +{ + if (hThread) { + doExit=true; + + int m=0; + while(m<100 && hThread) { + Sleep(0); + Sleep(10); + m++; + } + //If unsuccessful ending thread, do it violently + if (hThread) { + OutputDebugString("Terminate thread...\n"); + TerminateThread(HANDLE(hThread), 0); + CloseHandle(HANDLE(hThread)); + } + hThread=0; + } + +} + +void Download::initThread() +{ + int status = true; + while(!doExit && status) { + status = doDownload(); + } + hThread=0; +} + +void Download::initInternet() { + hInternet = InternetOpen("MeOS", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); + + if (hInternet==NULL) { + DWORD ec = GetLastError(); + string error = lang.tl("Error: X#" + getErrorMessage(ec)); + throw std::exception(error.c_str()); + } + + DWORD dwTimeOut = 120 * 1000; + InternetSetOption(hInternet, INTERNET_OPTION_RECEIVE_TIMEOUT, &dwTimeOut, sizeof(DWORD)); + InternetSetOption(hInternet, INTERNET_OPTION_SEND_TIMEOUT, &dwTimeOut, sizeof(DWORD)); +} + +void Download::downloadFile(const string &url, const string &file, const vector< pair > &headers) +{ + if (hURL || !hInternet) + throw std::exception("Not inititialized"); + + success = false; + + string hdr; + for (size_t k = 0; k= 400) { + char bf[256]; + switch (dwStatus) { + case HTTP_STATUS_BAD_REQUEST: + sprintf_s(bf, "HTTP Error 400: The request could not be processed by the server due to invalid syntax."); + break; + case HTTP_STATUS_DENIED: + sprintf_s(bf, "HTTP Error 401: The requested resource requires user authentication."); + break; + case HTTP_STATUS_FORBIDDEN: + sprintf_s(bf, "HTTP Error 403: Åtkomst nekad (access is denied)."); + break; + case HTTP_STATUS_NOT_FOUND: + sprintf_s(bf, "HTTP Error 404: Resursen kunde ej hittas (not found)."); + break; + case HTTP_STATUS_NOT_SUPPORTED: + sprintf_s(bf, "HTTP Error 501: Förfrågan stöds ej (not supported)."); + break; + case HTTP_STATUS_SERVER_ERROR: + sprintf_s(bf, "HTTP Error 500: Internt serverfel (server error)."); + break; + default: + sprintf_s(bf, "HTTP Status Error %d", dwStatus); + } + throw dwException(bf, dwStatus); + } + } + + fileno=_open(file.c_str(), O_BINARY|O_CREAT|O_WRONLY|O_TRUNC, S_IREAD|S_IWRITE); + + if (fileno==-1) { + fileno=0; + endDownload(); + char bf[256]; + sprintf_s(bf, "Error opening '%s' for writing", file.c_str()); + throw std::exception(bf); + } + + bytesLoaded = 0; + return; +} + +void Download::endDownload() +{ + if (hURL && hInternet) { + InternetCloseHandle(hURL); + hURL=NULL; + } + + if (fileno) { + _close(fileno); + fileno=0; + } +} + +bool Download::doDownload() +{ + if (hURL && hInternet) { + char buffer[512]; + + DWORD bRead; + if (InternetReadFile(hURL, buffer, 512, &bRead)) { + //Success! + if (bRead==0) { + //EOF + success=true; + endDownload(); + } + else{ + if (_write(fileno, buffer, bRead) != int(bRead)) { + endDownload(); + return false; + } + bytesLoaded+=bRead; + return true; + } + } + } + return false; +} + +void Download::setBytesToDownload(DWORD btd) +{ + bytesToLoad = btd; +} + +bool Download::isWorking() +{ + return hThread!=0; +} + +bool Download::successful() +{ + return success; +} + +void Download::postFile(const string &url, const string &file, const string &fileOut, + const vector< pair > &headers, ProgressWindow &pw) { + SetLastError(0); + DWORD_PTR dw = 0; + URL_COMPONENTS uc; + memset(&uc, 0, sizeof(uc)); + uc.dwStructSize = sizeof(uc); + char host[128]; + char path[128]; + char extra[256]; + uc.lpszExtraInfo = extra; + uc.dwExtraInfoLength = sizeof(extra); + uc.lpszHostName = host; + uc.dwHostNameLength = sizeof(host); + uc.lpszUrlPath = path; + uc.dwUrlPathLength = sizeof(path); + + InternetCrackUrl(url.c_str(), url.length(), ICU_ESCAPE, &uc); + int port = INTERNET_DEFAULT_HTTP_PORT; + if (uc.nScheme == INTERNET_SCHEME_HTTPS) + port = INTERNET_DEFAULT_HTTPS_PORT; + else if (uc.nPort>0) + port = uc.nPort; + HINTERNET hConnect = InternetConnect(hInternet, host, port, + NULL, NULL, INTERNET_SERVICE_HTTP, 0, dw); + bool success = false; + int errorCode = 0; + try { + success = httpSendReqEx(hConnect, path, headers, file, fileOut, pw, errorCode); + } + catch (std::exception &) { + InternetCloseHandle(hConnect); + throw; + } + InternetCloseHandle(hConnect); + + if (!success) { + if (errorCode != 0) + errorCode = GetLastError(); + + string error = errorCode != 0 ? getErrorMessage(errorCode) : ""; + if (error.empty()) + error = "Ett okänt fel inträffade."; + throw std::exception(error.c_str()); + } + } + +bool Download::httpSendReqEx(HINTERNET hConnect, const string &dest, + const vector< pair > &headers, + const string &upFile, const string &outFile, + ProgressWindow &pw, + int &errorCode) const { + errorCode = 0; + INTERNET_BUFFERS BufferIn; + memset(&BufferIn, 0, sizeof(BufferIn)); + BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS ); + + HINTERNET hRequest = HttpOpenRequest (hConnect, "POST", dest.c_str(), NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0); + + DWORD dwBytesRead = 0; + DWORD dwBytesWritten = 0; + BYTE pBuffer[4*1024]; // Read from file in 4K chunks + + string hdr; + for (size_t k = 0; k0) { + + HANDLE hFile = CreateFile(upFile.c_str(), GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + + if (hFile == HANDLE(-1)) + return false; + + + BufferIn.dwBufferTotal = GetFileSize (hFile, NULL); + BufferIn.dwHeadersLength = hdr.length(); + BufferIn.lpcszHeader = hdr.c_str(); + + double totSize = BufferIn.dwBufferTotal; + + if (!HttpSendRequestEx( hRequest, &BufferIn, NULL, 0, 0)) { + CloseHandle(hFile); + InternetCloseHandle(hRequest); + return false; + } + + DWORD sum = 0; + do { + if (!ReadFile (hFile, pBuffer, sizeof(pBuffer), &dwBytesRead, NULL)) { + errorCode = GetLastError(); + CloseHandle(hFile); + InternetCloseHandle(hRequest); + return false; + } + + if (dwBytesRead > 0) { + if (!InternetWriteFile(hRequest, pBuffer, dwBytesRead, &dwBytesWritten)) { + errorCode = GetLastError(); + CloseHandle(hFile); + InternetCloseHandle(hRequest); + return false; + } + } + sum += dwBytesWritten; + + try { + pw.setProgress(int(1000 * double(sum) / totSize)); + } + catch (std::exception &) { + CloseHandle(hFile); + InternetCloseHandle(hRequest); + throw; + } + } + while (dwBytesRead == sizeof(pBuffer)) ; + + CloseHandle(hFile); + + if (!HttpEndRequest(hRequest, NULL, 0, 0)) { + DWORD error = GetLastError(); + errorCode = error; + if (error == ERROR_INTERNET_FORCE_RETRY) + retry--; + else if (error == ERROR_INTERNET_TIMEOUT) { + throw std::exception("Fick inget svar i tid (ERROR_INTERNET_TIMEOUT)"); + } + else { + InternetCloseHandle(hRequest); + return false; + } + } + else + retry = 0; // Done + } + + DWORD dwStatus = 0; + DWORD dwBufLen = sizeof(dwStatus); + int success = HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, + (LPVOID)&dwStatus, &dwBufLen, 0); + + if (success) { + if (dwStatus >= 400) { + char bf[256]; + switch (dwStatus) { + case HTTP_STATUS_BAD_REQUEST: + sprintf_s(bf, "HTTP Error 400: The request could not be processed by the server due to invalid syntax."); + break; + case HTTP_STATUS_DENIED: + sprintf_s(bf, "HTTP Error 401: The requested resource requires user authentication."); + break; + case HTTP_STATUS_FORBIDDEN: + sprintf_s(bf, "HTTP Error 403: Åtkomst nekad (access is denied)."); + break; + case HTTP_STATUS_NOT_FOUND: + sprintf_s(bf, "HTTP Error 404: Resursen kunde ej hittas (not found)."); + break; + case HTTP_STATUS_NOT_SUPPORTED: + sprintf_s(bf, "HTTP Error 501: Förfrågan stöds ej (not supported)."); + break; + case HTTP_STATUS_SERVER_ERROR: + sprintf_s(bf, "HTTP Error 500: Internt serverfel (server error)."); + break; + default: + sprintf_s(bf, "HTTP Status Error %d", dwStatus); + } + throw dwException(bf, dwStatus); + } + } + + int fileno = _open(outFile.c_str(), O_BINARY|O_CREAT|O_WRONLY|O_TRUNC, S_IREAD|S_IWRITE); + + do { + dwBytesRead=0; + if (InternetReadFile(hRequest, pBuffer, sizeof(pBuffer)-1, &dwBytesRead)) { + _write(fileno, pBuffer, dwBytesRead); + } + } while(dwBytesRead>0); + + _close(fileno); + + InternetCloseHandle(hRequest); + return true; +} diff --git a/code/download.h b/code/download.h new file mode 100644 index 0000000..3f8cca8 --- /dev/null +++ b/code/download.h @@ -0,0 +1,91 @@ +// Download.h: interface for the Download class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_DOWNLOAD_H__DEBC6296_9CAE_4FF6_867B_DD896D0B6A7A__INCLUDED_) +#define AFX_DOWNLOAD_H__DEBC6296_9CAE_4FF6_867B_DD896D0B6A7A__INCLUDED_ + +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include +typedef HANDLE HINTERNET; + +class dwException : public std::exception { +public: + int code; + dwException(const char *msg, int id) : std::exception(msg), code(id) {} + virtual ~dwException() {} +}; + +class ProgressWindow; + +class Download { +private: + volatile unsigned hThread; + volatile bool doExit; + //HWND hProgress; + + HINTERNET hInternet; + HINTERNET hURL; + + int fileno; + + DWORD bytesLoaded; + DWORD bytesToLoad; + bool success; + void initThread(); + + bool httpSendReqEx(HINTERNET hConnect, const string &dest, const vector< pair > &headers, + const string &upFile, const string &outFile, ProgressWindow &pw, int &errroCode) const; + +public: + + void postFile(const string &url, const string &file, const string &fileOut, + const vector< pair > &headers, ProgressWindow &pw); + int processMessages(); + bool successful(); + bool isWorking(); + void setBytesToDownload(DWORD btd); + void endDownload(); + void downloadFile(const string &url, const string &file, const vector< pair > &headers); + void initInternet(); + void shutDown(); + bool createDownloadThread(); + void downLoadNoThread() {initThread();} + + Download(); + virtual ~Download(); + +protected: + bool doDownload(); + + friend void SUThread(void *ptr); + +}; + +#endif // !defined(AFX_DOWNLOAD_H__DEBC6296_9CAE_4FF6_867B_DD896D0B6A7A__INCLUDED_) diff --git a/code/english.lng b/code/english.lng new file mode 100644 index 0000000..57b4811 --- /dev/null +++ b/code/english.lng @@ -0,0 +1,2241 @@ +encoding = ANSI +%s m = %s m +%s meter = %s meters +%s, block: %d = %s, block: %d +(ledare) = (leader) +(lokalt) = (local, no server) +(okänd) stämplade vid = (unknown) punched at +(på server) = (on server) +(sekunder) = (seconds) +(sträckseger) = (leg winner) +ALLA( = All( +API-nyckel = API key +Accepterade elektroniska fakturor = Accepted electronic invoices +Adress = Address +Adress och kontakt = Address and contact +Aktivera = Activate +Alla = All +Alla banfiler = All course files +Alla deltagare måste ha ett namn = All competitors must have a name +Alla fakturor = All Invoices +Alla händelser = All events +Alla lag måste ha ett namn = All teams must have a name +Alla listor = All Lists +Alla lopp = All races +Alla sträckor/lopp i separata filer = All legs/races in separate files +Alla typer = All types +Allmänna resultat = General results +Andel vakanser = Vacancy fraction +Ange första nummerlappsnummer eller lämna blankt för inga nummerlappar = Provide the first bib number, or blank for no bibs +Ange om kontrollen fungerar och hur den ska användas = Specify if the controls is operational and how it is to be used +Ange startintervall för minutstart = Enter start interval for restart +Ange tiden relativt klassens första start = Enter time relative the first start of the class. +Anm. avg. = Entry fee +Anm. avgift = Entry fee +Anm. datum = Entry date +Anmäl = Enter +Anmäl X = Enter X for the competition +Anmälda = Entries +Anmälda per distrikt = Entries per district +Anmälningar = Entries +Anmälningar (IOF (xml) eller OE-CSV) = Entries (IOF (xml) or OE-CSV) +Anmälningsavgift = Entry fee +Anmälningsläge = Quick entry mode +Anslut = Connect +Anslut till en server = Connect to a server +Ansluten till = Connected to +Ansluter till Internet = Connecting to the Internet +Anslutna klienter = Connected clients +Anslutningar = Connections +Anslutningsinställningar = Connection settings +Antal = Number +Antal besökare X, genomsnittlig bomtid Y, största bomtid Z = Number of visitors X, average lost time Y, max lost time Z +Antal ignorerade: X = Number of ignored entries: X +Antal importerade = Number of imported +Antal kartor = Number of maps +Antal klasser = Number of classes +Antal löpare = Number of runners +Antal löpare på vanligaste banan X = Number of runners on most used course X +Antal misslyckade: X = Number of failed entries: X +Antal startande per block = Number of starts per block +Antal startande per intervall (inklusive redan lottade) = Numbers of starts per interval (including already drawn) +Antal sträckor = Number of legs +Antal vakanser = Number of vacancies +Antal: %d = Number: %d +Antal: X = Number: X +Antalet rader i urklipp får inte plats i selektionen = The number of rows on the clipboard does not fit the selection +Använd Eventor = Use Eventor +Använd banpool = Use course pool +Använd funktioner för fleretappsklass = Use functions for multi stage class +Använd första kontrollen som start = Use first control as start +Använd löpardatabasen = Use runner database +Använd sista kontrollen som mål = Use last control as finish +Använd speakerstöd = Use Speaker Module +Använd stor font = Use large type face +Använd symbolen X där MeOS ska fylla i typens data = Use the symbol X where MeOS should fill in the data +Användarnamn = User name +Applicera för specifik sträcka = Apply for a specific leg +Arrangör = Organizer +Att betala = To pay +Att betala: X = To pay: X +Automater = Services +Automatisera = Automatize +Automatisk lottning = Draw Automatically +Automatisk skroll = Automatic Scroll +Automatisk utskrift = Automatic printout +Automatisk utskrift / export = Automatic printing / export +Av MeOS: www.melin.nu/meos = By MeOS: www.melin.nu/meos +Avancerat = Advanced +Avbryt = Cancel +Avgift = Fee +Avgifter = Fees +Avgiftshöjning (procent) = Fee extension (percent) +Avgjorda klasser (prisutdelningslista) = Settled classes (Prize Ceremony List) +Avgjorda placeringar - %s = Settled Results - %s +Avgörande händelser = Decisive events +Avgörs X = Ready at X +Avgörs kl = Time ready +Avläsning/radiotider = Readout/radio +Avmarkera allt = Deselect all +Avrundad tävlingsavgift = Competition fee, rounded +Avsluta = Exit +Bad file format = Bad file format +Bana = Course +Bana %d = Course %d +Banan används och kan inte tas bort = The course is in use +Banan måste ha ett namn = The course must have a name +Banmall = Course +Banor = Courses +Banor (antal kontroller) = Courses (number of controls) +Banor för %s, sträcka %d = Courses for %s, leg %d +Banor, IOF (xml) = Courses, IOF (xml) +Banor, OCAD semikolonseparerat = Courses, OCAD format +Banpool = Course pool +Banpool, gemensam start = Course pool, simultaneous start +Banpool, lottad startlista = Course pool, drawn start list +Bantilldelning = Course Assignment +Bantilldelning, individuell = Course assignment, individual +Bantilldelning, stafett = Course assignment, relay +Bantilldelningslista - %s = Assigned Courses - %s +Basintervall (min) = Base interval (min) +Begränsa antal per klass = Limit number per class +Begränsa per klass = Limit class-wise +Begränsning, antal visade per klass = Limit, number of entries per class +Behandlar löpardatabasen = Processing runner database +Behandlar tävlingsdata = Processing competition data +Behandlar: X = Processing: X +Bekräfta att %s byter klass till %s = Please confirm that %s changes class to %s +Bekräfta att deltagaren har lämnat återbud = Please confirm drop out of this runner +Betalat = Paid +Betalningsinformation = Payment details +Bevakar händelser i X = Monitoring events in X +Bevakningsprioritering = Select runner to watch +Block = Block +Blockbredd = Block width +Bläddra = Browse +Bold = Bold +BoldHuge = Bold, gigantic +BoldLarge = Bold, large +BoldSmall = Bold, small +Bommade kontroller = Control mistakes +Bomtid = Time lost +Bomtid (max) = Lost time (max) +Bomtid (medel) = Lost time (average) +Bomtid (median) = Lost time (median) +Bomtid: X = Lost time: X +Bricka = Card +Bricka %d används redan av %s och kan inte tilldelas = Card %d is in use by %s and cannot be assigned +Brickan redan inläst = Card has already been read out +Brickhyra = Card fee +Bricknummret är upptaget (X) = The card is in use (X) +Brickor = Cards +Bygg databaser = Build Databases +COM-Port = COM-Port +Check = Check +ClassCourseResult = Class, course, result +ClassFinishTime = Class, finish time +ClassLength = Course length for class +ClassName = Class +ClassPoints = Class, points +ClassResult = Class, result +ClassResultFraction = Fraction of class complete +ClassStartName = Start name +ClassStartTime = Class, start time, name +ClassStartTimeClub = Class, start time, club +ClassTotalResult = Class, total result +Club = Club +ClubName = Club +ClubRunner = Club (competitor) +CmpDate = Competition date +CmpName = Competition name +CourseClimb = Course climb +CourseLength = Course length, specific course +CourseName = Course name +CourseResult = Course, result +CurrentTime = Current time +Databasanslutning = Database Connection +Databasvarning: X = Database warning: X +Datorröst som läser upp förvarningar = Computer voice announcing runners +Datum = Date +Decimalseparator = Decimal separator +DefaultFont = Standard formatting +Dela = Split +Dela efter ranking = Split by ranking +Dela klass: X = Split Class: X +Dela klassen = Split Class +Dela klubbvis = Split by club +Deltagare = Competitors +Deltagare %d = Competitor %d +Deltagaren 'X' deltar i patrullklassen 'Y' men saknar patrull. Klassens start- och resultatlistor kan därmed bli felaktiga = The competitor 'X' is in the patrol class 'Y', but has no patrol. The results in this class might be inconsistent +Deltagaren 'X' deltar i stafettklassen 'Y' men saknar lag. Klassens start- och resultatlistor kan därmed bli felaktiga = The competitor 'X' is in the relay class 'Y', but has no team. The results in this class might be inconsistent +Deltagaren 'X' saknar klass = The competitor 'X' has no class +Deltar ej = NTP +Denna etapps nummer = Ordinal of this stage +Destinationskatalog = Destination folder +Det går endast att sätta in vakanser på sträcka 1 = You can only add vacancies to the first leg +Det här programmet levereras utan någon som helst garanti. Programmet är = There is no warranty for this program; it is provided "as is". The program is +Direktanmälan = Quick entry +Disk. = DISQ +Distriktskod = District code +Don't know how to align with 'X' = Don't know how to align with 'X' +Du kan importera banor och klasser från OCADs exportformat = You can import courses and classes from the export format of OCAD +Du måste välja en klass = You have to select a class +Duplicera = Duplicate +E-post = Email +Efter = Behind +Efteranm. avg. = Late fee +Efteranmälda (efter ordinarie) = Late Entries (After) +Efteranmälda (före ordinarie) = Late Entries (Before) +Efteranmälda före ordinarie = Late entries in front +Efteranmälningar = Late Entries +Egen listrubrik = Custom list heading +Egen text = Custom text +Egenskaper = Properties +Eget fönster = New Window +Egna listor = Custom Lists +Ej accepterade elektroniska fakturor = Refused electronic invoices +Ej elektronisk = Not electronic +Ej lottade = Not Drawn +Ej lottade, efter = Draw Remaining After +Ej lottade, före = Draw Remaining Before +Ej start = DNS +Ej tidtagning = Without timing +Ekonomisk sammanställning = Economical summary +Elektronisk = Electronic +Elektronisk godkänd = Electronic accepted +Elit = Elite +Elitavgift = Elite fee +Elitklasser = Elite classes +En gafflad sträcka = One forked stage +En klass kan inte slås ihop med sig själv = You cannot merge a class with itself +En klubb kan inte slås ihop med sig själv = A club cannot be merged with itself +Endast en bana = Single Course +Enhetstyp = Unit type +Etapp = Stage +Etapp X = Stage X +Etappresultat = Stage Results +Eventorkoppling = Eventor Connection +Export av resultat/sträcktider = Export Results / Splits +Exportera = Export +Exportera / Säkerhetskopiera = Export / Backup +Exportera alla till HTML = Export all to HTML +Exportera datafil = Export Data +Exportera elektroniska fakturor = Export electronic invoices +Exportera inställningar och löpardatabaser = Export Settings and Databases +Exportera löpardatabas = Export Runner Database +Exportera nu = Export now +Exportera på fil = Export to file +Exportera resultat på fil = Export results to file +Exportera startlista på fil = Export start list to file +Exportera sträcktider = Export Splits +Exportera tävlingsdata = Export data +Externt Id = External ID +Extra = Extra +Extra stämplingar = Extra punches +Extralöparstafett = Co-runner relay +FAKTURA = INVOICE +FEL, inget svar = Error, no response +FEL: Porten kunde inte öppnas = Error: Port could not be opened +Failed to generate card = Failed to generate card +Failed to open 'X' for reading = Failed to open 'X' for reading +Faktiskt startdjup: X minuter = Actual start depth: X minutes +Faktura = Invoice +Faktura nr = Invoice no +Faktureras = To be invoiced +Fakturor = Invoices +Fel: X = Error: X +Fel: hittar inte filen X = Error. File not found 'X' +Felaktig kontroll = Bad control +Felaktig nyckel = Incorrect key +Felaktig sträcka = Incorrect leg number +Felaktigt filformat = Bad file format +Felst. = MP +Fil att exportera till = File to export to +Fil: X = Filename: X +Filnamn = Filename +Filnamn (OCAD banfil) = Filename (OCAD courses) +Filnamn IOF (xml) med klubbar = Filename IOF (xml) with clubs +Filnamn IOF (xml) med löpare = Filename IOF (xml) with runners +Filnamnet får inte vara tomt = The file name must not be empty +Filter = Filtering +FilterHasCard = With card +FilterNoCard = Without card +FilterNotVacant = Not vacant +FilterOnlyVacant = Only vacant +FilterRentCard = Borrowed card +FilterResult = With result +FilterStarted = Has started +Filtrering = Filtering +FinishTime = Finish time, name +Flera banor = Multiple courses +Flera banor / stafett / patrull / banpool = Multiple Courses / Relay / Patrol / Course Pool +Flera banor/stafett = Several Courses / Relay +Flytta höger = Move Right +Flytta vänster = Move Left +Format = Format +Formaterat webbdokument (html) = Free web document (html) +Formateringsregler = Formatting rules +Formulärläge = Form Mode +Fortsätt = Continue +Fri anmälningsimport = Free Entry Import +Fri starttid = Free start time +Fria starttider = Free start times +Från kontroll = From control +Fullskärm = Full Screen +Funktioner = Functions +Födelseår = Birth year +Följande deltagare deltar ej = The following competitors will not take part +Följande deltagare har bytt klass = The following competitors have changed class +Följande deltagare har bytt klass (inget totalresultat) = The following competitors have changed class (no total result) +Följande deltagare har tilldelats en vakant plats = The following competitors have taken a vacant position +Följande deltagare är anmälda till nästa etapp men inte denna = The following competitors are registered for the next stage, but not this one +Följande deltagare är nyanmälda = The following competitors generated new entries +Följande deltagare överfördes ej = The following competitors were ignored +För att ändra måltiden måste löparens målstämplingstid ändras = To change the finish time, the finish punch time must be changed +För muspekaren över en markering för att få mer information = Hoover the mouse pointer over a marking to get more information +För många kontroller = Too many controls +Förbered lottning = Prepare Drawing Times +Fördefinierade tävlingsformer = Predefined competitions +Fördela starttider = Distribute Times +Föregående = Previous +Föregående etapp = Preceding stage +Förhandsgranskning, import = Import Preview +Förhöjd avgift = Extended fee +Först-i-mål, gemensam = First to finish, common +Först-i-mål, klassvis = First to finish, class-wise +Första (ordinarie) start = First (ordinary) start +Första kontrollen = First control +Första omstartstid = First time for restart +Första ordinarie starttid = First regular start time +Första start = First start +Första starttid = First start time +Första sträckan kan inte vara parallell = First leg cannot be parallel +Försöket misslyckades = Operation failed +Förvarning på (SI-kod): alla stämplingar = Forewarning (SI code): all punches +Förvarningsröst = Forewarning Voice +Förväntad andel efteranmälda = Expected fraction of late entries +Gata = Street +Gemensam start = Simultaneous start +Generera = Generate +Generera testtävling = Generate Test Competition +Genererad = Generated at +Geografisk fördelning = Geographical distribution +Global sorteringsordning = Global sort order +Godkänd API-nyckel = API key accepted +Granska inmatning = Preview +Grund avg. = Base fee +Grundavgift = Base fee +Grundinställningar = Basic Settings +Hantera brickor = Manage Cards +Hantera flera etapper = Manage Several Stages +Hantera jaktstart = Handle Pursuit +Hantera klubbar och ekonomi = Manage clubs and economy +Hantera kvar-i-skogen = Handle Remaining Runners +Hantera löparbrickor = Handle Runner Cards +Hemsida = Homepage +Hjälp = Help +Hoppar över stafettklass: X = Skipping relay class: X +Huvudlista = Main list +Hyravgift = Card hire +Hyrbricka = Borrowed card +Hyrbricksrapport = Report with Borrowed Cards +Hyrbricksrapport - %s = Borrowed Cards - %s +Hyrd = Borrowed +Hämta (efter)anmälningar från Eventor = Fetch (late) entries from Eventor +Hämta data från Eventor = Fetch Data from Eventor +Hämta efteranmälningar = Fetch Late Entries +Hämta löpardatabasen = Fetch Runner Database +Hämta svar om elektroniska fakturor = Get data on accepted invoices +Hämta tävlingsdata = Fetch competition data +Hämta tävlingsdata för X = Fetch competition data for X +Hämtar anmälda = Fetching entries +Hämtar information om = Collecting information about +Hämtar klasser = Fetching classes +Hämtar klubbar = Fetching clubs +Hämtar löpardatabasen = Fetching runner database +Hämtar tävling = Fetching competition +Händelser = Events +Händelser - tidslinje = Events - Time line +Hög avgift = Late fee +IOF (xml) = IOF (xml) +IOF Resultat (xml) = IOF Results (xml) +IOF Resultat, version 2.0.3 (xml) = IOF Results, version 2.0.3 (xml) +IOF Resultat, version 3.0 (xml) = IOF Results, version 3.0 (xml) +IOF Startlista (xml) = IOF Start list (xml) +IOF Startlista, version 3.0 (xml) = IOF Start list, version 3.0 (xml) +IOF Startlista, version 2.0.3 (xml) = IOF Start list, version 2.0.3 (xml) +IOF Löpardatabas, version 3.0 (xml) = IOF Competitor List, version 3.0 (xml) +IOF Klubbdatabas, version 3.0 (xml) = IOF Organization List, version 3.0 (xml) +IP-adress eller namn på en MySQL-server = IP address or the name of a MySQL server +Id = Id +Identifierar X unika inledningar på banorna = Identified X unique openings of courses +Importera = Import +Importera IOF (xml) = Import IOF (xml) +Importera anmälningar = Import Entries +Importera banor = Import Courses +Importera banor/klasser = Import courses/classes +Importera en tävling från fil = Import competition from file +Importera fil = Import File +Importera från OCAD = Import from OCAD +Importera från fil = Import from File +Importera löpardatabas = Import Runner Database +Importera löpare = Import Runners +Importera löpare och klubbar / distriktsregister = Import Runners and Clubs +Importera stämplingar = Import Punches +Importera tävling = Import Competition +Importera tävlingsdata = Import Data +Importerar = Importing +Importerar OCAD csv-fil = Importing OCAD CSV +Importerar OE2003 csv-fil = Importing OE2003 CSV +Importerar OS2003 csv-fil = Importing OS2003 CSV +Importerar anmälningar (IOF, xml) = Importing entries (IOF, xml) +Importerar banor (IOF, xml) = Importing courses (IOF, xml) +Importerar klasser (IOF, xml) = Importing classes (IOF, xml) +Importerar klubbar (IOF, xml) = Importing clubs (IOF, xml) +Importerar tävlingsdata (IOF, xml) = Importing competition data (IOF, xml) +Importerbara = Importable +Index = Index +Individuell = Individual +Individuell resultatlista, alla lopp = Individual result list, all races +Individuell resultatlista, sammanställning av flera lopp = Individual results, summary +Individuell resultatlista, visst lopp = Individual results, race +Individuell resultatlista, visst lopp (STOR) = Individual results, race (LARGE) +Individuell startlista, visst lopp = Individual start list, race +Individuella deltagare = Individual competitors +Individuella slutresultat = Individual Final Results +Individuella totalresultat = Individual Total Results +Info = Information +Inga = None +Inga deltagare = No competitors +Inga vakanser tillgängliga. Vakanser skapas vanligen vid lottning = No vacancies available. Vacancies are usually created when drawing the class +Ingen = None +Ingen bana = No course +Ingen deltagare matchar sökkriteriet = No competitor match the search criteria +Ingen klass = No class +Ingen klass vald = No class selected +Ingen löpare saknar bricka = All runners has a card +Ingen matchar 'X' = No match for 'X' +Ingen rogaining = No rogaining +Inkommande = Incoming +Inläst bricka ställd i kö = Card was put in queue +Inlästa brickor = Read cards +Inmatning av mellantider = Enter Radio Times +Inspekterar klasser = Inspecting classes +Installera = Install +Inställningar = Settings +Inställningar MeOS = MeOS, Settings +Interaktiv inläsning = Interactive readout +Intervall = Interval +Intervall (sekunder). Lämna blankt för att uppdatera när tävlingsdata ändras = Interval (seconds). Leave blank to update when competition data is changed. +Intervallet måste anges på formen MM:SS = The interval must be specified as MM:SS +Italic = Italic +ItalicMediumPlus = Italic, somewhat larger +Jag sköter lottning själv = I manage start list drawing myself +Jaktstart = Pursuit +Justera blockvis = Block-wise adjustment +Justera mot = Align with +Klart = Finished +Klart. Antal importerade: X = Finished. Number of entries imported: X +Klart. X deltagare importerade = Finished. X competitors imported +Klart. X lag importerade = Finished. X teams imported +Klart. X patruller importerade = Finished. X patrols imported +Klart: alla klasser lottade = Done: all classes drawn +Klart: inga klasser behövde lottas = Done: no classes needed to be drawn +Klass = Class +Klass %d = Class %d +Klass saknad = Missing class +Klass / klasstyp = Class / Type +Klass att slå ihop = Class to merge with +Klassbyte = Change Class +Klassen 'X' har jaktstart/växling på första sträckan = The class 'X' has pursuit/changeover on the first leg +Klassen används och kan inte tas bort = The class is in use and cannot be removed +Klassen lottas inte, startstämpling = Use only start punch +Klassen måste ha ett namn = The class must have a name +Klassens bana = Class's course +Klasser = Classes +Klasser (IOF, xml) = Classes (IOF, xml) +Klasser där nyanmälningar ska överföras = Classes where new entries will be transferred +Klassinställningar = Class Settings +Klassnamn = Class name +Klasstyp = Class type +Klientnamn = Client name +Klistra in = Paste +Klistra in data från urklipp (X) = Paste from clipboard (X) +Klocktid: X = Clock: X +Klubb = Club +Klubb att ta bort = Club to remove +Klubb: X = Club: X +KlubbId = Club Id +Klubbar = Clubs +Klubbar (IOF, xml) = Clubs (IOF, xml) +Klubbar som inte svarat = Clubs that did not answer +Klubbdatabasen = Club Database +Klubblös = No club +Klubbresultat = Club Results +Klubbresultatlista = Club Results +Klubbresultatlista - %s = Club Results - %s +Klubbstartlista = Club Start List +Klubbstartlista - %s = Club Start List - %s +Klungstart = Grouped start +Knyt löpare till sträckan = Tie a runner to the leg +Knyt löparna till banor från en pool vid målgång = Tie runners to courses at readout +Kom ihåg listan = Remember the List +Kommentar / version = Comment / Version +Kommunikation = Communication +Kontant = Cash +Kontant betalning = Cash +Konto = Account +Kontroll = Control +Kontroll %s = Control %s +Kontroll X = Control X +Kontroll inför tävlingen = Check competition +Kontrollen används och kan inte tas bort = The control is in use and cannot be removed +Kontrollens ID-nummer = ID of Control +Kontroller = Controls +Kontrollnamn = Control name +Kopia X = Copy X +Kopiera länken till urklipp = Copy link to clip board +Kopiera selektionen till urklipp (X) = Copy selection to clipboard (X) +Koppla ifrån = Disconnect +Koppla ner databas = Disconnect Database +Kopplar ifrån SportIdent på = Disconnecting SportIdent on +Kortast teoretiska startdjup utan krockar är X minuter = Shortest theoretical start depth without clashes is X minutes +Kortnamn = Short name +Kunde inte ansluta till Eventor = Could not connect to Eventor +Kunde inte ladda upp tävlingen (X) = Failed to upload competition (X) +Kvar-i-skogen = Competitors in Forest +Kvinna = Woman +Kvinnor = Women +Källkatalog = Source folder +Kön = Sex +Kör kontroll inför tävlingen = Run Competition Check +Ladda upp öppnad tävling på server = Upload Competition to Server +Lag = Team +Lag %d = Team %d +Lag(flera) = Teams +Laget 'X' saknar klass = The team 'X' has no class +Laget hittades inte = Team not found +Lagnamn = Team name +Lagrade säkerhetskopior = Stored backups +Land = Country +LargeFont = Large text +Latitud = Latitude +Lista = List +Lista av typ 'X' = List of type 'X' +Lista med mellantider = List with split times +Lista med sträcktider = List with split times +Listan kan inte visas = Cannot show list +Listegenskaper = List Properties +Listnamn = List name +Listor = Lists +Listor och sammanställningar = Lists and Summaries +Listpost = List Entry +Listredigerare = List Editor +Listredigerare – X = List Editor – X +Listrubrik = List heading +Listtyp = List type +Listval = List choice +Ljudfiler, baskatalog = Sound files, base folder +Lokalt = Locally +Longitud = Longitude +Lopp %d = Race %d +Lopp %s = Race %s +Lopp X = Race X +Lotta = Draw +Lotta / starttider = Draw / Manage Start Times +Lotta flera klasser = Draw Start Times for Several Classes +Lotta klassen = Draw Class +Lotta klassen X = Draw the class 'X' +Lotta löpare som saknar starttid = Draw runners without start time +Lotta om hela klassen = Redraw class +Lottad = Drawn +Lottad startlista = Drawn start list +Lottar efteranmälda = Drawing late entries +Lottar: X = Drawing start order: X +Lottning = Draw random +Lyssna = Listen +Lägg till = Add +Lägg till alla = Add All +Lägg till en ny rad i tabellen (X) = Add row to table (X) +Lägg till klasser = Add / update classes +Lägg till ny = Add New +Lägg till ny etapp = Add New Stage +Lägg till rad = Add Row +Lägg till stämpling = Add Punch +Lägger till klubbar = Adding clubs +Lägger till löpare = Adding runners +Längd (m) = Length (m) +Länk till resultatlistan = Link to the result list +Länk till startlistan = Link to the start list +Läs brickor = Read cards +Läser klubbar = Reading clubs +Läser löpare = Reading runners +Långt namn = Long name +Låt klassen ha mer än en bana eller sträcka = Let the class have more than one leg or course. +Löpande information om viktiga händelser i tävlingen = Get notifications for events in the competition +Löparbricka %d = Card %d +Löpardatabasen = Runner Database +Löpare = Runner +Löpare saknar klass eller bana = Runner without class or course +Löpare som förekommer i mer än ett lag = Runners existing in more than one team +Löpare utan SI-bricka: %d = Runner without card: %d +Löpare utan bana: %d = Runners without course: %d +Löpare utan klass: %d = Runners without class: %d +Löpare utan klubb: %d = Runners without club: %d +Löpare utan starttid: %d = Runners without start time: %d +Löpare, Ej Start, med registrering (kvar-i-skogen!?) = Runners, Status DNS, with Registration (In Forest!?) +Löpare, Status Okänd, med registrering (kvar-i-skogen) = Runners, Status unknown, with registration (in forest) +Löpare, Status Okänd, som saknar registrering = Runners, Status Unknown, missing registration +Löpare: = Competitors: +Löpare: X, kontroll: Y, kl Z = Competitor: X, control: Y, time: Z +Löparen hittades inte = Runner not found +Löptid = Running time +Lösenord = Password +Man = Man +Manuell lottning = Draw Manually +Manuella avgifter = Manual fees +Mata in första nummerlappsnummer, eller blankt för att ta bort nummerlappar = Input first bib number, or leave blank to remove bibs +Mata in radiotider manuellt = Enter radio times by hand +Max antal gemensamma kontroller = Max number common controls +Max parallellt startande = Max. number parallel start +Max. vakanser (per klass) = Max. vacancy (per class) +Maximal tid efter ledaren för att delta i jaktstart = Maximal time after leader to participate in pursuit. +Maxtid = OMT +Maxtid efter = Maximum time after +MeOS = MeOS +MeOS lokala datakatalog är = MeOS local data folder is +MeOS – Resultatkiosk = MeOS – Result Kiosk +Med stafettklasser = With relay +Med sträcktidsanalys = With split analysis +MediumFont = Medium text +MediumPlus = Somewhat larger text +Medlöpare = Co-runner +Mellantider visas för namngivna kontroller = Intermediate times are shown for named controls +Metod = Method +Min. vakanser (per klass) = Min. vacancies (per class) +Minitid = Min. time +Minst MySQL X krävs. Du använder version Y = MeOS need MySQL X or later. You are using version Y +Minsta intabbning = Least indentation +Minsta intervall i klass = Smallest interval in class +Minsta startintervall = Smallest start interval +Minsta sträcktid = Shortest leg time +Minutstartlista = Minute Start List +Motion = Exercise +Multipel = Multiple +MySQL Server / IP-adress = MySQL Server / IP-address +Män = Men +Mål = Finish +Målstämpling saknas = Missing finish punch +Måltid = Finish time +Måltid saknas = Finish time missing +Måltid: X = Finish time: X +Namn = Name +Nationalitet = Nationality +Nollställ avgifter = Reset Fees +Nollställ databaser = Clear databases +Nollställde avgift för X deltagare = Cleared fee for X competitor(s) +Nolltid = Zero time +None = None +Normal = Normal +NormalFont = Normal text +Normalavgift = Normal fee +Not implemented = Not implemented +Nr = Number +Nummerlapp = Bib +Nummerlappar = Bibs +Nummerlappar i X = Bibs for X +Nuvarande innehavare: X = Current owner: X +Ny bana = New Course +Ny deltagare = New Competitor +Ny klass = New Class +Ny klubb = New Club +Ny kontroll = New Control +Ny lista = New List +Ny tävling = New Competition +Nyckel för Eventor = Eventor Key +Nytt fönster = New Window +Nytt lag = New Team +Nästa = Next +Nästa etapp = Next stage +Nästa försök = Next try +OE Semikolonseparerad (csv) = OE Semicolon separated (csv) +OK = OK +Ogiltig banfil. Kontroll förväntad på position X, men hittade 'Y' = Invalid course file. Expected a control number at position X, but found 'Y' +Ogiltig föregående/efterföljande etapp = Invalid previous/next stage +Ogiltig första starttid. Måste vara efter nolltid = Invalid first start time. Must be after zero time +Ogiltig omstartstid = Invalid restart time +Ogiltig repdragningstid = Invalid rope time +Ogiltig starttid i 'X' på sträcka Y = Invalid start time in 'X' on leg Y +Ogiltig starttid: X = Invalid start time: X +Ogiltig tid = Invalid time +Ogiltigt bricknummer X = Invalid card number X +Ogiltigt filformat = Invalid file format. +Okänd bricka = Unknown card +Okänd funktion = Unknown mode +Okänd klass = Unknown class +Okänd klubb med id X = Unknown club with id X +Om MeOS = About MeOS +Om MeOS – ett Mycket Enkelt OrienteringsSystem = About MeOS – a Much Easier Orienteering System +Omstart = Restart +Omstart i stafettklasser = Relay Restart +Omstartstid = Restart time +Omvänd jaktstart = Reversed pursuit +Oparad = Unpaired +Operationen misslyckades = Operation unsuccessful +Operationen stöds ej = Unsupported operation +Optimerar startfördelning = Optimizing start time distribution +Ordinarie anmälningsdatum = Last entry date +Ordinarie avgift = Normal fee +Organisation = Organization +Oväntad kontroll 'X' i bana Y = Unexpected control 'X' in course Y +Packar upp löpardatabas = Expanding runner database +Par- eller singelklass = Patrol or single class +Para ihop = Pair +Para ihop bricka X med en deltagare = Pair card X with a competitor +Parallell = Parallel +PatrolClubNameNames = Competitor's (or patrol's) club(s) +PatrolNameNames = Competitor's (or patrol's) name(s) +Patrull = Patrol +Patrull, 1 SI-pinne = Patrol, One card +Patrull, 2 SI-pinnar = Patrol, Two cards +Personer = Persons +Plac. = Place +Placering in = Place in +Plats = Place +Port = Port +Port för TCP = Port for TCP +Postadress = Postal address +Postkod = ZIP +Poäng = Points +Poäng in = Points in +Poängavdrag (per minut) = Point reduction (per minute) +Poängavdrag per påbörjad minut = Point reduction for each started minute +Poänggräns = Point limit +Prel. bomtid = Prel. time lost +Prel. placering = Prel. place +Prioritering = Prioritization +Prisutdelningslista = Prize Ceremony List +Programinställningar = Program Settings +Prolog + jaktstart = Prologue + pursuit +Publicera resultat = Publish Results +Publicera resultat och sträcktider på Eventor och WinSplits online = Publish results and split times on Eventor and WinSplits online +Publicera startlista = Publish Start List +Publicera startlistan på Eventor = Publish start list on Eventor +Publicerar resultat = Publishing results +Publicerar startlistan = Publishing the start list +PunchNamedTime = Named split time +PunchTime = Punch time +Punches = Punches +Radera = Delete +Radera listan från aktuell tävling = Delete list from this competition +Radera starttider = Erase Start Times +Radera tävlingen = Remove Competition +Radera vakanser = Delete Vacancies +Radiotider, kontroll = Radio times, control +Ranking = Ranking +Ranking (IOF, xml) = Ranking (IOF, xml) +Rapport inför = Report for +Rapporter = Reports +Rapportläge = Report Mode +Red. avg. efteranm = Red. late fee +Red. avgift = Reduced fee +Redigera deltagaren = Edit competitor +Redigera lista = Edit List +Redigera listpost = Edit list entry +Reducerad avg = Reduced fee +Reduktionsmetod = Reduction method +Region = Region +Relativ skalfaktor för typsnittets storlek i procent = Relative scale factor for the font face (percent) +Rep = Rope +Reparera vald tävling = Repair Selected Competition +Reparerar tävlingsdatabasen = Repairing competition database +Repdragningstid = Rope time +Repdragningstiden måste ligga före omstartstiden = The rope time must be before the restart time +Reserverade = Reserved +Resultat = Result +Resultat && sträcktider = Results && Splits +Resultat (STOR) = Results (LARGE) +Resultat - %s = Results - %s +Resultat - X = Results - X +Resultat banvis per klass = Result course-wise per class +Resultat efter klass och bana - X = Result by class and course - X +Resultat efter sträcka X = Results After Leg X +Resultat efter sträckan = Results after leg +Resultat för ett visst lopp = Results for a given race +Resultat lopp X - Y = Result race X - Y +Resultat per bana = Result by course +Resultat per bana - X = Result by course - X +Resultat, generell = Results, general +Resultat, individuell = Results, individual +Resultat, patrull = Results, patrol +Resultatkiosk = Result Kiosk +Resultatlista - %s = Results - %s +Resultatlista – inställningar = Results – settings +Resultatlistor = Results +Resultatutskrift = Print Results +Resultatutskrift / export = Print / Export Results +Rogaining = Rogaining +Rogaining, individuell = Rogaining, individual +Rogaining-poäng = Rogaining points +RogainingPunch = Punch, rogaining +Rubrik = Heading +Rulla upp och ner automatiskt = Scroll up and down automatically +Runner = Competitor +RunnerBib = Competitor's bib +RunnerCard = Card number +RunnerClassCoursePlace = Position on course within class +RunnerClassCourseTimeAfter = Time after on course within class +RunnerClub = Competitor's club +RunnerCompleteName = Complete name +RunnerCourse = Competitor's course +RunnerFamilyName = Last name +RunnerFinish = Competitor's finish time +RunnerGivenName = First name +RunnerLegNumberAlpha = Competitor's exact leg number +RunnerLegNumber = Competitor's grouped leg number +RunnerName = Competitor's name +RunnerPlace = Competitor's place +RunnerPlaceDiff = Competitor's place difference +RunnerRank = Ranking +RunnerRogainingPoint = Rogaining points +RunnerStart = Competitor's start time +RunnerStartNo = Competitor's start number +RunnerTempTimeAfter = Competitor's time after at selected control +RunnerTempTimeStatus = Competitor's time / status at selected control +RunnerTime = Competitor's time +RunnerTimeAfter = Competitor's time after +RunnerTimeAfterDiff = Competitor's time after difference +RunnerTimeLost = Competitor's lost time +RunnerTimePlaceFixed = Time when Competitor's place is set +RunnerTimeStatus = Competitor's time / status +RunnerTotalPlace = Competitor's total place +RunnerTotalTime = Competitor's total time +RunnerTotalTimeAfter = Competitor's total time after +RunnerTotalTimeStatus = Competitor's total time / status +RunnerUMMasterPoint = Uppsala möte, master points +SI X inläst. Brickan tillhör Y som saknar klass = SI X was read out. The card belongs to Y, who has no class +SI X inläst. Brickan är inte knuten till någon löpare (i skogen) = SI X was read out. The card is not bound to any runner (in forest) +SI X är redan inläst. Använd interaktiv inläsning om du vill läsa brickan igen = SI X is already read out. Use interactive readout to read it again. +SI X är redan inläst. Ska den läsas in igen? = SI X is already read out. Read it again? +SI på = SI on +SI-dubbletter: %d = SI duplicates: %d +SOFT-avgift = SOFT fee +SOFT-lottning = Swedish draw method +Saknad starttid = Missing Start Time +Sammanställning = Summary +Sammanställning, ekonomi = Summary, economy +Sammanställning, klasser = Summary, classes +Samtliga deltagare tilldelades resultat = All competitors were assigned a result +Seedad lottning = Seeded start groups +Sekundär typ = Secondary type +Selektionens storlek matchar inte urklippets storlek. Klistra in i alla fall? = The size of the selection and of the clipboard does not match. Paste anyway? +Semikolonseparerad (csv) = Semicolon separated (csv) +Sen avgift = Late fee +Sen red. avgift = Late red. fee +Server = Server +Server: [X] Y = Server: [X] Y +Sidbrytning mellan klasser = Page break +Sidbrytning mellan klasser / klubbar = Page break between classes / clubs +Simulera inläsning av stämplar = Simulate readout +Sista betalningsdatum = Payment due +Sista ordinarie anmälningsdatum = Last normal entry date +Sista start (nu tilldelad) = Latest start (assigned now) +Sista start (nu tilldelad): X = Last start (now assigned): X +Sista sträckan = Last leg +Ska X raderas från tävlingen? = Do you want to remove X from the competition? +Skalfaktor = Scale factor +Skapa en ny tävling med data från Eventor = Create a new competition with data from Eventer +Skapa en ny, tom, tävling = Create a new, empty, competition +Skapa fakturor = Create Invoices +Skapa generell lista = Create General List +Skapa listan = Create List +Skapa ny klass = Create new class +Skapad av = Created by +Skapade en bana för klassen %s med %d kontroller från brickdata (SI-%d) = Created a course for the class %s with %d controls in card %d. +Skapade en lokal kopia av tävlingen = Created a local copy of the competition +Skapar ny etapp = Create new stage +Skapar ny tävling = Creating new competition +Skapar saknad klass = Created missing class +Skattad avgift = Taxable fee +Skippar lottning = Skip drawing start order +Skript = Script +Skript att köra efter export = Script to run after export +Skriv endast ut ändade sidor = Only print modified pages +Skriv första bokstaven i klubbens namn och tryck pil-ner för att leta efter klubben = Type the first letters of the club name and press down arrow to find the club. +Skriv första starttid på formen HH:MM:SS = Write the first start time as HH:MM:SS +Skriv ut = Print +Skriv ut alla = Print all +Skriv ut dem utan e-post = Print all missing e-mail +Skriv ut ej accepterade elektroniska = Print all not yet accepted +Skriv ut eller exportera listan automatiskt = Print or export the list automatically +Skriv ut fakturan = Print the invoice +Skriv ut listan = Print the list +Skriv ut nu = Print now +Skriv ut rapporten = Print the report +Skriv ut sträcktider = Print Splits +Skriv ut tabellen = Print the table +Skriv ut tabellen (X) = Print the table (X) +Skriv över existerande bricknummer? = Overwrite existing card number? +Skrivare = Printer +Skrivarinställningar för sträcktider = Printer settings +Skriver sträcktider om = Printing in +Slutresultat = Final Results +Slå ihop = Merge +Slå ihop klass: X = Merge class: X +Slå ihop klass: X (denna klass behålls) = Merge class with X (keep this class) +Slå ihop klasser = Merge Classes +Slå ihop klubb = Merge Club +SmallFont = Small text +SmallItalic = Small, italic text +Snabbinställningar = Quick Settings +SortNameOnly = Name +Sortering = Sorting +Sortering: %s, antal rader: %d = Sorting: %s, number of rows: %d +Spara = Save +Spara anmälningar = Save Entries +Spara den här listan som en favoritlista = Save this list as a favorite list +Spara fil = Save file +Spara för webben = Save web document +Spara i aktuell tävling = Save in This Competition +Spara som = Save as +Spara som fil = Save as File +Spara sträcktider till en fil för automatisk synkronisering med WinSplits = Save splits to file for automatic synchronization with WinSplits +Sparade listval = Stored Lists +Speaker = Speaker +Speakerstöd = Speaker Module +SportIdent = SportIdent +Språk = Language +Stad = City +Stafett = Relay +Stafett (sammanställning) = Relay (Summary) +Stafett - sammanställning = Relay - Summary +Stafett - sträcka = Relay - Leg +Stafett - total = Relay - Total +Stafettklasser = Relay classes +Stafettresultat, delsträckor = Relay results, legs +Stafettresultat, lag = Relay results, team +Stafettresultat, sträcka = Relay results, leg +Stafettresultat, sträcka (STOR) = Relay results, leg (LARGE) +Start = Start +Start nr = Start no. +StartTime = Start time, name +StartTimeForClass = Common start time, class +Starta = Start +Starta automaten = Start the Service +Starta en guide som hjälper dig göra klassinställningar = Start a guide that helps you setup classes +Startade automater = Started services +Startande = Starting +Startar SI på = Starting SI on +Startblock = Start block +Startblock: %d = Start block: %d +Startintervall = Start Interval +Startintervall (min) = Start interval (min) +Startlista = Start List +Startlista %%s - sträcka %d = Start List %%s - Leg %d +Startlista - %s = Start List - %s +Startlista - X = Start List - X +Startlista ett visst lopp = Start list for the race +Startlista lopp X - Y = Start List Race X - Y +Startlista, individuell = Start list, individual +Startlista, patrull = Start list, patrol +Startlista, stafett (lag) = Start list, relay (team) +Startlista, stafett (sträcka) = Start list, relay (leg) +Startlistor = Start lists +Startmetod = Start method +Startnamn = Start name +Startnummer = Start number +Starttid = Start time +Starttid (HH:MM:SS) = Start time (HH:MM:SS) +Starttid: X = Start time: X +Starttiden är upptagen = Start time is not available +Starttyp = Start type +Status = Status +Status OK = Status OK +Status in = Status input +Stoppa automaten = Stop the service +Stor = Large +Str. = Leg +Str. %d = Leg %d +String = Text +Struken = Canceled +Struken med återbetalning = Canceled, fee refunded +Struken utan återbetalning = Canceled, no refund +Strukturerat exportformat = Structured export format +Strukturerat webbdokument (html) = Structured web document (html) +Sträcka = Leg +Sträcka %d = Leg %d +Sträcka X = Leg X +Sträcka att lotta = Leg to draw +Sträckans banor = Courses of the leg +Sträcktider = Split Times +Sträcktider (WinSplits) = Split Times (WinSplits) +Sträcktider / WinSplits = Split Times / WinSplits +Sträcktider/WinSplits = Splits/WinSplits +Sträcktidsfil = File name +Sträcktidsutskrift = Print Splits +Sträcktidsutskrift[check] = Print splits automatically +Sträcktilldelning, stafett = Leg assignment, relay +Sträcktyp = Leg type +Stämpelkod(er) = Punch code(s) +Stämpelkoder = Punching codes +Stämplar om = Punching in +Stämplingar = Punches +Stämplingar saknas: X = Missing punches: X +Stämplingsautomat = Punch machine +Stämplingsintervall (MM:SS) = Punch interval (MM:SS) +Stämplingstest = Punching Test +Stämplingstest [!] = Punch Test [!] +Stäng = Close +Stäng tävlingen = Close Competition +Större = Larger +Störst = Largest +Största gruppen med samma inledning har X platser = Largest group with same course opening has X starters +Största intervall i klass = Greatest interval in class +SubCounter = Secondary counter +SubSubCounter = Tertiary counter +Summera = Sum +Synkronisera med Eventor = Synchronize with Eventor +Säkerhetskopiera = Backup / Save as +Sätt okända löpare utan registrering till = Set Status for Runners without Registration +Sätt som oparad = Unpair +Sätter reptid (X) och omstartstid (Y) för = Applying rope time (X) and restart time (Y) for +Sök = Search +Sök (X) = Search (X) +Sök deltagare = Find Competitor +Sök och starta automatiskt = Automatic Search and Start +Sök på namn, bricka eller startnummer = Search for a name, card or start number +Söker efter SI-enheter = Searching for SportIdent units +TCP: Port %d, Nolltid: %s = TCP: Port %d, Zero time: %s +TRASIG( = Bad( +Ta bort = Remove +Ta bort / slå ihop = Remove / Merge +Ta bort listposten = Remove list entry +Ta bort markerad = Remove Selected +Ta bort stämpling = Remove Punch +Ta bort valda rader från tabellen (X) = Remove selected rows from the table (X) +Tabell = Table +Tabelläge = Table Mode +Team = Team +TeamBib = Team's bib +TeamClub = Team's club +TeamLegTimeAfter = Team's time after on leg +TeamLegTimeStatus = Team's time / status on leg +TeamName = Team name +TeamPlace = Team's place +TeamRogainingPoint = Team's rogaining points +TeamRunner = Name of team member +TeamRunnerCard = Card number of team member +TeamStart = Team's start time +TeamStartNo = Team's start number +TeamStatus = Team status +TeamTime = Team's time +TeamTimeAfter = Team's time after +TeamTimeStatus = Team's time / status +Telefon = Phone +Test = Test +Test av stämplingsinläsningar = Test punching +Testa rösten = Test the voice +Text = Text +Text: X = Text: X +Textfiler = Text files +Textstorlek = Text size +Tid = Time +Tid efter: X = Time after: X +Tid efter: X; har tagit in Y = Time after: X; gained Y +Tid efter: X; har tappat Y = Time after: X; lost Y +Tid in = Time in +Tid: X, nuvarande placering Y/Z = Time: X, current place Y/Z +Tidsavdrag: X poäng = Point reduction: X points +Tidsgräns = Time limit +Tidsinmatning = Manual Times +Tidsintervall (MM:SS) = Time interval (MM:SS) +Tidsjustering = Time adjustment +Tidslinje – X = Time line – X +Tidsskalning = Time scaling +Till huvudsidan = To Main Page +Till kontroll = To control +Tilldela = Assign +Tilldela avgifter = Assign Fees +Tilldela endast avgift till deltagare utan avgift = Assign fee only to competitors without fee +Tilldela hyrbrickor = Assign cards +Tilldela nummerlappar = Assign bibs +Tilldelning av hyrbrickor = Assign Cards +Tillgängliga automater = Available services +Tillsatte vakans = Filled vacancy +Tillsätt vakans = Fill Vacancy +Tillämpa parstart = Start pairwise +Tillåt decimaler = Allow decimals +Tillåt direktanmälan = Allow quick entry +Tillåt valutauttryck med decimaler = Allow currency expressions with decimals +Topplista, N bästa = Top list, N best +Total = Total +Total tävlingsavgift = Total competition fee +TotalCounter = Primary counter +Totalresultat = Total result +Totalresultat - X = Total Results - X +Totalt = Total +Totalt faktureras = To invoice +Totalt kontant = Total cash +Totaltid = Total time +Trasig = Bad +Träning = Training +Tvåmannastafett = Two-runner relay +Typ = Type +Typ av delning = Split type +Typ av export = Type of export +Typ av lista = Type of list +Typsnitt = Typeface +Tävling = Competition +Tävling från Eventor = Competition from Eventor +Tävlingen innehåller inga resultat = There are no results yet +Tävlingen måste ha ett namn = The competition must be named +Tävlingens namn: X = The competition's name: X +Tävlingsdata har sparats = Competition data was saved +Tävlingsinställningar = Competition Settings +Tävlingsinställningar (IOF, xml) = Competition settings (IOF, xml) +Tävlingsnamn = Competition name +Tävlingsrapport = Competition Report +Tävlingsregler = Competition rules +Tävlingsstatistik = Competition Statistics +Underlag för tävlingsavgift = Data for competition fee +Underlista = Sub list +Underrubrik = Subheading +Undre datumgräns = Lower date limit +Undre gräns (år) = Lower limit (years) +Undre ålder = Lower Age +Ungdom = Youth +Ungdomsavgift = Youth fee +Ungdomsklasser = Youth classes +Uppdatera = Update +Uppdatera alla klubbar = Update All Clubs +Uppdatera alla värden i tabellen = Update table +Uppdatera alla värden i tabellen (X) = Refresh all values of the table (X) +Uppdatera från Eventor = Update from Eventor +Uppdatera fördelning = Update Distribution +Uppdatera fördelningen av starttider med hänsyn till manuella ändringar ovan = Update the distribution of start times taking manual changes into account +Uppdatera klubbar && löpare = Update Clubs && Runners +Uppdatera klubbarnas och löparnas uppgifter med data från löpardatabasen/distriktsregistret = Update clubs and runners using the runner database. +Uppdatera klubbarnas uppgifter med data från löpardatabasen/distriktsregistret = Update clubs using the runner database. +Uppdatera klubbens uppgifter med data från löpardatabasen/distriktsregistret = Update the club using the runner database. +Uppdatera löpardatabasen = Update Runner Database +Urval = Filter +Urval %c%s = Filter %c%s +Utan inställningar = No settings +Utan tidtagning = No timing +Utbyt tävlingsdata med Eventor = Exchange competition data with Eventor +Utför lottning = Perform the Drawing +Utfört = Done +Utg. = DNF +Utskrift / export = Print / export +Utskriftsintervall (MM:SS) = Printing interval (MM:SS) +Utökat protokoll = Extended protocol +VALFRI( = OneOf( +Vak. ranking = Vacancy ranking +Vakanser = Vacancies +Vakanser / klassbyte = Late Changes +Vakanser och efteranmälda = Vacancies and Late Entries +Vakanser stöds ej i stafett = Vacancies not supported in relays +Vakant = Vacant +Val av export = Choose export +Valbar = Optional +Vald bricka = Chosen card +Valuta = Currency +Valutakod = Currency code +Valutasymbol = Currency symbol +Valutasymbol före = Currency symbol in front +Varning: Deltagaren 'X' finns inte = Warning: The competitor 'X' does not exist +Varning: Laget 'X' finns inte = Warning: The team 'X' does not exist +Varning: Banan 'X' finns inte = Warning: The course 'X' does not exist +Varning: Banan 'X' förekommer flera gånger = Warning: The course 'X' is specified more than once +Varning: Ingen organisatör/avsändare av fakturan angiven (Se tävlingsinställningar) = Warning: No organizer given (See Competition Settings) +Varning: Inget kontonummer angivet (Se tävlingsinställningar) = Warning: No account given (See Competition Settings) +Varning: Inget sista betalningsdatum angivet (Se tävlingsinställningar) = Warning: payment due not given (See Competition Settings) +Varning: deltagare med blankt namn påträffad. MeOS kräver att alla deltagare har ett namn, och tilldelar namnet 'N.N.' = Warning: A competitor without name was found. MeOS requires a name, and has assigned the name 'N.N.' +Varning: lag utan namn påträffat. MeOS kräver att alla lag har ett namn, och tilldelar namnet 'N.N.' = Warning: A team without name was found. MeOS requires a name and has assigned the name 'N.N.' +Verkställ = Confirm +Version X = Version X +Vi stöder MeOS = We support MeOS +Viktiga händelser = Important events +Vill du flytta löpare från X till Y och ta bort Z? = Do you want to move runners from X to Y and remove Z? +Vill du klistra in X nya rader i tabellen? = Do you want to paste X new rows into the table? +Vill du lägga till banan 'X' (Y)? = Do you wish to add the course 'X' (Y)? +Vill du lägga till deltagaren 'X'? = Do you wish to add the competitor 'X'? +Vill du lägga till klassen 'X'? = Do you wish to add the class 'X'? +Vill du lägga till laget 'X'? = Do you wish to add the team 'X'? +Vill du radera X rader från tabellen? = Do you want to delete X rows from the table? +Vill du radera alla vakanser från tävlingen? = Do you want to remove all vacancies from the competition? +Vill du skapa en ny klass? = Do you want to create a new class? +Vill du spara ändringar? = Do you want to save changes? +Vill du verkligen radera alla starttider i X? = Do you really want to clear start times in X? +Vill du verkligen radera starttider i X klasser? = Do you really want to erase start times from X classes? +Vill du verkligen radera tävlingen? = Do you wish to remove the competition? +Vill du verkligen stänga MeOS? = Do you wish to close MeOS? +Vill du verkligen ta bort laget? = Do you with to remove the team? +Vill du verkligen ta bort löparen? = Do you wish to remove the runner? +Visa = Show +Visa alla = Show All +Visa avancerade funktioner = Show advanced settings +Visa en tabell över alla stämplingar = Show a table with punches +Visa klubbdatabasen = Show club database +Visa listan i fullskärm = Show the list in full screen +Visa löpardatabasen = Show runner database +Visa mellantider = Show split times +Visa och hantera löpardatabasen = Show and manage runner database +Visa senast inlästa deltagare = Show last read out competitor +Visa startlistan = Show start list +Visa tillgängliga säkerhetskopior = Show available backups +Visa valda deltagare = Show Selected Competitors +Visar de X bästa = Showing top X +Visualisera startfältet = Visualize Start Field +Vuxen = Adult +Vuxenklasser = Adult classes +Vuxna = Adults +Välj Spara för att lagra brickorna. Interaktiv inläsning är INTE aktiverad = Click to store the cards. Interactive readout is not activated +Välj Spara för att lagra brickorna. Interaktiv inläsning är aktiverad = Click to store the cards. Interactive readout is activated +Välj alla = Select All +Välj alla klasser = Select all classes +Välj allt = Select All +Välj automatiskt = Automatic Selection +Välj den etapp som föregår denna tävling = Select the stage preceding this stage +Välj den etapp som kommer efter denna tävling = Select the stage following this stage +Välj en vakant plats nedan = Choose a vacant position below +Välj ingen = Select None +Välj inget = Select None +Välj klass = Select class +Välj klass och starttid nedan = Choose class and start time below +Välj klasser = Choose classes +Välj klasser där alla löpare saknar starttid = Select classes where no runner has a start time +Välj klasser där någon löpare saknar starttid = Select classes where some runner misses start time +Välj kolumner = Choose Columns +Välj kolumner att visa = Choose columns to show +Välj kolumner för tabellen X = Choose columns for the table X +Välj lista = Select list +Välj lopp = Select race +Välj löpare = Choose runner +Välj löpare att prioritera bevakning för = Select runners to prioritize +Välj löpare för sträcka X = Set runner for leg X +Välj skrivare = Choose printer +Välj tävling = Choose competition +Välj vilka klasser och kontroller du vill bevaka = Select Classes and Controls you want to watch +Välj vilka klasser och kontroller som bevakas = Select which classes and controls to watch +Välj vilka kolumner du vill visa = Choose columns to show +Välj vy = Choose view +Välkommen till MeOS = Welcome to MeOS +Vänligen betala senast = Please pay at latest +Vänligen återlämna hyrbrickan = Please return your borrowed card +Växling = Changeover +Webb = Web Document +Webbdokument = Web document +Webbdokument (html) = Web document (html) +Webben (html) = The web (html) +X (Saknar e-post) = X (Has no e-mail) +X (Y deltagare, grupp Z, W) = X (Y competitors, group Z, W) +X har startat = X started +X kontroller = X controls +X meter = X meter +X poäng fattas = X points missing +X rader kunde inte raderas = X row(s) could not be deleted +X senaste = X latest +X: Y. Tryck för att spara = X: Y. Press to save +Zooma in (Ctrl + '+') = Zoom in (Ctrl + '+') +Zooma ut (Ctrl + '-') = Zoom out (Ctrl + '-') +[Bevaka] = [Watch] +[Flytta ner] = [Move down] +[Bort] = [Remove] +[Klassens bana] = [From Class] +[Uppdaterad anmälan] = [Updated entry] +[VARNING] ingen/okänd = [VARNING] none/unknown +[Återställ] = [Reset] +andra = second +ask:addpunches = No card has been read out for this runner. Would you like to add punches manually? +ask:changedclassfee = The entry fee was modified in some classes. Do you want to apply the new fees to existing runners in these classes?\n\nWarning: Manually assigned fees will be overwritten. +ask:changedcmpfee = The entry fees are modified. Do you want to apply the new fees on existing runners and classes?\n\nWarning: Manually assigned fees will be overwritten. +ask:firstasstart = There exist runners with result for this course. If you use the first control as start, the start times will be overwritten.\n\nDo you wish to continue? +ask:kiosk = When you start a result kiosk, you put MeOS in a mode where it is only possible to show result reports. No other operations are permitted until the program is restarted. If there is an active SI device connected to the computer, MeOS will automatically show results for the last read card.\n\nYou should consider protecting the database with a password, if you publicly expose a result kiosk.\n\nDo you wish to start a result kiosk? +ask:missingcourse = Some classes (X) have no course.\n\nMeOS use the courses when drawing to avoid that runners with the same first controls start at the same time.\n\nDo you wish to proceed anyway? +ask:overwrite_server = The competition is already on server. Do you want to overwrite the competition on the server? +ask:overwriteconfirm = You have chosen to overwrite the competition. Make sure no one else is connected.\n\nDo you wish to proceed? +ask:repair = Repair the database only if you experience problems.\n\nImportant:\n- Make sure no one else is connected to the database.\n- If the server crashes or goes down while repairing, you must restart it and retry the repair before doing anything else. If you make any other operation with the database all data will be lost.\n\nDo you wish to try a repair operation now? +backup = backup +c/o = c/o +check (X) = a check (X) +ej aktiv = not active +elfte = eleventh +elva = eleventh +ett Mycket Enkelt OrienteringsSystem = a Much Easier Orienteering System +eventor:help = If you use MeOS for orienteering in Sweden, we recommend that you use MeOS's Eventor connection. +eventor:question = X\n\nDo you wish to use the Eventor connection? +femma = fifth +femte = fifth +fjärde = fourth +fritt att använda och du är välkommen att distribuera det under vissa villkor = free to use and you are welcome to redistribute it under certain conditions +fyra = fourth +går i mål på X plats med tiden Y = finishes as X with time Y +går i mål på X plats, efter Y, på tiden Z = finishes as X, behind Y, with time Z +går upp i delad ledning med tiden X = takes a shared lead with the time X +handskakning = hand shaking +har startat = has started +help:10000 = A service in MeOS is a small program that automatically does something every now and then or when the competition data is changed. +help:12138 = Select a class to merge with the this class. If start times are drawn you might want to draw again, since the runners keep their start times. +help:12290 = The competition is created by another version of MeOS and cannot be opened from a server. You can however import the competition from file. +help:12352 = This operation removes the club you have chosen (%s, id=%d) and moves all runners of that club to the new club you choose below. The operation cannot be undone. +help:12662 = Add controls by adding a sequence of control numbers (control id numbers). You need not specify the finish. Example: 31, 50, 36, 50, 37, 100. +help:14070 = The TCP port is used for receiving punches over TCP from other systems. Specify the port used. The zero time of the protocol is 00:00:00. +help:14343 = A list with read card is shown. To tie a runner to another card, double click the card or runner you wish to move. +help:146122 = You can extend MeOS knowledge of runners, clubs and classes by searching databases in MeOS format or the IOF (xml) format.\n\nDo you wish to proceed? +help:14692 = Input control number, runner (start number or card number) and clock time (HH:MM:SS). You may leave the time field blank; then the computer clock is used. Press to save. +help:15491 = You can export settings, club and runner databases to a specified folder. This settings and databases can be imported to another computer. +help:21576 = If you make a mistake, click the runners name to change the entry. Use the page runners to remove entries. To see a class in the list below, it must be marked for quick entry on the page classes. +help:25041 = Here you define your courses. A course is then tied to one or more classes (or runners). It is also possible to import courses from OCAD, Condes, or other course software. If you specify the number of maps, MeOS will keep track of available maps in the quick entry form. +help:26963 = A course pool is used for defining a pool of courses for a leg. The course is tied to the runner on finish by control matching. Define courses in the pool by adding them under Several Courses / Relay. An [S] after the class means that all its competitors has a start time. +help:29191 = You can install settings, clubs and runner database from a specified source folder. Your local settings are overwritten. MeOS might be restarted after the installation.\n\nThe button takes you to a page where instead you can export your current settings. +help:29758 = Here you manage clubs and print invoices. You can assign competition fees based on class type and entry date. Duplicated (misspelled) clubs can be merged with the corresponding correct club. You can also update club addresses from the registry. +help:30750 = You can create many different sorts of lists and reports. These can be shown on screen, printed, or saved in web format. The list is automatically updated when competition data is changed. Automatic result printing is done on the page Services. To export competition data, for example split times, go to the page Competition. +help:31661 = A restart is defined by a rope time and a restart time. At the rope time, the changeover is closed and no competitors are let out into the forest. The remaining runners start at the rope time. It is possible to specify different times for individual legs, but by using this function you can quickly handle whole classes. +help:33940 = Import entries in free text format. Specify name, club, class, and card number (possibly also start time), preferably separated by comma, one person (team) per row. It is also possible to specify many competitors in the same club / class by partly leaving out these fields. It is also possible to import data formatted in other ways. +help:41072 = Select a punch from the list to change or remove it. You can add missing punches from the course template. If the finish time is missing, the runner gets status . If a punch is missing, the status is . It is not possible to assign a status incompatible with the punches. If there is a finish punch, you must modify it to set a manual finish time. The same principle applies for the start punch. +help:41641 = Enter a first start time and start interval. Draw random gives an unconditionally random start order. Swedish draw method uses special rules to distribute runners from the same club. Clumped start means the whole class starts in small groups during the specified interval (extended mass start). In the field leg, you can specify which leg is to be drawn, if the class has several. +help:425188 = You can handle runners that didn't start automatically by reading out SI stations (clear/check/start/controls) in SIConfig. Save the readout as a semi colon separated text file and import this file into MeOS. Runners in this import get a registration. Then you can give DNS status to all runners without registration. If you later import more runners, you can reset the status (from DNS to Unknown) on the runners now imported. +help:471101 = Activate the SI unit by selecting its COM-port, or by searching for installed SI units. Press Information to get status for the selected port.\n\nInteractive readout lets you directly handle problems, such as wrong card number. Do not use this option when runners with problems are handled separately.\n\nThe runner database is used if you want to automatically add new runners. The punches are used to find (guess) the right class. +help:50431 = You are now connected to a server. To open a competition on the server, select it in the list and click open. Do add a competition to the server, open the competition locally and select upload. When you have opened a competition on the server, you will see all other connected MeOS clients. +help:52726 = Connect to a server below.\n\nInstallation\nDownload and install MySQL 5 (Community Edition) from www.mysql.com. You can use default settings. It is only necessary to install MySQL on the computer acting server. When MySQL is installed, start MySQL Command Line Client and create a user account for MeOS. You write like this:\n\n> CREATE USER meos;\nGRANT ALL ON *.* TO meos;\n\nYou have now created a user meos with no password. Enter the name of the server below (you may have to configure firewalls to let through the traffic).\n\nAs an alternative you can use the built-in root account of MySQL. User name is 'root' and password is the one you provided when installing MySQL. +help:5422 = Found no SI unit. Are they connected and started? +help:59395 = In this form, you can quickly make basic settings for many classes in one step.\n\nStart is the name of the start as it is printed in the start list.\n\nBlock is a number between 0 and 100 which can provide an even finer distribution of runners. Classes in the same block will be printed on the same minute start list. \n\nIndex is a sorting key. The classes are sorted by this key in all lists.\n\nThe course can be specified for classes which have exactly one course; if there are several possible courses you need to use the standard class form.\n\nQuick entry determines if the class supports quick entry mode, i.e., is a possible choice in the quick entry class list. +help:59395_more = The class fees, which shows if you have activated Economy features, are used for new entries. If you change a fee, MeOS will ask if you wish to apply the change to existing competitors.\n\nFor bibs you have the options None, Consecutive and Manual. You can also type the first bib in the class, for example A100, or 50. Consecutive means that the last number of the preceeding class is used to define the first number in this class. Reserved bib numbers gives a gap (of the specified width) in the numbering between classes.\n\nMeOS updates bibs when you draw start times or change the settings. Manual means that MeOS will never automatically update bibs.\n\nFor classes with teams the setting Team member controls the relation between the team number and the bibs. It can be the same, increasing (100, 101, 102), leg dependent (100-1, 100-2, etc.) or completely independent. +help:7618 = The number of runners in a team is specified on the page Classes. +help:7620 = Interval (seconds). Leave the field blank to update when the competition is changed. +help:89064 = For every control, you specify one or more code number (SI codes). In a course, you refer to the control by its ID number. Usually, you do not need to add controls manually, since MeOS automatically adds all controls needed.\n\nMore than one SI code is useful for replacing malfunctioning controls or to create simple forks. For an ordinary control, it is required that the runner visit on of the specified controls. If the control status is , all specified controls must be visited (in any order). If the status is , the control is ignored.\n\nIf you specify a control name, it is possible to print result lists with intermediate times at named controls.\n\nTime adjustment can be used if it turns out that a control has wrong time. Time format is +/-MM:SS or +/-HH:MM:SS.\n\nShortest leg time defines the shortest possible time on that leg. No runner will get a shorter time to this control, no matter how fast he/she is. This can be used, for example, if a dangerous road must be crossed.\n\nStatus means that the time to the control is ignored; the total time will be the same no matter what the actual time to this control is. +help:9373 = Give one or more control numbers (SI codes) used by this control.\nExample: 31, 32, 33. +help:9615 = Received no answer. Do you want to open the port in passive mode; should MeOS listen to incoming punches? +help:assignfee = MeOS will take care of entry fees for you automatically in many cases. The competitors are assigned fees based on age and entry date (you define the limits under Competition Settings). Every class defines its fees. You provide default values for different class types under Competition Settings, but you can also manually change class settings using Quick Settings for the class.\n\nThis page lets you manually use different ages and time limits for different fees. On the page competitor, you can manually adjust the fee for individual competitors, if needed. +help:baudrate = Transmission speed/Baudrate: use 4800 or 38400. +help:computer_voice = An incoming punch is matched against a start number and plays the file , where N is the start number. The files are located in the folder below. If the runner/team belongs has nationality NAT, MeOS first tries to play the file , which should contain the number in an appropriate language version. +help:dbage = The runner database is older than two months. Do you wish to download a new database from Eventor? +help:duplicate = Make a local copy of this competition. +help:eventorkey = Type your club's Eventor (Sweden) API key. You get the key from your club's Eventor administrator. +help:fullscreen = You can adjust the scroll speed using Ctrl+M (increase) and Ctrl+N (decrease) on your keyboard. To escape full screen mode, press Esc. +help:import_entry_data = You can import runners, classes, clubs and entries from a number of different text and XML formats. It is not necessary to provide all files below. For example, an OE-CSV file with entries contains clubs and classes, so in that case these fields should be left empty.\n\nIf the same runner is imported several times you will not get several copies of the runner. Instead the entry is updated. This means that it is harmless to re-import or import an extended file with entries. +help:importcourse = You can import courses and classes from (for example) an OCAD or Condes export. +help:ocad13091 = If you have access to the courses (for example, from OCAD or Condes) you can provide the name of the course file here. Otherwise, you may add courses later. +help:relaysetup = Use the guide below to choose between a number of predefined competition forms. After you apply the settings, it is possible to manually adapt the settings for each leg and setup courses.\n\nSome explanations:\n- Relay is used for different kinds of relays.\n- Two-runner relay means that two runners make a team and take turns running.\n- Co-runner relay is sometimes used in youth classes and allow for more than one runner on some legs. (the first runner changes over).\n- A patrol race can be run with one or two punching cards.\n- Prologue + pursuit is individual, but with two races.\n- Course pool means there are several course variants, but that it is not decided in advance who runs which course; it is decided automatically when the runner finishes. +help:restore_backup = Choose a backup to restore by clicking the time when the backup was created. +help:runnerdatabase = By importing a runner and club database, MeOS will automatically recognize unknown runners (by card number), and you will get addresses and phone numbers to clubs. +help:save = MeOS automatically saves all settings when needed. +help:speaker_setup = Choose which classes and courses you want to watch. +help:speakerprio = Check those runners/teams you wish to watch from start, and as long as the runner/team is doing well. Put two checks to watch even if the result is not so good. No check means monitoring only if the runner/team is doing well (not from start). +help:splitexport = Decide if you want to export total results, or individual results for each race. If you choose to export all races, numbered files will be created. +help:startmethod = MeOS will automatically apply the chosen start method. No matter what you choose here, you can always change start method or redraw lists later. +help:winsplits_auto = This service saves split times to an IOF (xml) file at regular intervals. If you open this file in WinSplits, the splits there will be updated live. +help:zero_time = Set zero time to one hour before first planned start. +help:long_times = Competition date is the date when all classes start. Zero time is at midnight. +help_autodraw = Provide a first (ordinary) start time, a least start interval (within a class) and the fraction of vacancies. You can also choose the method use when drawing and if late entries are to start in front of or after the ordinary entries. The first start time must be after the zero time of the competition.\n\nIf you click , MeOS will inspect all classes. If the class is not drawn, it will be, if there are late entries without start time in a class, these will be drawn.\n\nMeOS ensures that runners with similar courses do not start simultaneously, and space will be reserved to allow for late entries under the same conditions.\n\nIf you instead click you will be able to control exactly which classes are drawn and with which parameters. +help_draw = You draw the start list in a two-step process. First you choose which classes to draw and you make some basic settings. When you press MeOS will use your settings to distribute start time slots between classes. MeOS ensures that classes with similar courses do not start at the same time, taking already drawn classes into account. A goal is an even distribution of starters.\n\nThe calculated distribution is presented in a table, where you can make your own changes, or let MeOS update its distribution, taking your changes into account. When you are happy with the distribution, you let MeOS draw the selected classes.\n\nThe basic settings you have to make is to provide a first allowed time to start and a smallest allowed interval. The maximal number of parallel starts determines how many runners can start at the same time. An increased value gives a shorter start depth.\n\nThe fraction of vacant positions controls the number of vacant positions. If you need no vacancies, type 0%. The expected number of late entries reserves space for these in the start list with a guarantee that no runner starting on the same time will have the same course. +info:multieventnetwork = To handle more than one stage you must work locally. Save a copy of the competition, open it locally and transfer results to the next stage. Then upload the next stage to the server. +info:readout_action = X: Card no. Y was read out.\nManual actions needed. +info:readout_queue = X: Card no. Y was read out.\nThe card has been queued. +inforestwarning = No runners seems to be in the forest. Since the data behind this conclusion might be incorrect, you should verify that no runner is left in the forest by other means. +kartor = maps +klar = settled +kontroll = control +kontroll X (Y) = control X (Y) +localhost = localhost +lopp = race +mål = finish +målet = the finish +målet (X) = the finish (X) +nia = ninth +nionde = ninth +radio X = radio X +saknas = missing +se license.txt som levereras med programmet = see license.txt which is delivered with the software +serverbackup = server backup +sexa = sixth +sjua = seventh +sjunde = seventh +sjätte = sixth +skicka stämplar = send punches +sortering: X, antal rader: Y = sort order: X, number of rows: Y +starten (X) = the start (X) +sträcka X = leg X +stämplade vid = punched at +stämplar vid X som Y, på tiden Z = punches at X as Y, with time Z +tar ledningen med tiden X = takes the lead with time X +tia = tenth +till = to +tionde = tenth +tolfte = twelfth +tolva = twelfth +tooltip:analyze = Analyze data and preview import. +tooltip:builddata = Extend MeOS knowledge of runners, clubs, and classes by analyzing competition data. +tooltip:import = Import entries from file. +tooltip:inforest = List of runners in forest and runners that did not start. +tooltip:paste = Paste entries from clip board. +tooltip:resultprint = Print results to put on display +tooltip:voice = Computer voice reading forewarnings. +trea = third +tredje = third +tvåa = second +väntas till X om någon minut = is soon expected to X +väntas till X om någon minut, och kan i så fall ta en Y plats = is expected to X in a minute, and can take a Y place +väntas till X om någon minut, och kan i så fall ta ledningen = is expected to X in a minute, and can take the lead +växeln = the changeover +växlar på X plats med tiden Y = changes over as X with time Y +växlar på X plats, efter Y, på tiden Z = changes over at a X place, after Y, with time Z +växlar på delad X plats med tiden Y = changes over as X with time Y +warn:changedtimezero = Changing the zero time for a competition with results is not recommended.\n\nDo you wish to proceed anyway? +warn:olddbversion = The database is in use by a later version of MeOS. Upgrading is recommended. +warning:dbproblem = WARNING. Problems with database connection: 'X'. The connection will automatically be restored. Continue to work normally. +warning:drawresult = The class already has results, start times will be overwritten. Do you want to proceed? +warning:has_entries = The class already has runners. Changing the leg distribution at this stage, may cause data loss.\n\nDo you wish to proceed? +warning:has_results = The class already has results. Changing the leg distribution at this stage is unusual.\n\nDo you wish to proceed? +xml-data = xml data +Äldre protokoll = Old protocol +Ändra = Change +Ändra grundläggande inställningar och gör en ny fördelning = Modify basic settings and make a new distribution +Ändra inställningar = Modify Settings +Ändra klassinställningar = Change Class Settings +Ändra lag = Change team +Ändra sträckindelning = Modify Leg Setup +Ändrad = Modified +Ändrade avgift för X deltagare = Modified fee for X competitor(s) +Åldersfilter = Age filter +Åldersgräns ungdom = Age limit, low +Åldersgräns äldre = Age limit, high +Åldersgränser, reducerad anmälningsavgift = Age limits, fee reduction +Ångra = Undo +Återansluten mot databasen, tävlingen synkroniserad = Reconnected to database, competition synchronized +Återbud = Drop Out +Återgå = Return +Återställ = Revert +Återställ / uppdatera klasstillhörighet = Reset / update competitor's class +Återställ löpare med registrering till = Reset Status to for Runners with Registration +Återställ säkerhetskopia = Restore Backup +Återställ tabeldesignen och visa allt = Restore table design +ÅÅÅÅ-MM-DD = YYYY-MM-DD +Öppen = Open +Öppen klass = Open class +Öppna = Open +Öppna fil = Open File +Öppna från aktuell tävling = Open from This Competition +Öppna föregående = Open Preceding +Öppna föregående etapp = Open preceding stage +Öppna i ett nytt fönster = Open in a new window +Öppna klasser, ungdom = Open classes, youth +Öppna klasser, vuxna = Open classes, adults +Öppna nästa = Open Next +Öppna nästa etapp = Open next stage +Öppna tävling = Open Competition +Öppna vald tävling = Open selected competition +Öppnad tävling = Opened competition +Överför anmälda = Transfer entires +Överför nya deltagare i ej valda klasser med status "deltar ej" = Transfer new competitors in remaining classes with status +Överför resultat = Transfer results +Överför resultat till X = Transferring results to X +Överför resultat till nästa etapp = Transfer Results to the Next Stage +Övre datumgräns = Upper date limit +Övre gräns (år) = Upper limit (years) +Övre ålder = Upper age +Övriga = Other +är först i mål med tiden X = is first to the finish with time X +är först vid X med tiden Y = is first at X with time Y +är först vid växeln med tiden X = is first to the changeover with time X +är inte godkänd = is disqualified +återställd = restored +åtta = eight +åttonde = eighth +Kopia (X) = Copy (X) +Tillåt samma bana inom basintervall = Allow same course within base interval +Välj X = Select X +Ett startblock spänner över flera starter: X/Y = A start block spans more than one start: X/Y +Bricka X = Card X +RunnerTimePerKM = Speed min/km +X är inget giltigt sträcknummer = X is not a valid leg number +Listan togs bort från tävlingen = List was removed from the competition +Töm = Clear +Status matchar inte deltagarnas status = The status does not match runner status. +Status matchar inte data i löparbrickan = The status does not match data in punching card. +Döp om = Rename +går upp i delad ledning vid X med tiden Y = shares the lead at X, time Y +X:e = X:th +tar ledningen vid X med tiden Y = takes the lead at X, time Y +Eventor server = Eventor server +(har stämplat) = (has punched) +documentation = meos_doc_eng.html +Hittar inte hjälpfilen, X = Cannot find documentation, X +X har redan ett resultat. Vi du fortsätta? = X already has a result. Do you wish to continue? +Aktuell tid = Current time +Godkänd = OK +Nummerlapp, SI eller Namn = Bib, card number, or name +Utgått = DNF +Manuell inmatning = Manual input +Tilldelad = Assigned +Eventors tider i UTC (koordinerad universell tid) = Eventor times in UTC (Universal Coordinated Time) +Exportera tider i UTC = Export times in UTC +Tidszon = Time Zone +RunnerAge = Competitor's age +RunnerBirthYear = Competitor's year of birth +RunnerFee = Competitor's fee +RunnerNationality = Competitor's nationality +RunnerPhone = Competitor's phone number +RunnerSex = Competitor's sex +TeamFee = Team's fee +Varning: ändringar i X blev överskrivna = Warning: Changes in X was overwritten +help:simulate = This service lets you simulate readout of SI cards. Times and punches are generated for all runners. Also radio contol punches can be simulated.\n\nWARNING: Use for testing only. If you use this on a real event, it will be corrupted. +Rogainingresultat - %s = Rogaining results - %s +TeamPlaceDiff = Team's place difference (this stages) +TeamTotalPlace = Team's summed place (all stages) +TeamTotalTime = Team's summed time (all stages) +TeamTotalTimeAfter = Team's summed time after (all stages) +TeamTotalTimeDiff = Team's summed time after difference (this stage) +TeamTotalTimeStatus = Team's summed time or status (all stages) +Vill du dumpa aktuellt tävling och skapa en testtävling? = Do you want to dump the current competition and create a test competition? +Radera alla klubbar = Delete All Clubs +Radera alla klubbar och ta bort klubbtillhörighet = Remove all clubs and clear club memberships +Vill du ta bort alla klubbar från tävlingen? Alla deltagare blir klubblösa = Do you wish to remove all clubs from the competition? No competitor will have a club. +Besökare = Visitors +Föregående kontroll = Preceding control +Ja = Yes +Nej = No +På banan = On course +Stämpelkod = Control code +Tidpunkt = Time +Antal deltagare = Competitors +Förekomst = Occurrence +Exporterar om = Exporting in +Exportformat = Export format +Filnamnsprefix = Filename prefix +Mapp = Folder +Mappnamnet får inte vara tomt = Folder name cannot be empty +Onlineresultat = On-Line Results +Packa stora filer (zip) = Compress large files (zip) +Publicera resultat direkt på nätet = Publish results directly on the web +Resultat online = Results On-Line +Skicka till webben = Send to the web +Spara på disk = Save to disk +Till exempel X = For example X +Tävlingens ID-nummer = Competition ID number +URL = URL +URL måste anges = URL missing +Tidsintervall (sekunder) = Time interval (seconds) +Antal skickade uppdateringar X (Y kb) = Number of updates X (Y kb) +Filen finns redan: X = Destination already exists: X +Misslyckades med att ladda upp onlineresultat = Failed to upload on-line results +Onlineservern svarade felaktigt = Remote server gave unexpected reply (Incorrect configuration?) +Onlineservern svarade: ZIP stöds ej = Response from remote server: ZIP not supported. +Onlineservern svarade: Serverfel = Response from remote server: Server error +Onlineservern svarade: Felaktigt lösenord = Response from remote server: Wrong password +Onlineservern svarade: Felaktigt tävlings-id = Response from remote server: Wrong competition id +Online Results Error X = On-Line Results Error X +PDF = PDF +ClassTeamLeg = Class, team, leg +Okänd = Unknown +Antal hämtade uppdateringar X (Y kb) = Number of received updates X (Y kb) +Använd ROC-protokoll = Use ROC protocol +Definierade mappningar = Defined mappings +Funktion = Function +Hämta stämplingar m.m. från nätet = Fetch punches etc. from the Internet. +Inmatning online = Remote Input +Kod = Code +Kontrollmappning = Control Mapping +Ogiltig funktion = Invalid function +Ogiltig kontrollkod = Invalid control code +Onlineinput = Remote input +Online Input Error X = Remote Input Error X +Ekonomi = Economy +Fakturainställningar = Invoice Settings +Hantera klubbar = Manage Clubs +Spara som PDF = Save as PDF +Avgifter och valuta ställer du in under = Fees and currency settings are changed from +Fakturanummer = Invoice number +Formatering = Formatting +Första fakturanummer = First invoice number +Koordinater (mm) för adressfält = Coordinates (mm) for address field +Organisatör = Organizer +Tilldela nya fakturanummer till alla klubbar? = Assign new invoice numbers to all clubs? +Exportera alla till PDF = Export all to PDF +help:onlineresult = The service is used to automatically send results and start lists to the Internet for immediate publication in some form. You need to make settings adapted to the remote service you want to user: the provider of the remote service can give you necessary details.\n\nIf you want to develop you own services, you can find documentation and examples on MeOS web site: www.melin.nu/meos. +help:onlineinput = The service is used to receive radio punches from the Internet, for example a radio control connected via a mobile phone. It is also possible to construct a simple web form, where you can manually enter the bib number of runners as the pass by.\n\nThe service protocol also supports other types of data entry, such as team line-up, direct entries, card changes etc. If you want to develop you own services, you can find documentation and examples on MeOS web site: www.melin.nu/meos. +Egna textrader = Custom text lines +Inga bommar registrerade = No control mistakes detected +Inställningar sträcktidsutskrift = Print Split Times Settings +Med km-tid = Include tempo (min/km) +Tidsförluster (kontroll-tid) = Time loss (control/time) +Underlag saknas för bomanalys = No data for control mistakes +min/km = min/km +X har redan bricknummer Y. Vill du ändra det? = X already has card number Y. Do you want to change it? +Avmarkera 'X' för att hantera alla bricktildelningar samtidigt = Uncheck 'X' to handle all card assignments on one page +Bricknr = Card number +Knyt automatiskt efter inläsning = Auto assign on readout +Knyt bricka / deltagare = Assign Card to Competitor +Nummerlapp, lopp-id eller namn = Bib, race id, or name +Lopp-id = Race Id +Markera 'X' för att hantera deltagarna en och en = Check 'X' to handle competitors one by one +Installerbara listor = Installable Lists +Listor i tävlingen = Lists in the Competition +Radera permanent = Delete Permanently +Tillgängliga listor = Available lists +Vill du ta bort 'X'? = Do you want to remove 'X'? +classcourseresult = Results class and course-wise +Hantera egna listor = Manage Custom Lists +Redigera = Edit +Skriver sträcktider när tävlingsdata ändras = Writing file when competition data is changed +Bana med slingor = Course with loops +En bana med slingor tillåter deltagaren att ta slingorna i valfri ordning = A course with loops allow the competitor to take the loops in any order +Varvningskontroll = Common control +warn:notextended = INFO: Program the unit with extended protocol in SI.Config to speed up card reading. +help:DirectResult = - If there is no course, the status is set to OK on finish punch.\n\n- If there is a course, radio punches are used as controls. No card readout is necessary. +Resultat vid målstämpling = Result on finish punch +Stämpling = Punch +Skicka och ta emot snabb förhandsinformation om stämplingar och resultat = Send and receive fast advance information on control punches and results +Centrera = Center +Färg = Color +Höger = Right +PunchControlCode = Control code +PunchControlNumber = Punch code +PunchControlPlace = Place, leg to control +PunchControlPlaceAcc = Place, total after control +PunchLostTime = Time lost at control +Slå ihop text med föregående = Merge with previous +Textjustering = Text adjustment +Vänster = Left +X (press Ctrl+Space to confirm) = X (press + to confirm) +Press Enter to continue = Press to continue +ask:overwriteresult = X already has a result. Do you want to overwrite it? +Brickan används av X = The card is used by X +DATABASE ERROR = DATABASE ERROR +Lyssnar på X = Listening to X +vid kontroll X = at Control X +info:runnerdbonline = Since you are connected to a server, it is not possible to edit the club and runner databases manually. Make changes before uploading the competition to a server. It is also possible to replace the existing database on the server by importing a new database (from IOF XML). +ask:cleardb = Do you want to clear the runner and club databases? +Banan saknar rogainingkontroller = The course has no defined rogaining controls +Banans kontroller ger för få poäng för att täcka poängkravet = The rogaining controls awards too few points to cover the requirement +CustomSort = Custom order +Brickhantering = Handle Cards +HTML med AutoRefresh = HTML with AutoRefresh +Importera laguppställningar = Import Team Line-Ups +MeOS Funktioner = MeOS Features +Målfil = Destination file +Spara tid = Save time +Stämplingstid = Punching time +Data from result module (X) = Data from result module (X) +Forkings = Forkings +Forkings for X = Forkings for X +Gruppera = Group +Resultatuträkning = Result calculation +RunnerRogainingPointTotal = Competitor's total points +Show forking = Show Forking +Standard = Standard +TeamRogainingPointTotal = Team's total points +The forking is fair = The forking is fair +Underfilter = Sub Filter +Ogiltigt lag på rad X = Invalid team on row X +Okänd klass på rad X = Unknown class on row X +Klassen X är individuell = The class X is individual +Använd befintliga deltagare = Use competitors already in competition +Knyt redan anmälda deltagare till laget (identifiera genom namn och/eller bricka) = Group already existing competitors to the team (identified by name and/or card number) +Laguppställning = Team Line-up +Bakåt = Back +Bibs = Bibs +Club and runner database = Club and runner database +Clubs = Clubs +Economy and fees = Economy and fees +Forked individual courses = Forked individual courses +General = General +Manual point reductions and adjustments = Manual point reductions and adjustments +Manual time penalties and adjustments = Manual time penalties and adjustments +MeOS Features = MeOS Features +MeOS – Funktioner = MeOS – Features +Patrols = Patrols +Prepare start lists = Prepare start lists +Relays = Relays +Several MeOS Clients in a network = Several MeOS Clients in a network +Several races for a runner = Several races for a runner +Spara laguppställningar = Save Team Line-Ups +Teams and forking = Teams and forking +Track runners in forest = Track runners in forest +Vacancies and entry cancellations = Vacancies and entry cancellations +Banan saknas = Missing course +Klassen saknas = Missing class +Alla lopp som individuella = Every race as individual +Exportera individuella lopp istället för lag = Export as individual races instead of teams +Exportera startlista = Export start list +Exporttyp = Export type +Exportval, IOF-XML = Export settings, IOF-XML +Failed to read file = Failed to read file. +Klassval = Class selection +The forking is not fair = The forking is not fair +Unfair control legs = Unfair control legs +Växel = Changeover +help:teamlineup = Here you can import team line-ups from a structured text based format, which is easy to produce manually from a spreadsheet program. The file must have the following format:\n\nClass;Team name;[Club]\nCompetitor 1;[Card No];[Club];[Course];[Competitor's class]\nCompetitor 2;[Card No];[Club];[Course];[Competitor's class]\n...\nClass;Team name;[Club]\n...\n\nFields marked with [] may be excluded. Note that referred classes and courses must exist, and that the number of legs in the class must match the number of competitor rows following the class. Empty rows can be used if there is no competitor. The option means that only competitors already in the competition are moved to the team; other competitors specified are ignored. +Poängjustering = Point adjustment +Use initials in names = Use initials in names +Exportera klubbar (IOF-XML) = Export Clubs (IOF-XML) +Exportera personer (IOF-XML) = Export Persons (IOF-XML) +Töm databasen = Clear Database +Several stages = Several stages +Assign courses and apply forking to X = Assign Courses and Apply Forking to X +Assign selected courses to selected legs = Assign Selected Courses to Selected Legs +Calculate and apply forking = Calculate and Apply Forking +Clear selections = Clear Selections +Define forking = Define Forking +Forking setup = Forking Setup +Leg X: Do not modify = Leg X: Do not modify +Legs = Legs +help:assignforking = This function computes an optimal forking pattern from selected courses. Assign one or more courses to the legs by selecting courses and legs from the lists above. All courses can have the same set of courses (equal forking) or it i possible to use different set of courses for different legs. Also in this case, MeOS will fork these courses against each other, if the courses allow it. +Leg X = Leg X +Leg X: Use Y = Leg X: Use Y +Created X distinct forkings using Y courses = Created X distinct forks using Y courses +Clear Memory = Clear Memory +Create Competition = Create Competition +Print Card Data = Print Card Data +Print card data = Print card data +help:analyzecard = This function allows you to print out card data without using any competition, much like a standalone printing unit. Select Print Splits to select and configure the printer.\n\nThe cards are also saved in memory (but not in the competition). You can edit name and club for a card by clicking the name (Or 'Unknown'). You can also save the cards to file (Save) or create a new competition from card data. Note that if a competition is currently open, you must close it to make this option available. +Använd endast en bana i klassen = Use only one course in the class +Gafflade banor = Courses with Forks +Unroll split times for loop courses = Unroll split times for loop courses +Löpare per klass = Runners per class +Alla funktioner = All Features +Anmäl inga deltagare nu = No Entries +Datum (för första start) = Date (of first start) +Endast grundläggande = Basic Features +Funktioner i MeOS = MeOS Features +Första tillåtna starttid = First possible start time +Importera anmälda = Import Entries +Individuell tävling = Individual Competition +Namn och tidpunkt = Name and Time +Skapar tävling = Creating Competition +Tävling med lag = Competition with Teams +Tävlingen måste avgöras mellan X och Y = The competition must take place between X and Y +Tävlingens namn = Competition name +Välj från lista = Detailed Selection +Välj vilka funktioner du vill använda = Select which MeOS features you need for this competition +Individuellt, gafflat = Forked Individual +Skapa tävlingen = Create Competition +newcmp:featuredesc = Select which MeOS feature you need for this competition. You may add or remove features at any time by selecting on the page Competition. +Exportera till fil = Export to file +FilterPrelResult = Prel. result +FinishTimeReverse = Reversed finish time (last first) +Open a Copy = Open as Copy +Point calculation for runner = Point calculation for runner +Point calculation for team = Point calculation for team +Result score calculation for runner = Result score calculation for runner +Result score calculation for team = Result score calculation for team +ResultDescription = Name of result type +Skapa = Create +Status calculation for runner = Status calculation for runner +Status calculation for team = Status calculation for team +Support time from control = Support time from control +Support time to control = Support time to control +Time calculation for runner = Time calculation for runner +Time calculation for team = Time calculation for team +TimingFrom = Name of start point +TimingTo = Name of finish point +Applying rules to the current competition = Applying rules to the current competition +Available symbols = Available symbols +Cancel = Cancel +Description = Description +Edit Clubs = Edit Clubs +Edit Result Modules = Edit Result Modules +Edit rule for = Edit rule for +Name of result module = Name of result module +New Result Module = New Result Module +New Set of Result Rules = New Set of Result Rules +Result Calculation = Result Calculation +Result Module – X = Result Module – X +Result module identifier = Result module identifier +Result Modules = Result Modules +Save = Save +Save changes = Save changes +Source code = Source code +Test Result Module = Test Result Module +Result score calculation for team = Result score calculation for team +Time: X = Time: X +Start: X = Start: X +Index in X[index] = Index in X[index] +X är inget giltigt index = X is not a valid index +ResultModuleNumber = Result Module: Number +ResultModuleTime = Result Module: Time +ResultModuleNumberTeam = Result Module: Number (for Team) +ResultModuleTimeTeam = Result Module: Time (for Team) +RunnerRogainingOvertime = Competitor's overtime (rogaining) +RunnerRogainingReduction = Competitor's point reduction +TeamRogainingOvertime = Team's overtime (rogaining) +TeamRogainingReduction = Team's point reduction +Automatic rogaining point reduction = Automatic rogaining point reduction +Choose result module = Choose result module +Deviation +/- from expected time on course leg = Deviation +/- from expected time on course leg +Leg number in team, zero indexed = Leg number in team, zero indexed +Length of course = Length of course +Maximum allowed running time = Maximum allowed running time +Place on course leg = Place on course leg +Result Modules = Result Modules +Runner's card, matched control ids (-1 for unmatched punches) = Runner's card, matched control ids (-1 for unmatched punches) +Runner's card, punch codes = Runner's card, punch codes +Runner's card, punch times = Runner's card, punch times +Runner's course = Runner's course +Runner's split times = Runner's split times +Runner's total running time to control = Runner's total running time to control +Runner/team fee = Runner/team fee +Runner/team finish time = Runner/team finish time +Runner/team input place = Runner/team input place +Runner/team input points = Runner/team input points +Runner/team input running time = Runner/team input running time +Runner/team input status = Runner/team input status +Runner/team place = Runner/team place +Runner/team rogaining overtime = Runner/team rogaining overtime +Runner/team rogaining points = Runner/team rogaining points +Runner/team rogaining points adjustment = Runner/team rogaining points adjustment +Runner/team running time = Runner/team running time +Runner/team start time = Runner/team start time +Runner/team status = Runner/team status +Runner/team time adjustment = Runner/team time adjustment +Runner/team total place = Runner/team total place +Runner/team total running time = Runner/team total running time +Runner/team total status = Runner/team total status +Shortest time in class = Shortest time in class +Status as computed by your status method = Status as computed by your status method +Status code for a missing punch = Status code for a missing punch +Status code for a time over the maximum = Status code for a time over the maximum +Status code for a valid result = Status code for a valid result +Status code for an unknown result = Status code for an unknown result +Status code for disqualification = Status code for disqualification +Status code for not competing = Status code for not competing +Status code for not finishing = Status code for not finishing +Status code for not starting = Status code for not starting +Points as computed by your point method = Points as computed by your point method +Time as computed by your time method = Time as computed by your time method +Time after leg winner = Time after leg winner +Finish time for each team member = Finish time for each team member +Matched control ids (-1 for unmatched) for each team member = Matched control ids (-1 for unmatched) for each team member +Punch codes for each team member = Punch codes for each team member +Punch times for each team member = Punch times for each team member +Result Modules = Result Modules +Rogaining points for each team member = Rogaining points for each team member +Runner's method output numbers = Runner's method output numbers +Runner's method output times = Runner's method output times +Running time for each team member = Running time for each team member +Start time for each team member = Start time for each team member +Status for each team member = Status for each team member +Check: X = Check: X +Debug = Debug +Debug Output = Debug Output +Debug X for Y = Debug X for Y +Do you want to clear the card memory? = Do you want to clear the card memory? +Portable Document Format (PDF) = Portable Document Format (PDF) +Poängavdrag = Point reduction +RunnerPointAdjustment = Competitors's point adjustment +RunnerTimeAdjustment = Competitors's time adjustment +Save changes in rule code? = Save changes in rule code? +Symboler = Symbols +TeamPointAdjustment = Team's point adjustment +TeamTimeAdjustment = Team's time adjustment +Variabler = Variables +Check: X = Check: X +Choose result module = Choose result module +Result Modules = Result Modules +Error in result module X, method Y (Z) = Error in result module 'X', method 'Y'\n\nZ +Invalid operator X = Invalid operator X +Unknown symbol X = Unknown symbol X +RunnerGlobal = Competitor (classes together) +TeamGlobal = Team (classes together) +List Error: X = List Error: X +Rader markerade med (*) kommer från en lista i tävlingen = Rows with a (*) originates from a list in the competition +Resultatmodulen används i X = The Result Module is used in X +Valfri = Optional +Vill du sätta resultatet från tidigare etapper till ? = Do you want to change the result for earlier stages to (Not taking part)? +Hantera deltagare som bytt klass = Treatment of competitors that have changed class +Välj klasser med nya anmälningar = Specify classes where new entries are allowed +Byt till rätt klass (behåll eventuell starttid) = Switch to the right class (keep start time) +Byt till vakansplats i rätt klass (om möjligt) = Switch to a vacant position in the right class (if possible) +Tillåt ny klass, behåll resultat från annan klass = Allow new class and keep results from other class +Tillåt ny klass, inget totalresultat = Allow new class but without total result +tooltip_explain_status = - = Unknown Status (No result yet)\nOK = Valid result\nDNS = Did Not Start\nMP = Missing Punch\nDNF = Did Not Finish\nDISQ = Disqualified\nOMT = Over Maximum Time\nNTP = Not Taking Part +Placering = Place +Resultat från tidigare etapper = Results from Earlier Stages +Input Results = Input Results +Input Results - X = Input Results - X +Individuella resultat = Individual results +Avdrag = Reduction +Team Rogaining = Team Rogaining +Övertid = Over time +Kunde inte öppna tävlingen = Could not open the competition +warn:opennewversion = The competition is created in MeOS X. Data may be lost if you proceed.\n\nDo you wish to continue? +District id number = District id number +Kunde inte ladda X\n\n(Y) = Could not load X\n\n(Y) +Narrow Results = Narrow Result List +Club id number = Club id number +User input number = User defined input parameter +listinfo:singleclub = Create a result list for a single club.\nUse the input parameter to specify the club id. +listinfo:inputresults = Show input results from previous stages. +Ett värde vars tolkning beror på listan = A value with a list dependent interpretation +Listparameter = List parameter +Individual results in a club = Individual results within a club +OL-Skytte med tidstillägg = Orienteering/Shooting with Time Punishment +OL-Skytte utan tidstillägg = Orienteering/Shooting without Time Punishment +OL-Skytte stafettresultat = Orienteering/Shooting Relay +Sluttid = Final time +olshooting:timepunishment = Result list Orienteering/Shooting with Time Punichment.\n\nActivate support for Rogaining and manual point adjustments. The use the field Point reduction on the page Competitors to specify misses on the form PPPLLSS, where PPP is the point orienteering error in millimetres, LL misses lying and SS is misses standing. Example 30201 means 3 mm error, 2 lying and 1 standing miss. +olshooting:notimepunishment = Result list Orienteering/Shooting without Time Punichment.\n\nActivate support for Rogaining and manual point adjustments. The use the field Point reduction on the page Competitors to specify misses on the form LLSS, where LL means misses lying and SS means misses standing. Example: 0201 means 2 lying and 1 standing miss. +Namnet kan inte vara tomt = The name cannot be empty +Ingen / okänd = None / unknown +Inget nummer = No number +Stafettresultat = Relay Results +Döp om X = Rename X +Gräns för maxtid = Limit for maximum time (OMT) +Individual Example = Individual Example +Long = Long +MeOS Three Days Race X = MeOS Three Days Race X +Medium = Medium +Open = Open +Open X = Open X +Prologue + Pursuit = Prologue + Pursuit +Relay Example = Relay Example +Short = Short +Ultra Long = Ultra Long +Tillgängliga filer installerades. Starta om MeOS. = Settings was installed. Please restart MeOS. +edit_in_forest = Manage\nRemaining Runners +Latest Results = Latest Results +warning:direct_result = Note that using requires that all control punches on the course have been sent as radio controls, or that MeOS is used only for timing without a course.\n\nUse result on finish punch? +Inställningar startbevis = Print Start Certificate Settings +Skrivarinställningar = Printer Settings +Skrivarinställningar för sträcktider och startbevis = Printer settings for split times and start certificates +Startbevis = Start Certificate +Startbevis X = Start Certificate X +Skriv ut startbevis = Print Start Certificate +Skriv ut startbevis för deltagaren = Print start certificate for competitor +Utskrift = Print +Från klassen = From class +Tillsätt ytterligare vakans = Fill Another Vacancy +Överföring = Transfer +Anmäl till efterföljande etapper = Enter for subsequent stages +Totalt antal etapper = Total number of stages +Vill du använda den nya brickan till alla etapper? = Do you want to use the new card for all stages? +Avkortad banvariant = Shortened course +Avkortning = Shortening +Hantera laget = Manage team +Med avkortning = With shortening +info_shortening = Select an existing course that shortens the current course. Several levels of shortening is possible. +Tilldela starttider = Assign start times +Avkortar: X = Shortens: X +Vill du nollställa alla manuellt tilldelade banor? = Do you wish to clear all manually assigned courses? +Ange löpande numrering eller första nummer i klassen = Specify consecutive numbering between classes or specify first number in class +Ange relation mellan lagets och deltagarnas nummerlappar = Specify the relation between team's bib and team member's bibs +Lagmedlem = Team member +Löpande = Consecutive +Oberoende = Independent +Samma = Same +Ökande = Increasing +Manuell = Manual +Vill du uppdatera alla nummerlappar? = Do you want to update all bibs? +Hela banan = Entire course +Ogiltigt maximalt intervall = Invalid maximum interval +Startintervallet får inte vara kortare än basintervallet = A start interval may not be shorter than the base interval +Ett startintervall måste vara en multipel av basintervallet = A start interval must be a multiple of the base interval +Ogiltigt minimalt intervall = Invalid minimal interval +Ogiltigt basintervall = Invalid base interval +Country = Country +CourseShortening = Course shortening +Nationality = Nationality +Number of shortenings = Number of shortenings +Längd = Length +Redigera sträcklängder = Edit Leg Lengths +Redigera sträcklängder för X = Edit Leg Lengths for 'X' +Oordnade parallella sträckor = Out of order parallel legs +Tillåt löpare inom en parallell grupp att springa gruppens banor i godtycklig ordning = Allow competitors within a parallel group to run the courses of the group in any order +Laguppställningen hade fel, som har rättats = The team line-up had errors, which have been corrected +ControlClasses = Control's classes +ControlCodes = Control's punch codes +ControlCourses = Control's courses +ControlMaxLostTime = Control, lost time, maximum +ControlMedianLostTime = Control, lost time, median +ControlMistakeQuotient = Control, quotient of runners with lost time +ControlName = Control's name +ControlPunches = Control's actual number of visitors +ControlRunnersLeft = Control's remaining number of visitors +ControlVisitors = Control's expected number of visitors +CourseClasses = Course's classes +CourseUsage = Course's number of required maps +CourseUsageNoVacant = Course's number of entries excluding vacant positions +Bomkvot = Mistake Quotient +Control = Control +Control Statistics = Control Statistics +Control Statistics - X = Control Statistics - X +Course = Course +FilterSameParallel = Collect parallel legs +Kontrollrapport - X = Control Report - X +Maxbom = Max Mistake +Control Overview = Control Overview +Medianbom = Median Mistake +N.N. = X +Endast på obligatoriska sträckor = Only process non-optional legs. +Fyll obesatta sträckor i alla lag med anonyma tillfälliga lagmedlemmar (N.N.) = Fill vacant legs in all teams with anonymous temporary team members (X) +Skapa anonyma lagmedlemmar = Appoint Anonymous Team Members +Tillsätt tillfälliga anonyma lagmedlemmar = Appoint Anonymous Team Members +Tillsätt = Appoint +help:anonymous_team = Create and appoint (temporary) team members for all teams, to whom you can assign SI Card, Course etc. +Anonymt namn = Anonymous name +Med anmälningsavgift (lagets klubb) = With entry fee (for the team club) +Tar bort X = Removing X +Källa = Source +Ta bort eventuella avanmälda deltagare = Remove canceled entries, if any +Verktyg = Tools +Automatisk = Automatic +Avstånd = Distance +Extra avstånd ovanför textblock = Extra distance above +FilterSameParallelNotFirst = Collect parallel legs, skip first +RunnerLeg = Competitor (specific leg) +Texten ska innehålla tecknet X, som byts ut mot tävlingsspecifik data = The text must include the symbol X, which is replaced by competition specific data +Tabellverktyg = Table tools +Antal reserverade nummerlappsnummer mellan klasser = Number of reserved bib numbers between classes +help:bibs = You can handle bibs automatically or manually. Here you can assign bibs manually for a certain class by specifying the method Manual and provide the first number in the class.\n\nThe method automatic works in the same way, with the difference that MeOS will update the bibs of all classes at once. Although it is possible to make this setting here, it is better to use the Quick settings for classes to get an overview over all classes.\n\nUse the method Automatic together with the methods None or Consecutive, which means that the last number in the preceding class is used as first number. The number of reserved bibs specifies the jump made in the numbering between classes.\n\nFor team classes you can specify how the competitors´ bibs relate to the team´s bib. It can be the Same, Independent, Increasing (Team 1: 101, 102, 103, 104, Team 2: 111, 112, 113, 114 etc) or Leg (100-1, 100-2, 100-3 etc). +RunnerGeneralPlace = Competitor's team's or individual place +RunnerGeneralTimeAfter = Competitor's team's or individual time after +RunnerGeneralTimeStatus = Competitor's team's or individual time / status +open_error = Failed to open X.\n\nY. +open_error_locked = This competition is already open in MeOS.\n\nYou have to use a database to open more than one instance of the competition. +Ogiltigt bricknummer = Invalid card number +ask:updatelegs = Lengths of individual course legs may require an update after this change.\n\nDo you wish fix that now? +warn:updatelegs = Lengths of individual course legs may require an update after this change. +Ingen deltagare vald = No competitor selected +Från klubben = From the Club +Från laget = From the Team +Gafflingsnyckel X = Forking Key X +help:teamwork = The runners swap position. You can make a sequence of swaps to reach the new team line-up. +Ordnat = Ordered +Str. X = Leg X +Vill du att X går in i laget? = Do you want to put X in the team? +Vill du att X och Y byter sträcka? = Do you want X and Y to switch leg? +Vill du att X tar sträckan istället för Y? = Do you want X to run the leg instead of Y? +Ändra lagets gaffling = Change Team Forking +Deltagarens klass styrs av laget = The class is defined by the team +För att delta i en lagklass måste deltagaren ingå i ett lag = To participate in a team class you need to assign a team to the competitor +Dela upp = Split +Alla sträckor = All legs +Liveresultat, deltagare = Live Results, individual +Använd enhets-id istället för tävlings-id = Use Unit ID instead of competition ID +Enhetens ID-nummer (MAC) = Unit ID (MAC) +Antal deltagare: X = Number of competitors: X +Dela efter placering = Split by result +Dela efter tid = Split by time +Dela slumpmässigt = Random split +Jämna klasser (placering) = Make equal classes (result) +Jämna klasser (ranking) = Make equal classes (ranking) +Jämna klasser (tid) = Make equal classes (time) +Klass X = Class X +Not yet implemented = Not yet implemented +Tidstillägg = Time punishment +help:seeding_info = Seeded start time allocation means that an earlier result or ranking controls the process in part. In the field seeding groups you may either enter a single group size, meaning that the entire class is partitioned into groups of this size. The group size "1" means that the seeding order is strictly used. You can also specify several group sizes. "15, 1000" would meen a seeded group with the 15 highest ranked runners and the remaining (at most 1000) runners are placed in a non-seeded group. +Ange en gruppstorlek (som repeteras) eller flera kommaseparerade gruppstorlekar = Supply one group size (to be repeated) or several comma separated sizes +Hindra att deltagare från samma klubb startar på angränsande tider = Prevent competitors from the same club to start at adjacent start times. +Låt de bästa start först = Let the highest ranked start first +Seedningsgrupper = Seeding groups +Seedningskälla = Seeding source +error:invalidmethod = The selected method gave no distribution. Source data is insufficient. +Ogiltig storlek på seedningsgrupper X = Invalid size of seeding groups: X +Bananvändning = Course Usage +Antal banor = Number of courses +Could not load list 'X' = Could not load list 'X' +Från den här listan kan man skapa etiketter att klistra på kartor = From this list, you can create labels to stick on the maps +Gafflingar i tabellformat = Forkings in table format +Vakanser - X = Vacancies - X +Kopiera = Copy +Kopiera till urklipp = Copy to the clipboard +RunnerStartCond = Competitor's start time (if individual) +StartTimeForClassRange = Class start time range +TeamStartCond = Team's start time (if individual) +Liveresultat = Live Results +Visa rullande tider mellan kontroller i helskärmsläge = Show rolling times between controls in full screen mode +help:liveresultat = This method starts a timer in full screen mode (large-screen) when a competitor in a selected class punches the control, and measures the time until the control is reached. Otherwise a top list with the best results is shown. Both controls need of course be online controls and if you use a network, make sure to activate to get a responsive timer. +Result at a control = Result at a control +Total/team result at a control = Total/team result at a control +prefsAccount = Default account number +prefsAddress = Default address +prefsAdvancedClassSettings = Show advanced class settings +prefsAutoSaveTimeOut = Automatic backup intervall (ms) +prefsCardFee = Default card fee +prefsClient = Name of client in a network +Vissa inställningar kräver omstart av MeOS för att ha effekt = Some settings require a restart of MeOS to have effect +prefsAutoTie = Tie runner/card automatically +prefsControlFrom = Last from control +prefsControlTo = Last to control +prefsCurrencyFactor = Currency scale factor +prefsCurrencyPreSymbol = Place currency symbol in front +prefsCurrencySeparator = Currency decimal separator +prefsCurrencySymbol = Currency symbol +prefsDatabase = Use runner database +prefsDatabaseUpdate = Last runner database update +prefsDefaultDrawMethod = Default draw method +prefsDirectPort = Network port for advance punch data +prefsEMail = EMail +prefsEliteFee = Default elite fee +prefsEntryFee = Default entry fee +prefsEventorBase = URL to Eventor +prefsFirstInvoice = First invoice number +prefsFirstTime = First startup +prefsHomepage = Homepage +prefsInteractive = Interactive card handling +prefsLateEntryFactor = Factor for late entry fee +prefsLiveResultFont = Font used for live results +prefsMIPURL = URL to MIP server +prefsMOPFolderName = Local MOP folder +prefsMOPURL = URL to MOP server +prefsManualInput = Use manual result input +prefsMaximumSpeakerDelay = Maximum delay in speaker update +prefsOrganizer = Organizer +prefsPort = MySQL network port +prefsRentCard = Rent card +prefsSeniorAge = Upper age limit +prefsServer = Default network server +prefsSpeakerShortNames = Use initials in names +prefsStreet = Organizer street address +prefsSynchronizationTimeOut = Network update timeout (ms) +prefsTextFont = MeOS text font +prefsUseDirectSocket = Use advance punch data +prefsUseEventor = Use Eventor +prefsUseEventorUTC = Use universal coordinated time with Eventor +prefsUseHourFormat = Use format HH:MM:SS instead of MMM:SS +prefsUserName = MySQL user name +prefsYouthAge = Low age limit +prefsYouthFee = Reduced fee +prefsaddressxpos = Address x-coordinate +prefsaddressypos = Address y-coordinate +prefsclasslimit = Limit shown results per class +prefsintertime = Show intermediate times +prefspagebreak = Add page breaks +prefssplitanalysis = Perform split time analysis +Ändra MeOS lokala systemegenskaper = Change MeOS local system properties +true[boolean] = true +false[boolean] = false +Ändra X = Change X +Ingen parstart = Individual start +Parvis (två och två) = Pairwise (two by two) +X och Y[N by N] = X by Y +Lotta klasser med samma bana gemensamt = Draw classes with the same course together +Lotta starttider = Draw Start Times +Lotta klasser med banan X = Draw classes with the course 'X' +MeOS Timing = MeOS Timing +Med resultat = With results +Säkerhetskopiering = Interval Backup +Destination: X = Destination: X +Ogiltig destination X = Invalid destination X +Säkerhetskopierar om = Backing up in +Year of birth = Year of birth +Ogiltigt antal sekunder: X = Invalid number of seconds: X +Du kan använda en SI-enhet för att läsa in bricknummer = You can use an SI unit to read card the number +Ignorera startstämpling = Ignore start punch +Uppdatera inte starttiden vid startstämpling = Do not update start time with start punch time +Ändra lokala inställningar = Change local settings +Gafflingsnyckel = Forking key +Felaktigt datumformat 'X' (Använd ÅÅÅÅ-MM-DD) = Incorrect date format 'X' (Use YYYY-MM-DD) +Felaktigt tidsformat 'X' (Använd TT:MM:SS) = Incorrect time format 'X' (Use HH:MM:SS) +Hämta inställningar från föregående lottning = Fetch settings from previous session +Ej startstämpling = Disregard start punch +Extraplatser = Extra places +Fritt = Free +Från lag = From team +Lag + sträcka = Team + leg +Nummerlappshantering = Bib management +Oordnade parallella = Unordered parallel +Spara starttider = Save start times +X platser. Startar Y = X places. Starts Y +övriga = other +RunnerStartZero = Competitor's relative start time (zero time) +TeamStartZero = Team's relative start time (zero time) +Datumfilter = Date filter +Inget filter = No filter +Inlästa stämplar = Read punches +Löpare saknas = No competitor +Klasserna X och Y har samma externa id. Använd tabelläget för att ändra id = The classes X and Y have the same external id. Use the table mode to correct the id +Vill du koppla isär X från inläst bricka Y? = Would you like to disconnect X from the read out card Y? +RunnerRogainingPointGross = Rogaining points before reduction +Samlade poäng = Collected points +Tidsavdrag = Deduction +X p = X p +Bricka X används också av = Card X is also used by +reused card = reused card +Varning: Brickan X används redan av Y = Warning: The card X is already used by Y +Invalid filter X = Invalid filter X +Invalid font X = Invalid font X +Aktivera stöd för tider över 24 timmar = Activate support for running times longer than 24 hours. +Inkludera information om flera lopp per löpare = Include information about multiple races for a single runner. +Alla uthyrda brickor har bockats av = All rented cards are ticked off +Avbockade brickor = Ticked off cards +Avstämning hyrbrickor = Count returned hired cards +Brickor markerade som både uthyrda och egna: X = Cards used as both hired and owned: X +Nollställ = Clear +Nollställ minnet; markera alla brickor som icke avbockade = Clear memory; forget all ticked off cards +Rapport = Report +Totalt antal unika avbockade brickor: X = Number of unique ticked off cards: X +Uthyrda brickor som inte avbockats = Hired cards that are not ticked off +Uthyrda: X, Egna: Y, Avbockade uthyrda: Z = Hired Cards: X, Owned Cards: Y, Hired and Ticked Off: Z +Vill du göra om avbockningen från början igen? = Do you want to reset and start all over again? +help:checkcards = Use this function to count and tick off hired cards to check that they all have been returned. Attach a SI unit (preferably programmed as a control or finish, since that is faster than card read out), and punch all returned cards. Push the Report button to see if any card is missing.\n\n The check is done locally at this computer, and does not modify the competition. +Betalningsmetoder = Modes of Payment +help:paymentmodes = You can define custom modes of payment, in addition to invoicing, to distinguish these in the bookkeeping. +Betalsätt = Payment Mode +Förväntat antal besökare: X = Expected number of visitors: X +Starttiden är definerad genom klassen eller löparens startstämpling = The start time is defined through the class or through a start punch +sekunder = seconds +är X före Y = is X before Y +var först i mål med tiden X = was first to the finish with time X +var först vid X med tiden Y = was first at X with time Y +var först vid växeln med tiden X = was first to the changeover with time X +är nu på X plats med tiden Y = is now on a X place with time Y +är nu på delad X plats med tiden Y = is now on a shared X place with time Y +är X efter = is X behind +är X efter Y = is X behind Y +är X efter; har tappat Y = is X behind; has lost Y +är X efter; har tagit in Y = is X behind; as gained Y +leder med X; har tappat Y = leads with X; has lost Y +leder med X; sprang Y snabbare än de jagande = leads with X; ran Y faster than the others +leder med X = leads with X +delar placering med X = shares place with X +sekund = second +skickar ut X = sends out X +Export language = Export language +Export split times = Export split times +Climb (m) = Climb (m) +Utrymme: X = Size: X +[Radera] = [Delete] +prefsNumSplitsOnePage = Number of cards per page +prefsPayModes = Modes of payment +prefsSplitPrintMaxWait = Maximum split print wait time +prefsWideSplitFormat = Print splits in wide format +ClassTeamLegResult = Class and leg result +SortLastNameOnly = Family name +Databaskälla = Database source +Filnamn IOF (xml) eller OE (csv) med löpare = Filename IOF (xml) or OE (csv) with runners +Importinställning = Import settings +prefsExportCSVSplits = Include splits in csv export +prefsExportFormat = Preferred export format +prefsImportOptions = Preferred import option +prefsSplitLateFees = Split late fees into normal and late part for IOF XML export +Längsta tid i sekunder att vänta med utskrift = Longest time in seconds to wait for the printout +Max antal brickor per sida = Maximum number of cards per page +Sträcktider i kolumner (för standardpapper) = Times in columns (for standard paper) +Spara inmatade tider i tävlingen utan att tilldela starttider = Save times and settings for each class so that you can continue working later +SRR Dongle = SRR Dongle +red channel = red channel +blue channel = blue channel +Printing failed (X: Y) Z = Printing failed (X: Y) Z +prefsNameMode = Name format: 0 = 'Given Family', 1 = 'Family, Given' diff --git a/code/french.lng b/code/french.lng new file mode 100644 index 0000000..1ed8a6f --- /dev/null +++ b/code/french.lng @@ -0,0 +1,2241 @@ +encoding = ANSI +%s m = %s m +%s meter = %s mètres +%s, block: %d = %s, bloc: %d +(ledare) = (leader) +(lokalt) = (local, pas de serveur) +(okänd) stämplade vid = (inconnu) a poinçonné +(på server) = (sur serveur) +(sekunder) = (secondes) +(sträckseger) = (meilleur partiel) +ALLA( = Tous( +API-nyckel = clef API +Accepterade elektroniska fakturor = Factures électroniques acceptées +Adress = Adresse +Adress och kontakt = Adresse et contact +Aktivera = Activer lecteur +Alla = Tous +Alla banfiler = Tous les fichiers de circuit -oli +Alla deltagare måste ha ett namn = Tous les concurrents doivent avoir un nom +Alla fakturor = Toutes les factures +Alla händelser = Tous les evenements +Alla lag måste ha ett namn = Toutes les équipes doivent avoir un nom +Alla listor = Toutes les listes +Alla lopp = Toutes les courses +Alla sträckor/lopp i separata filer = Tous les partiels/courses dans des fichiers séparés +Alla typer = Tous les types +Allmänna resultat = Résultats généraux +Andel vakanser = Partie disponible +Ange första nummerlappsnummer eller lämna blankt för inga nummerlappar = Entrer le premier numéro de dossard, ou laisser vide en l'absence de dossard +Ange om kontrollen fungerar och hur den ska användas = Indiquez si le boîtier est opérationnel et comment il doit être utilisé +Ange startintervall för minutstart = Entrez l'intervalle de départ pour le départ +Ange tiden relativt klassens första start = Entrez l'écart en temps par rapport au premier départ de la catégorie. +Anm. avg. = Tarifs d'inscription +Anm. avgift = Tarif d'incription +Anm. datum = Date d'inscription +Anmäl = Entrer +Anmäl X = Entrer X pour la compétition +Anmälda = Inscriptions +Anmälda per distrikt = Inscriptions par région +Anmälningar = Inscriptions +Anmälningar (IOF (xml) eller OE-CSV) = Inscriptions (IOF (xml) ou OE-CSV) +Anmälningsavgift = Droits d'inscription +Anmälningsläge = Mode saisie rapide +Anslut = Connecter +Anslut till en server = Connexion au serveur +Ansluten till = Connecté à +Ansluter till Internet = Connexion à Internet +Anslutna klienter = Clients connectés +Anslutningar = Connexions +Anslutningsinställningar = Configuration de la connexion +Antal = Nombre +Antal besökare X, genomsnittlig bomtid Y, största bomtid Z = Nombre de visiteurs X, temps moyen perdu Y, temps max perdu Z +Antal ignorerade: X = Nombre d'inscriptions ignorées: X +Antal importerade = Nombre de données importées +Antal kartor = Nombre de cartes +Antal klasser = Nombre de catégorie +Antal löpare = Nombre de coureurs +Antal löpare på vanligaste banan X = Nombre de coureurs sur le circuit le plus utilisé: X +Antal misslyckade: X = Nombre d'inscriptions =erronnées: X +Antal startande per block = Nombre de départ par bloc +Antal startande per intervall (inklusive redan lottade) = Nombre de départs par intervalle (y compris ceux déjà [affectés]) +Antal sträckor = Nombre de branches +Antal vakanser = Nombre de vacants +Antal: %d = Nombre: %d +Antal: X = Nombre: X +Antalet rader i urklipp får inte plats i selektionen = Le nombre de ligne dans le presse-papier ne correspond pas à la sélection +Använd Eventor = Utiliser Eventor +Använd banpool = Utiliser un [pool] de circuit +Använd funktioner för fleretappsklass = Utiliser les fonctions de courses à étape +Använd första kontrollen som start = Utiliser le premier boîtier comme boîtier départ +Använd löpardatabasen = Utiliser la base des coureurs +Använd sista kontrollen som mål = Utiliser le dernier boîtier comme boîtier d'arrivée +Använd speakerstöd = Utiliser le module speaker +Använd stor font = Utiliser une grande police +Använd symbolen X där MeOS ska fylla i typens data = Utilisez le symbole X à l'emplacement où MeOS doit insérer les données +Användarnamn = Nom de l'utilisateur +Applicera för specifik sträcka = Utiliser pour un partiel spécifique +Arrangör = Organisateur +Att betala = A payer +Att betala: X = A payer: X +Automater = Services +Automatisera = Automatiser +Automatisk lottning = Tirage au sort Automatique +Automatisk skroll = Défilement automatique +Automatisk utskrift = Impression automatique +Automatisk utskrift / export = Impression / export automatique +Av MeOS: www.melin.nu/meos = Par MeOS: www.melin.nu/meos +Avancerat = Personnalisation +Avbryt = Annuler +Avgift = Frais +Avgifter = Tarifs Inscription +Avgiftshöjning (procent) = Majoration de tarif (pourcentage) +Avgjorda klasser (prisutdelningslista) = Par catégories (Liste de remise de prix) +Avgjorda placeringar - %s = Résultats définitifs - %s +Avgörande händelser = Evènement décisif +Avgörs X = Prêt à X +Avgörs kl = Prêt à +Avläsning/radiotider = Lecture des puces/radio +Avmarkera allt = Tout déselectionner +Avrundad tävlingsavgift = Droits d'inscriptions, arrondis +Avsluta = Quitter +Bad file format = Mauvais format +Bana = Circuit +Bana %d = Circuit %d +Banan används och kan inte tas bort = Le circuit est en cours d'utilisation +Banan måste ha ett namn = Le circuit doit avoir un nom +Banmall = Circuit +Banor = Circuits +Banor (antal kontroller) = Circuit (nombre de postes) +Banor för %s, sträcka %d = Circuit pour %s, partiel %d +Banor, IOF (xml) = Circuits, IOF (xml) +Banor, OCAD semikolonseparerat = Circuits, format OCAD +Banpool = [pool de circuits] +Banpool, gemensam start = [pool de circuits], départ en masse +Banpool, lottad startlista = [pool de circuits], liste de départ établie +Bantilldelning = Affectation de circuit +Bantilldelning, individuell = Affectation de circuit, course individuelle +Bantilldelning, stafett = Affectation de circuit, relais +Bantilldelningslista - %s = Circuits affectés - %s +Basintervall (min) = Intervalle de base (min) +Begränsa antal per klass = Nombre max par catégorie +Begränsa per klass = Limite par catégorie +Begränsning, antal visade per klass = Nombre maximum de coureurs par catégorie +Behandlar löpardatabasen = Traitement de la base de données des coureurs +Behandlar tävlingsdata = Traitement des compétitions +Behandlar: X = Traitement: X +Bekräfta att %s byter klass till %s = Confirmer SVP que %s passe dans la catégorie %s +Bekräfta att deltagaren har lämnat återbud = Confirmez SVP l'annulation de ce coureur +Betalat = Payé +Betalningsinformation = Détails du paiement +Bevakar händelser i X = Moniteur d'évènement X +Bevakningsprioritering = Sélectionner le coureur à surveiller +Block = Bloc +Blockbredd = Largeur de bloc +Bläddra = Parcourir +Bold = Gras +BoldHuge = Gras, géant +BoldLarge = Gras, grand +BoldSmall = Gras, petit +Bommade kontroller = Erreurs de poste +Bomtid = Temps perdu +Bomtid (max) = Temsp perdu (max) +Bomtid (medel) = Temps perdu (moyenne) +Bomtid (median) = Temps perdu (médiane) +Bomtid: X = Temps perdu: X +Bricka = Puce +Bricka %d används redan av %s och kan inte tilldelas = La puce %d est utilisé par %s et ne peut être réaffectée +Brickan redan inläst = Puce déjà lue +Brickhyra = Location de puce +Bricknummret är upptaget (X) = Puce utilisée (X) +Brickor = Puces +Bygg databaser = Création des bases de données +COM-Port = Port COM +Check = Vérifier +ClassCourseResult = Catégorie, circuit, résultats +ClassFinishTime = Catégorie, temps +ClassLength = Longueur du circuit pour la catégorie +ClassName = Catégorie +ClassPoints = Catégorie, points +ClassResult = Catégorie, résultat +ClassResultFraction = Pourcentage de la catégorie ayant terminé +ClassStartName = Nom départ +ClassStartTime = Catégorie, heure de départ, nom +ClassStartTimeClub = Catégorie, heure de départ, club +ClassTotalResult = Catégorie, résultats globaux +Club = Club +ClubName = Nom du club +ClubRunner = Club / Coureur +CmpDate = Date de la compétition +CmpName = Nom de la compétition +CourseClimb = Dénivellée circuit +CourseLength = Longueur circuit +CourseName = Nom du circuit +CourseResult = Résultat du circuit +CurrentTime = Heure actuelle +Databasanslutning = Connexion base de données +Databasvarning: X = Base de donnée, warning: X +Datorröst som läser upp förvarningar = Annonce vocales des coureurs +Datum = Date +Decimalseparator = Séparateur décimal +DefaultFont = Formattage standard +Dela = temps intermédiaires +Dela efter ranking = Temps intermédiaire par classement +Dela klass: X = Temps intermédiaires catégorie: X +Dela klassen = Temps intermédiaires par catégorie +Dela klubbvis = Temps intermédiaire par club +Deltagare = Coureurs +Deltagare %d = Coureur %d +Deltagaren 'X' deltar i patrullklassen 'Y' men saknar patrull. Klassens start- och resultatlistor kan därmed bli felaktiga = Le coureur 'X' est dans la catégorie d'équipe 'Y', mais n'a pas d'équipe. Les résultats dans cette catégorie pourraient être faussés. +Deltagaren 'X' deltar i stafettklassen 'Y' men saknar lag. Klassens start- och resultatlistor kan därmed bli felaktiga = Le coureur 'X' est dans la catégorie de relais 'Y', mais n'a pas d'équipe. Les résultats dans cette catégorie pourraient être faussés +Deltagaren 'X' saknar klass = Le coureur 'X' n'a pas de catégorie +Deltar ej = Ne participe pas +Denna etapps nummer = Numéro d'étape +Destinationskatalog = répertoire de destination +Det går endast att sätta in vakanser på sträcka 1 = Vous pouvez ajouter des places vacantes seulement sur le premier partiel +Det här programmet levereras utan någon som helst garanti. Programmet är = Ce programme est fourni tel quel, sans aucune garantie. Ce programme est +Direktanmälan = Saisie rapide +Disk. = Disq. +Distriktskod = Code de la Ligue +Don't know how to align with 'X' = Impossible d'aligner avec 'X' +Du kan importera banor och klasser från OCADs exportformat = Vous pouvez importer des circuits et des catégories à partir d'un fichier exporté par OCAD +Du måste välja en klass = Vous devez choisir une catégorie +Duplicera = Dupliquer +E-post = Courriel +Efter = Après +Efteranm. avg. = Frais inscription tardives +Efteranmälda (efter ordinarie) = Inscriptions tardives (Après) +Efteranmälda (före ordinarie) = Inscriptions tardives (Avant) +Efteranmälda före ordinarie = Inscriptions tardives en premier +Efteranmälningar = Inscriptions tardives +Egen listrubrik = En-tête personnalisée +Egen text = Texte personnalisé +Egenskaper = Propriétés +Eget fönster = Nouvelle fenêtre +Egna listor = Listes personnalisées +Ej accepterade elektroniska fakturor = factures électronique refusées +Ej elektronisk = Pas électronique +Ej lottade = Pas tiré au sort +Ej lottade, efter = Tirés au sort restant après +Ej lottade, före = Tirés au sort restant avant +Ej start = Non partant +Ej tidtagning = non chronométré +Ekonomisk sammanställning = Synthèse financière +Elektronisk = Electronique +Elektronisk godkänd = Accepté électroniquement +Elit = Elite +Elitavgift = Frais d'inscription pour les Elites +Elitklasser = Catégorie Elite +En gafflad sträcka = Un embranchement +En klass kan inte slås ihop med sig själv = Vous ne pouvez pas fusionner une catégorie avec elle-même +En klubb kan inte slås ihop med sig själv = Un club ne peut pas fusionner avec lui-même +Endast en bana = Circuit individuel +Enhetstyp = Type d'unité +Etapp = Etape +Etapp X = Etape X +Etappresultat = Résultats des étapes +Eventorkoppling = Connexion à Eventor +Export av resultat/sträcktider = Export résultats / temps intermédiaires +Exportera = Export +Exportera / Säkerhetskopiera = Export / Backup +Exportera alla till HTML = Exporter tout en HTML +Exportera datafil = Export des données +Exportera elektroniska fakturor = Exporter les factures électroniques +Exportera inställningar och löpardatabaser = Export de la configuration et des bases de données +Exportera löpardatabas = Export de la base des coureurs +Exportera nu = Exporter maintenant +Exportera på fil = Exporter dans un fichier +Exportera resultat på fil = Exporter les resultats dans un fichier +Exportera startlista på fil = Exporter les listes de départ dans un fichier +Exportera sträcktider = Export des temps intermédiaires +Exportera tävlingsdata = Export des données +Externt Id = Identifiant externe +Extra = Extra +Extra stämplingar = Poinçons supplémentaires +Extralöparstafett = [Co-runner relay] +FAKTURA = FACTURE +FEL, inget svar = Erreur, pas de réponse +FEL: Porten kunde inte öppnas = Error: le port ne peut pas être ouvert +Failed to generate card = Impossible de générer la puce[Failed to generate card] +Failed to open 'X' for reading = Echec de l'ouverture de 'X' en lecture +Faktiskt startdjup: X minuter = Durée des départs: X minutes +Faktura = Facture +Faktura nr = Facture n° +Faktureras = A facturer +Fakturor = Factures +Fel: X = Erreur: X +Fel: hittar inte filen X = Erreur. Fichier 'X' non trouvé +Felaktig kontroll = Mauvais poinçon +Felaktig nyckel = Clef incorrecte +Felaktig sträcka = Numéro de relayeur incorrect +Felaktigt filformat = Format de fichier incorrect +Felst. = PM +Fil att exportera till = Fichier à exporter vers +Fil: X = Nom de fichier: X +Filnamn = Nom de fichier +Filnamn (OCAD banfil) = Nom de fichier (circuitx OCAD) +Filnamn IOF (xml) med klubbar = Nom de fichier IOF (xml) avec clubs +Filnamn IOF (xml) med löpare = Nom de fichier IOF (xml) avec coureurs +Filnamnet får inte vara tomt = Le nom de fichier ne peut être vide +Filter = Filtrage +FilterHasCard = Avec puce +FilterNoCard = Sans puce +FilterNotVacant = Sans vacant +FilterOnlyVacant = Uniquement les vacants +FilterRentCard = Puce louée +FilterResult = Avec résultats +FilterStarted = A démarré +Filtrering = Filtrage +FinishTime = Heure d'arrivée, nom +Flera banor = Multi circuits +Flera banor / stafett / patrull / banpool = Multi circuits/ Relais / Patrouille / [Pool circuits] +Flera banor/stafett = Multi circuits / Relais +Flytta höger = Vers la droite +Flytta vänster = Vers la gauche +Format = Format +Formaterat webbdokument (html) = Document web (html) +Formateringsregler = Règles de formattage +Formulärläge = Mode formulaire +Fortsätt = Continue +Fri anmälningsimport = Inscriptions en format libre +Fri starttid = heure de départ libre +Fria starttider = heures de départ libres +Från kontroll = Du poste +Fullskärm = Plein écran +Funktioner = Fonctions +Födelseår = Année de naissance +Följande deltagare deltar ej = Les coureurs suivants ne participeront pas +Följande deltagare har bytt klass = Les coureurs suivants ont changé de catégorie +Följande deltagare har bytt klass (inget totalresultat) = Les coureurs suivants ont changé de catégorie (pas de résultat total) +Följande deltagare har tilldelats en vakant plats = Les coureurs suivants ont pris une place vacante +Följande deltagare är anmälda till nästa etapp men inte denna = Les coureurs suivants sont enregistrés pour l'étape suivante mais pas celle-ci +Följande deltagare är nyanmälda = Les coureurs suivants générès de nouvelles inscriptions +Följande deltagare överfördes ej = Les coureurs suivant ont été ignorés +För att ändra måltiden måste löparens målstämplingstid ändras = Pour modifier le temps de course, l'heure de poinçonnage de l'arrivée doit être changée +För muspekaren över en markering för att få mer information = Survoler avec le pointeur de la souris une zone pour obtenir plus d'information +För många kontroller = Trop de contrôles +Förbered lottning = Préparation du tirage au sort +Fördefinierade tävlingsformer = Compétitions prédéfinies +Fördela starttider = attribution des heures de départ +Föregående = Précédent +Föregående etapp = Etape précédente +Förhandsgranskning, import = Prévisualisation de l'import +Förhöjd avgift = Frais supplémentaires +Först-i-mål, gemensam = Du premier au dernier, commun +Först-i-mål, klassvis = Du premier au dernier, par catégorie +Första (ordinarie) start = Premier départ (ordinaire) +Första kontrollen = Premier contrôle +Första omstartstid = [First time for restart] +Första ordinarie starttid = Première heure de départ normale +Första start = Premier départ +Första starttid = Premier horaire de départ +Första sträckan kan inte vara parallell = Le premier partiel ne peut pas être dédoublé +Försöket misslyckades = L'opération a échoué +Förvarning på (SI-kod): alla stämplingar = Pré-warning (code SI): tous les poinçons +Förvarningsröst = Pré-warning Voix +Förväntad andel efteranmälda = Pourcentage d'inscriptions tardives attendu +Gata = Rue +Gemensam start = Départ en masse +Generera = Générer +Generera testtävling = Générer une compétition de test +Genererad = Généré à +Geografisk fördelning = Répartition géographique +Global sorteringsordning = Ordre de tri global +Godkänd API-nyckel = Clef API acceptée +Granska inmatning = Prévisualisation +Grund avg. = Tarifs de base +Grundavgift = Tarif de base +Grundinställningar = Configuration de base +Hantera brickor = Gestion des puces +Hantera flera etapper = Gestion courses à étapes +Hantera jaktstart = Gestion départ en chasse +Hantera klubbar och ekonomi = Gestion des clubs et du paiement +Hantera kvar-i-skogen = Gestion des coureurs non rentrés +Hantera löparbrickor = Gestion des puces +Hemsida = Site web +Hjälp = Aide +Hoppar över stafettklass: X = Sauter la catégorie de relais: X +Huvudlista = Liste principale +Hyravgift = Tarif de Location +Hyrbricka = Puces louées +Hyrbricksrapport = Rapport avec puces louées +Hyrbricksrapport - %s = Puces louées - %s +Hyrd = Louée +Hämta (efter)anmälningar från Eventor = Rechercher les enregistrements récents dans Eventor +Hämta data från Eventor = Rechercher des données dans Eventor +Hämta efteranmälningar = Rechercher les enregistrements récents +Hämta löpardatabasen = Recherche dans la base des données des coureurs +Hämta svar om elektroniska fakturor = Données des factures acceptées +Hämta tävlingsdata = Recherche des données en rapport avec la compétition +Hämta tävlingsdata för X = Recherche des données en rapport pour la compétition X +Hämtar anmälda = Recherche des inscriptions +Hämtar information om = Rassemblement d'information à propos de +Hämtar klasser = Recherche de catégories +Hämtar klubbar = Recherche de clubs +Hämtar löpardatabasen = Recherche dans la base des coureurs +Hämtar tävling = Recherche d'une compétition +Händelser = Evènement +Händelser - tidslinje = Evènement - Chronologie +Hög avgift = Frais d'inscription tardive +IOF (xml) = IOF (xml) +IOF Resultat (xml) = Résultats IOF (xml) +IOF Resultat, version 2.0.3 (xml) = Résultats IOF, version 2.0.3 (xml) +IOF Resultat, version 3.0 (xml) = Résultats IOF, version 3.0 (xml) +IOF Startlista (xml) = Horaires de départ IOF (xml) +IOF Startlista, version 3.0 (xml) = Horaires de départ IOF, version 3.0 (xml) +IOF Startlista, version 2.0.3 (xml) = Horaires de départ IOF, version 2.0.3 (xml) +IOF Löpardatabas, version 3.0 (xml) = Base de données des coureurs IOF, version 3.0 (xml) +IOF Klubbdatabas, version 3.0 (xml) = Base de données des clubs IOF, version 3.0 (xml) +IP-adress eller namn på en MySQL-server = Adresse IP ou nom d'un serveur MySQL +Id = Id +Identifierar X unika inledningar på banorna = Identification X ouvertures unique des circuits +Importera = Import +Importera IOF (xml) = Import IOF (xml) +Importera anmälningar = Importation des inscriptions +Importera banor = Importation des circuits +Importera banor/klasser = Importation des circuits/catégories +Importera en tävling från fil = Importer une compétition +Importera fil = Importation d'un fichier +Importera från OCAD = Import depuis OCAD +Importera från fil = Import depuis un fichier +Importera löpardatabas = Import de la base des coureurs +Importera löpare = Import des coureurs +Importera löpare och klubbar / distriktsregister = Import des coureurs et des clubs +Importera stämplingar = Import des poinçons +Importera tävling = Importer une compétition +Importera tävlingsdata = Import des données +Importerar = En cours d'importation +Importerar OCAD csv-fil = Importation OCAD CSV +Importerar OE2003 csv-fil = Importation OE2003 CSV +Importerar OS2003 csv-fil = Importation OS2003 CSV +Importerar anmälningar (IOF, xml) = Importation des inscriptions (IOF, xml) +Importerar banor (IOF, xml) = Importation des circuits (IOF, xml) +Importerar klasser (IOF, xml) = Importation des catégories (IOF, xml) +Importerar klubbar (IOF, xml) = Importation des clubs (IOF, xml) +Importerar tävlingsdata (IOF, xml) = Importation des données de compétition(IOF, xml) +Importerbara = Importable +Index = Index +Individuell = par catégorie +Individuell resultatlista, alla lopp = liste de résultat par nom, toute les courses +Individuell resultatlista, sammanställning av flera lopp = liste de résultat par nom, résumé +Individuell resultatlista, visst lopp = liste de résultat par nom, specifique +Individuell resultatlista, visst lopp (STOR) = liste de résultat par nom, specifique (GRAND) +Individuell startlista, visst lopp = Liste de départ par nom, spécifi +Individuella deltagare = Coureurs individuels +Individuella slutresultat = Résultats finaux individuels +Individuella totalresultat = Résultats totaux individuels +Info = Information +Inga = Aucun +Inga deltagare = Pas de coureurs +Inga vakanser tillgängliga. Vakanser skapas vanligen vid lottning = Aucun vacant disponible. Les vacants sont généralement créés quand on tire au sort les horaires des catégories +Ingen = aucun +Ingen bana = aucun circuit +Ingen deltagare matchar sökkriteriet = Aucun coureur ne répond aux critères de recherche +Ingen klass = Pas de catégorie +Ingen klass vald = Pas de catégorie sélectionnée +Ingen löpare saknar bricka = tous les coureurs ont une puce +Ingen matchar 'X' = Aucune correspondance pour 'X' +Ingen rogaining = Pas de course au score +Inkommande = Nouveautés +Inläst bricka ställd i kö = La puce a été mise en file d'attente +Inlästa brickor = Lecture de puces +Inmatning av mellantider = Entrez les temps intermédiaires +Inspekterar klasser = Visualisation des catégories +Installera = Installation +Inställningar = Configuration +Inställningar MeOS = Configuration de MeOS +Interaktiv inläsning = Lecture interactive +Intervall = Intervalle +Intervall (sekunder). Lämna blankt för att uppdatera när tävlingsdata ändras = Intervalle (secondes). Laisser vide pour une mise à jour quand les données de la course changent. +Intervallet måste anges på formen MM:SS = L'intervalle doit être de la forme MM:SS +Italic = Italique +ItalicMediumPlus = Italique, un peu plus grand +Jag sköter lottning själv = Je gère le tirage des horaires de départ moi-même +Jaktstart = Départ en chasse +Justera blockvis = Ajustement du bloc +Justera mot = Aligner avec +Klart = Terminé +Klart. Antal importerade: X = Terminé. Nombre d'inscriptions importées : X +Klart. X deltagare importerade = Terminé. X coureurs importés +Klart. X lag importerade = Terminé. X équipes importées +Klart. X patruller importerade = Terminé. X patrouille importées +Klart: alla klasser lottade = Tirage de toutes les catégories terminé +Klart: inga klasser behövde lottas = Terminé:aucune catégorie ne necessite un nouveau tirage +Klass = Catégorie +Klass %d = Catégorie %d +Klass saknad = Catégorie absente +Klass / klasstyp = Catégorie / Type +Klass att slå ihop = Catégories à fusionner +Klassbyte = Modifier la catégorie +Klassen 'X' har jaktstart/växling på första sträckan = La catégorie 'X' a une chasse/variation sur le premier partiel +Klassen används och kan inte tas bort = La catégorie est utilisée et ne peut être supprimée +Klassen lottas inte, startstämpling = Poinçon de départ uniquement +Klassen måste ha ett namn = La catégorie doit avoir un nom +Klassens bana = Circuit de la catégorie +Klasser = Catégories +Klasser (IOF, xml) = Catégories (IOF, xml) +Klasser där nyanmälningar ska överföras = Catégories dans laquelle les nouvelles inscriptions vont être transferrées +Klassinställningar = Configuration des catégories +Klassnamn = Nom de la catégorie +Klasstyp = Type de la catégorie +Klientnamn = Nom du client +Klistra in = Coller +Klistra in data från urklipp (X) = Coller depuis le presse papier (X) +Klocktid: X = Heure courante: X +Klubb = Club +Klubb att ta bort = Club à supprimer +Klubb: X = Club: X +KlubbId = Id du Club +Klubbar = Clubs +Klubbar (IOF, xml) = Clubs (IOF, xml) +Klubbar som inte svarat = Clubs qui n'ont pas répondu +Klubbdatabasen = Base de données des clubs +Klubblös = Pas de club +Klubbresultat = par club +Klubbresultatlista = Résultats par club +Klubbresultatlista - %s = Résultats par club - %s +Klubbstartlista = par club +Klubbstartlista - %s = Horaire de départ par club - %s +Klungstart = Départs groupés +Knyt löpare till sträckan = Affecter un coureur à une variation +Knyt löparna till banor från en pool vid målgång = Rattacher un coureur à une course lors de la lecture +Kom ihåg listan = Mémoriser la liste +Kommentar / version = Commentaire / Version +Kommunikation = Communication +Kontant = Espèces +Kontant betalning = Espèces +Konto = Compte +Kontroll = Poste +Kontroll %s = Poste %s +Kontroll X = Poste X +Kontroll inför tävlingen = Vérifier la compétition +Kontrollen används och kan inte tas bort = Le poste est utilisé et ne peut être retiré +Kontrollens ID-nummer = Numéro du poste +Kontroller = Postes +Kontrollnamn = Nom du poste +Kopia X = Copier X +Kopiera länken till urklipp = Copier le lien +Kopiera selektionen till urklipp (X) = Copier la sélection (X) +Koppla ifrån = Déconnecter +Koppla ner databas = Déconnexion de la base de données +Kopplar ifrån SportIdent på = Déconnexion du boîtier SPORTident sur +Kortast teoretiska startdjup utan krockar är X minuter = La plus petite durée de départs sans collision est X minutes +Kortnamn = Nom court +Kunde inte ansluta till Eventor = Connexion à Eventor impossible +Kunde inte ladda upp tävlingen (X) = Echec lors de la remonté de la compétition (X) +Kvar-i-skogen = Coureurs restants +Kvinna = Femme +Kvinnor = Femmes +Källkatalog = Répertoire source +Kön = Sexe +Kör kontroll inför tävlingen = Vérification de la compétition +Ladda upp öppnad tävling på server = Upload de la compétition sur le serveur +Lag = Equipe +Lag %d = Equipe %d +Lag(flera) = Equipes +Laget 'X' saknar klass = L'équipe 'X' n'a pas de catégorie +Laget hittades inte = Equipe non trouvée +Lagnamn = Nom de l'équipe +Lagrade säkerhetskopior = Copies sauvergardées +Land = Pays +LargeFont = Texte en grand +Latitud = Latitude +Lista = Liste +Lista av typ 'X' = Liste du type 'X' +Lista med mellantider = Liste avec temps partiels +Lista med sträcktider = Liste avec temps partiels +Listan kan inte visas = Affichage de la liste impossible +Listegenskaper = Liste des propriétés +Listnamn = Nom de la liste +Listor = Listes +Listor och sammanställningar = Listes et résumés +Listpost = Entrée de liste +Listredigerare = Editeur de liste +Listredigerare – X = Editeur de liste – X +Listrubrik = Titre de liste +Listtyp = Type de liste +Listval = Choix de liste +Ljudfiler, baskatalog = Répertoire de base des fichiers sonores +Lokalt = Localement +Longitud = Longitude +Lopp %d = Course %d +Lopp %s = Course %s +Lopp X = Course X +Lotta = Tirage +Lotta / starttider = Tirage / Gestion des horaires de départ +Lotta flera klasser = Tirage de plusieurs catégories +Lotta klassen = Tirage de la catégorie +Lotta klassen X = Tirage de la catégorie 'X' +Lotta löpare som saknar starttid = Tirage des coureurs sans horaire de départ +Lotta om hela klassen = Retirage de la catégorie +Lottad = Tirage effectué +Lottad startlista = Horaires de départ tirés +Lottar efteranmälda = Tirage des inscriptions tardives +Lottar: X = Tirage des heures de départ: X +Lottning = Tirage aléatoire +Lyssna = Ecouter +Lägg till = Ajouter +Lägg till alla = Tout ajouter +Lägg till en ny rad i tabellen (X) = Ajout d'une ligne à la table (X) +Lägg till klasser = Ajout / modification des catégories +Lägg till ny = Ajouter nouveau +Lägg till ny etapp = Ajouter une nouvelle étape +Lägg till rad = Ajouter ligne +Lägg till stämpling = Ajouter le poinçon +Lägger till klubbar = Ajout de club +Lägger till löpare = Ajout de participants +Längd (m) = Distance (m) +Länk till resultatlistan = Lien vers les résultats +Länk till startlistan = Lien vers les listes de départr +Läs brickor = Lecture de puce +Läser klubbar = Lecture de clubs +Läser löpare = Lecture de coureurs +Långt namn = Nom long +Låt klassen ha mer än en bana eller sträcka = Autoriser la catégorie à avoir plus d'une variation ou d'un circuit +Löpande information om viktiga händelser i tävlingen = Obtenir des notifications pour les évènements de la compétition +Löparbricka %d = Puce % +Löpardatabasen = Base de données coureurs +Löpare = Coureur +Löpare saknar klass eller bana = Coureur sans catégorie ou circuit +Löpare som förekommer i mer än ett lag = Coureur figurant dans plus d'une équipe +Löpare utan SI-bricka: %d = Coureurs sans puce: %d +Löpare utan bana: %d = Coureurs sans circuit: %d +Löpare utan klass: %d = Coureurs sans catégorie: %d +Löpare utan klubb: %d = Coureurs sans club: %d +Löpare utan starttid: %d = Coureurs sans horaire de départ: %d +Löpare, Ej Start, med registrering (kvar-i-skogen!?) = Coureurs inscrits non partants (en forêt ?) +Löpare, Status Okänd, med registrering (kvar-i-skogen) = Coureurs inscrits avec statut inconnu (en forêt) +Löpare, Status Okänd, som saknar registrering = Coureurs non enregistrés avec statut inconnu +Löpare: = Coureurs: +Löpare: X, kontroll: Y, kl Z = Coureur: X, poste: Y, temps: Z +Löparen hittades inte = Coureur non trouvé +Löptid = Temps de course +Lösenord = Mot de passe +Man = Homme +Manuell lottning = Tirage manuel +Manuella avgifter = Frais d'inscription manuels +Mata in första nummerlappsnummer, eller blankt för att ta bort nummerlappar = Entrer le premier numéro de dossard, ou laisser vide pour supprimer le dossard +Mata in radiotider manuellt = Saisir le temps de passage radio manuellement +Max antal gemensamma kontroller = Nombre max de contrôles communs +Max parallellt startande = Nombre max de départs en parallèles +Max. vakanser (per klass) = Nombre max de vacants (par catégorie) +Maximal tid efter ledaren för att delta i jaktstart = Temps max après le leader pour participer au départ en chasse +Maxtid = Temps max +Maxtid efter = Temps max après +MeOS = MeOS +MeOS lokala datakatalog är = Le répertoire local des données MeOS est +MeOS – Resultatkiosk = MeOS – Diffusion des résultats +Med stafettklasser = Avec relais +Med sträcktidsanalys = Avec analyse des temps intermédiaires +MediumFont = Texte moyen +MediumPlus = Texte un peu plus grand +Medlöpare = Co-compétiteur +Mellantider visas för namngivna kontroller = Les temps intermédiaires sont affichés pour les contrôles nommés +Metod = Méthode +Min. vakanser (per klass) = Nombre min. de vacant (par catégorie) +Minitid = Temps min. +Minst MySQL X krävs. Du använder version Y = MeOS nécessite MySQL X ou plus récent. Vous utilisez la version Y +Minsta intabbning = Indentation minimale +Minsta intervall i klass = Plus petit intervalle dans la catégorie +Minsta startintervall = Plus petit intervalle de départ +Minsta sträcktid = Partiel le plus court +Minutstartlista = par heures de départ +Motion = Exercice +Multipel = Multiple +MySQL Server / IP-adress = Serveur MySQL / adresse IP +Män = Hommes +Mål = Arrivée +Målstämpling saknas = Poinçon d'arrivée manquant +Måltid = Heure d'arrivée +Måltid saknas = Heure d'arrivée manquante +Måltid: X = heure d'arrivée: X +Namn = Nom +Nationalitet = Nationalité +Nollställ avgifter = RAZ des frais d'inscription +Nollställ databaser = RAZ base de données +Nollställde avgift för X deltagare = Effacement des droits d'inscription pour X competiteur(s) +Nolltid = Heure zéro +None = Aucun +Normal = Normal +NormalFont = Texte normal +Normalavgift = Frais normaux +Not implemented = Non implémenté +Nr = Nombre +Nummerlapp = Dossard +Nummerlappar = Dossards +Nummerlappar i X = Dossards pour X +Nuvarande innehavare: X = Détenteur : X +Ny bana = Nouveau circuit +Ny deltagare = Nouveau coureur +Ny klass = Nouvelle catégorie +Ny klubb = Nouveau club +Ny kontroll = Nouveau poste +Ny lista = Nouvelle liste +Ny tävling = Nouvelle compétition +Nyckel för Eventor = Clef Eventor +Nytt fönster = Nouvelle fenêtre +Nytt lag = Nouvelle équipe +Nästa = Suivant +Nästa etapp = Prochaine étape +Nästa försök = Nouvel essai +OE Semikolonseparerad (csv) = OE (csv) +OK = OK +Ogiltig banfil. Kontroll förväntad på position X, men hittade 'Y' = Fichier de course invalide. Un numéro de poste était attendu à la position X, mais 'Y' a été trouvé +Ogiltig föregående/efterföljande etapp = Etape précédente/suivante invalide +Ogiltig första starttid. Måste vara efter nolltid = Heure du premier départ invalide. Doit être postérieure à l'heure zéro +Ogiltig omstartstid = Heure de nouveau départ invalide +Ogiltig repdragningstid = Temps de corde invalide [Invalid rope time] +Ogiltig starttid i 'X' på sträcka Y = Heure de départ dans 'X' invalide pour le relayeur Y +Ogiltig starttid: X = Heure de départ invalide: X +Ogiltig tid = Heure invalide +Ogiltigt bricknummer X = Numéro de puce invalide X +Ogiltigt filformat = Format de fichier invalide. +Okänd bricka = Puce inconnue +Okänd funktion = Mode inconnu +Okänd klass = Catégorie inconnue +Okänd klubb med id X = Club avec identifiant X inconnu +Om MeOS = A propos de MeOS +Om MeOS – ett Mycket Enkelt OrienteringsSystem = A propos de MeOS – un logiciel de CO nettement plus simple +Omstart = Redémarrage +Omstart i stafettklasser = Redémarrage du relais +Omstartstid = Heure de redémarrage +Omvänd jaktstart = Chasse inversée +Oparad = Non apairés +Operationen misslyckades = Echec de l'opération +Operationen stöds ej = Opération non supportée +Optimerar startfördelning = Optimisation de la distribution des horaires de départ +Ordinarie anmälningsdatum = Date de dernière inscription +Ordinarie avgift = Frais d'inscription normaux +Organisation = Organisation +Oväntad kontroll 'X' i bana Y = Poste 'X' non prévu dans le circuit Y +Packar upp löpardatabas = Expension de la base des coureurs +Par- eller singelklass = Catégorie pour patrouille ou individuel +Para ihop = Apairage +Para ihop bricka X med en deltagare = Association de la puce X avec un coureur +Parallell = Parallèle +PatrolClubNameNames = Clubs des coureurs (ou de la patrouille) +PatrolNameNames = Noms des coureurs (ou de la patrouille) +Patrull = Patrouille +Patrull, 1 SI-pinne = Patrouille, une puce +Patrull, 2 SI-pinnar = Patrouille, deux puces +Personer = Personnes +Plac. = Place +Placering in = Place dans +Plats = Place +Port = Port +Port för TCP = Port TCP +Postadress = Adresse postale +Postkod = Code postal +Poäng = Points +Poäng in = Points dans +Poängavdrag (per minut) = Point de pénalité (par minute) +Poängavdrag per påbörjad minut = Point de pénalité pour toute minute entamée +Poänggräns = Limite en points +Prel. bomtid = Temps perdu (prélim.) +Prel. placering = Place (prélim.) +Prioritering = Prioritisation +Prisutdelningslista = Résultats pour la remise des prix +Programinställningar = Configuration du programme +Prolog + jaktstart = Prologue + chasse +Publicera resultat = Publication des résultats +Publicera resultat och sträcktider på Eventor och WinSplits online = Publication des résultats et des temps intermédiaires sur Eventor et WinSplits en ligne +Publicera startlista = Publication des horaires de départ +Publicera startlistan på Eventor = Publication des horaires de départ sur Eventor +Publicerar resultat = Publication des résultats +Publicerar startlistan = Publication des horaires de départ +PunchNamedTime = temps intermédiaires nommés +PunchTime = Heure de poinçonnage +Punches = Poinçons +Radera = Supprimer +Radera listan från aktuell tävling = Supprimer la liste de cette compétition +Radera starttider = Effacer les heures de départ +Radera tävlingen = Supprimer la compétition +Radera vakanser = Supprimer les vacants +Radiotider, kontroll = Heures radio, poste +Ranking = Classement +Ranking (IOF, xml) = Classement (IOF, xml) +Rapport inför = Rapport pour +Rapporter = Rapports +Rapportläge = Mode rapport +Red. avg. efteranm = Retardat. réduit +Red. avgift = Réduit +Redigera deltagaren = Editer le coureur +Redigera lista = Editer la liste +Redigera listpost = Editer une entrée dans la liste +Reducerad avg = Frais d'inscription réduits +Reduktionsmetod = Méthode de réduction +Region = Region +Relativ skalfaktor för typsnittets storlek i procent = Facteur d'échelle pour la police (pourcentage) +Rep = Corde +Reparera vald tävling = Réparer la compétition sélectionnée +Reparerar tävlingsdatabasen = Réparation de la base de données de la compétition +Repdragningstid = Heure de corde [Rope time] +Repdragningstiden måste ligga före omstartstiden = L'heure de corde doit précéder l'heure des re-départs +Reserverade = Réservé +Resultat = Résultat +Resultat && sträcktider = Résultat && temps intermédiaires +Resultat (STOR) = Résultats (GRAND) +Resultat - %s = Résultats - %s +Resultat - X = Résultats - X +Resultat banvis per klass = Résultat circuit-wise par catégorie +Resultat efter klass och bana - X = Résultats par catégorie et circuit - X +Resultat efter sträcka %d = Résultats après le relayeur %d +Resultat efter sträckan = Résultats après le relayeur +Resultat för ett visst lopp = Résultats pour une course donnée +Resultat lopp X - Y = Résultats pour la course X - Y +Resultat per bana = Résultats par circuit +Resultat per bana - X = Résultats par circuit - X +Resultat, generell = Résultats général +Resultat, individuell = Résultats individuel +Resultat, patrull = Résultats, patrouille +Resultatkiosk = Résultats kiosque [Kiosk] +Resultatlista - %s = Résultats - %s +Resultatlista – inställningar = Résultats – configuration +Resultatlistor = Résultats +Resultatutskrift = Imprimer les résultats +Resultatutskrift / export = Imprimer / Exporter les résultats +Rogaining = Course au score +Rogaining, individuell = Course au score indivduelle +Rogaining-poäng = Points (course au score) +RogainingPunch = Poinçon (course au score) +Rubrik = Titre +Rulla upp och ner automatiskt = Défillement vertical automatique +Runner = Coureur +RunnerBib = Dossard du coureur +RunnerCard = Puce du coureur +RunnerClassCoursePlace = Classement dans la catégorie pour le circuit +RunnerClassCourseTimeAfter = Retard dans la catégorie pour le circuit +RunnerClub = Club du coureur +RunnerCompleteName = Nom complet du coureur +RunnerCourse = Circuit du coureur +RunnerFamilyName = Nom de famille du coureur +RunnerFinish = Heure d'arrivée du coureur +RunnerGivenName = Prénom du coureur +RunnerLegNumberAlpha = Numéro de relais exact du coureur +RunnerLegNumber = Numéro de relais groupé du coureur +RunnerName = Nom du coureur +RunnerPlace = Place du coureur +RunnerPlaceDiff = Différence de place du coureur +RunnerRank = Classement du coureur +RunnerRogainingPoint = Points de la course au score +RunnerStart = Heure de départ du coureur +RunnerStartNo = Numéro de départ du coureur +RunnerTempTimeAfter = Temps du coureur après le poste sélectionné +RunnerTempTimeStatus =Temps/statut du coureur au poste sélectionné +RunnerTime = Temps du coureur +RunnerTimeAfter = Retard du coureur +RunnerTimeAfterDiff = Différence de retard du coureur +RunnerTimeLost = Temps perdu par le coureur +RunnerTimePlaceFixed = Instant à partir duquel la place du coureur n'a plus évolué +RunnerTimeStatus = Temps/statut du coureur +RunnerTotalPlace = Place consolidée du coureur +RunnerTotalTime = Temps consolidé du coureur +RunnerTotalTimeAfter = Retard consolidé du coureur +RunnerTotalTimeStatus = Temps / statut consolidé du coureur +RunnerUMMasterPoint = Master points Uppsala möte +SI X inläst. Brickan tillhör Y som saknar klass = La puce X a été lue. La puce appartientt à Y, qui n'a pas de catégorie +SI X inläst. Brickan är inte knuten till någon löpare (i skogen) = La puce X a été lue. La puce est associé à aucun coureur (en forêt) +SI X är redan inläst. Använd interaktiv inläsning om du vill läsa brickan igen = La puce X a déjà été lue. Utiliser la lecture interactive pour la relire. +SI X är redan inläst. Ska den läsas in igen? = La puce X a déjà été lue. La relire ? +SI på = SI en marche +SI-dubbletter: %d = SI dupliqué: %d +SOFT-avgift = Frais d'inscription SOFT [SOFT fee] +SOFT-lottning = Méthode de tirage suédoise +Saknad starttid = Heurede départ manquante +Sammanställning = Résumé +Sammanställning, ekonomi = Résumé financier +Sammanställning, klasser = Résumé des catégories +Samtliga deltagare tilldelades resultat = Tous les coureurs ont un résultat +Seedad lottning = Tirage au sort +Sekundär typ = Type secondaire +Selektionens storlek matchar inte urklippets storlek. Klistra in i alla fall? = La taille de la sélection ne correspond pas au contenu du presse-papier. Coller tout de même ? +Semikolonseparerad (csv) = Fichier (csv) +Sen avgift = Retardat. +Sen red. avgift = Ret. réduit +Server = Serveur +Server: [X] Y = Serveur: [X] Y +Sidbrytning mellan klasser = Saut de page +Sidbrytning mellan klasser / klubbar = Saut de page entre catégories / clubs +Simulera inläsning av stämplar = Simuler la lecture de puce +Sista betalningsdatum = Paiements dus +Sista ordinarie anmälningsdatum = Date limite d'inscription au tarif normal +Sista start (nu tilldelad) = Dernier départ (affecter maintenant) +Sista start (nu tilldelad): X = Dernier départ (affecté): X +Sista sträckan = Dernier relais +Ska X raderas från tävlingen? = Voulez vous retirer X de la compétition ? +Skalfaktor = Facteur d'échelle +Skapa en ny tävling med data från Eventor = Créer une nouvelle compétition à partir des données de Eventor +Skapa en ny, tom, tävling = Créer une nouvelle compétition vide +Skapa fakturor = Générer les factures +Skapa generell lista = Créer la liste générale +Skapa listan = Créer la liste +Skapa ny klass = Créer une nouvelle catégorie +Skapad av = Créé par +Skapade en bana för klassen %s med %d kontroller från brickdata (SI-%d) = Un circuit pour la catégorie %s avec %d poste dans la puce %d aété créée. +Skapade en lokal kopia av tävlingen = Copie locale de la compétition créée +Skapar ny etapp = Créer une nouvelle étape +Skapar ny tävling = Création d'une nouvelle compétition +Skapar saknad klass = Catégorie manquante créée +Skattad avgift = Frais d'inscription taxable +Skippar lottning = Ignorer le tirage au sort +Skript = Script +Skript att köra efter export = Script à exécuter après l'export +Skriv endast ut ändade sidor = Imprimer uniquement les pages modifiées +Skriv första bokstaven i klubbens namn och tryck pil-ner för att leta efter klubben = Entrer les premières lettres du nom du club et appuyer sur flèche bas pour trouver le club +Skriv första starttid på formen HH:MM:SS = Ecrire la première heure de départ au format HH:MM:SS +Skriv ut = Imprimer +Skriv ut alla = Tout imprimer +Skriv ut dem utan e-post = Imprimer tous les courriels manquants +Skriv ut ej accepterade elektroniska = Imprimer tout ce qui n'est pas encore accepté +Skriv ut eller exportera listan automatiskt = Imprimer ou exporter la liste automatiquement +Skriv ut fakturan = Imprimer les factures +Skriv ut listan = Imprimer la liste +Skriv ut nu = Imprimer maintenant +Skriv ut rapporten = Imprimer le rapport +Skriv ut sträcktider = Temps intermédiaires +Skriv ut tabellen = Imprimer la table +Skriv ut tabellen (X) = Imprimer la table (X) +Skriv över existerande bricknummer? = Ecraser le numéro de puce existant ? +Skrivare = Imprimante +Skrivarinställningar för sträcktider = Configuration de l'imprimante +Skriver sträcktider om = Impression dans +Slutresultat = Résultats finaux +Slå ihop = Fusionner +Slå ihop klass: X = Fusionner la catégorie: X +Slå ihop klass: X (denna klass behålls) = Fusionner la catégorie avec X (conserver cette catégorie) +Slå ihop klasser = Fusionner les catégories +Slå ihop klubb = Fusionner le club +SmallFont = Petit texte +SmallItalic = Texte en petit et italique +Snabbinställningar = Configuration rapide +SortNameOnly = Nom +Sortering = Tri +Sortering: %s, antal rader: %d = Tri: %s, nombre de ligne: %d +Spara = Enregistrer +Spara anmälningar = Enregistrer les inscriptions +Spara den här listan som en favoritlista = Enregistrer cette liste comme favori +Spara fil = Enregistrer le fichier +Spara för webben = Enregistrer le document web +Spara i aktuell tävling = Enregistrer dans cette compétition +Spara som = Enregistrer sous +Spara som fil = Enregistrer le fichier sous +Spara sträcktider till en fil för automatisk synkronisering med WinSplits = Enregistrer les temps intermédiaires pour synchronisation automatique avec WinSplits +Sparade listval = Listes enregistrées +Speaker = Speaker +Speakerstöd = Module Speaker +SportIdent = SPORTident +Språk = Langue +Stad = Ville +Stafett = Relais +Stafett (sammanställning) = Relais (résumé) +Stafett - sammanställning = Relais - résumé +Stafett - sträcka = Relais - relayeur +Stafett - total = Relais - total +Stafettklasser = Catégories pour le relais +Stafettresultat, delsträckor = Résulats du relais, detail relayeurs +Stafettresultat, lag = Résulats du relais, équipe +Stafettresultat, sträcka = Résulats du relais, par relayeur +Stafettresultat, sträcka (STOR) = Résulats du relais, par relayeur (GRAND) +Start = Départ +Start nr = Départ no. +StartTime = Neure de départ, nom +StartTimeForClass = Heure de départ commune, catégorie +Starta = Départ +Starta automaten = Démarrer le service +Starta en guide som hjälper dig göra klassinställningar = Démarrer un guide pour vous aider à construire les catégories +Startade automater = Services démarrés +Startande = Démarrage +Startar SI på = Démarrage du boîtier SI à +Startblock = Démarrer le bloc +Startblock: %d = Démarrer le bloc : %d +Startintervall = Intervalle de départ +Startintervall (min) = Intervalle de départ (min) +Startlista = Horaires de départ +Startlista %%s - sträcka %d = Horaires de départ %%s - Combinaison %d +Startlista - %s = Horaires de départ - %s +Startlista - X = Horaires de départ - X +Startlista ett visst lopp = Horaires de départ pour la course +Startlista lopp X - Y = Horaires de départ pour la course X - Y +Startlista, individuell = Horaires de départ individuels +Startlista, patrull = Horaires de départ, patrouille +Startlista, stafett (lag) = Horaires de départ, relais (équipe) +Startlista, stafett (sträcka) = Horaires de départ, relais (relayeur) +Startlistor = Horaires de départ +Startmetod = Méthode de départ +Startnamn = Nom du départ +Startnummer = Numéro de départ +Starttid = Heure de départ +Starttid (HH:MM:SS) = Heure de départ (HH:MM:SS) +Starttid: X = Heure de départ: X +Starttiden är upptagen = L'heure de départ n'est pas disponible +Starttyp = Type de départ +Status = Statut +Status OK = Statut OK +Status in = saisie du statut +Stoppa automaten = Arrêt du service +Stor = Grand +Str. = Relais +Str. %d = Relais %d +String = Texte +Struken = Annulé +Struken med återbetalning = Annulé, frais d'inscription remboursés +Struken utan återbetalning = Annulé, pas de remboursement des frais d'inscription +Strukturerat exportformat = Format d'export structuré +Strukturerat webbdokument (html) = Document web structuré (html) +Sträcka = Relayeur +Sträcka %d = Relayeur %d +Sträcka X = Relayeur X +Sträcka att lotta = Partiel à tirer au sort +Sträckans banor = Circuits du relais +Sträcktider = Temps intermédiaires +Sträcktider (WinSplits) = Temps intermédiaires (WinSplits) +Sträcktider / WinSplits = Temps intermédiaires / WinSplits +Sträcktider/WinSplits = Temps intermédiaires/WinSplits +Sträcktidsfil = Nom du fichier +Sträcktidsutskrift = Imprimer les temps intermédiaires +Sträcktidsutskrift[check] = Imprimer les temps intermédiaires automatiquement +Sträcktilldelning, stafett = Affectation de la combinaison, relais +Sträcktyp = Type de combinaison +Stämpelkod(er) = Poinçons +Stämpelkoder = Code de poinçon +Stämplar om = Poinçonnage de +Stämplingar = Poinçons +Stämplingar saknas: X = Poinçons manquants : X +Stämplingsautomat = Machine à poinçonner +Stämplingsintervall (MM:SS) = Intervalle entre poinçons (MM:SS) +Stämplingstest = Test de poinçonnage +Stämplingstest [!] = Test de poinçonnage [!] +Stäng = Fermer +Stäng tävlingen = Fermer la compétition +Större = Plus grand +Störst = Le plus grand +Största gruppen med samma inledning har X platser = Le plus grand groupe avec le même début a X participants +Största intervall i klass = Plus grand intervalle dans la catégorie +SubCounter = Compteur secondaire +SubSubCounter = Compteur tertiaire +Summera = Somme +Synkronisera med Eventor = Synchroniser avec Eventor +Säkerhetskopiera = Sauvegarder/Enregistrer sous +Sätt okända löpare utan registrering till = Définir le statut pour les coureurs non enregistrés +Sätt som oparad = Non appairé +Sätter reptid (X) och omstartstid (Y) för = Appliquer le temps de corde [Applying rope time] (X) et l'heure de redémarrage (Y) pour +Sök = Rechercher +Sök (X) = Rechercher (X) +Sök deltagare = Rechercher un coureur +Sök och starta automatiskt = Recherche automatique boîtier lecture +Sök på namn, bricka eller startnummer = Recherche d'un nom, d'une puce ou d'un numéro de départ +Söker efter SI-enheter = Recherche du boîtier SPORTident +TCP: Port %d, Nolltid: %s = TCP: Port %d, Heure initiale: %s +TRASIG( = Défectueux( +Ta bort = Supprimer +Ta bort / slå ihop = Supprimer / Fusionner +Ta bort listposten = Supprimer de la liste +Ta bort markerad = Supprimer la sélection +Ta bort stämpling = Supprimer le poinçon +Ta bort valda rader från tabellen (X) = Supprimer les lignes sélectionnées de la table (X) +Tabell = Table +Tabelläge = Mode table +Team = Equipe +TeamBib = Dossard de l'équipe +TeamClub = Club de l'équipe +TeamLegTimeAfter = Retard de l'équipe au relayeur +TeamLegTimeStatus = Temps / statut de l'équipe au relayeur +TeamName = Nom de l'équipe +TeamPlace = Place de l'équipe +TeamRogainingPoint = Score de l'équipe +TeamRunner = Nom des membres de l'équipe +TeamRunnerCard = Numéro de puce de l'équipe +TeamStart = Heure de départ de l'équipe +TeamStartNo = Numéro de départ de l'équipe +TeamStatus = Statut de l'équipe +TeamTime = Temps de l'équipe +TeamTimeAfter = Retard de l'équipe +TeamTimeStatus = Temps / statut de l'équipe +Telefon = Téléphone +Test = Test +Test av stämplingsinläsningar = Test de poinçonnage +Testa rösten = Test de synthèse vocale +Text = Texte +Text: X = Texte: X +Textfiler = Fichiers texte +Textstorlek = Taille du texte +Tid = Temps +Tid efter: X = Retard: X +Tid efter: X; har tagit in Y = Temps après: X; gagné Y +Tid efter: X; har tappat Y = Temps après: X; perdu Y +Tid in = Temps à +Tid: X, nuvarande placering Y/Z = Temps: X, place actuelle Y/Z +Tidsavdrag: X poäng = Pénalité : X points +Tidsgräns = Limite en temps +Tidsinmatning = temps manuels +Tidsintervall (MM:SS) = Intervalle de temps (MM:SS) +Tidsjustering = Ajustement de l'heure +Tidslinje – X = Chronologie – X +Tidsskalning = Echelle de temps +Till huvudsidan = Vers la page principale +Till kontroll = Vers le poste +Tilldela = Affecter +Tilldela avgifter = Affecter les frais d'inscription +Tilldela endast avgift till deltagare utan avgift = Affecter les frais d'inscription uniquement aux coureurs sans frais +Tilldela hyrbrickor = Affecter les puces louées +Tilldela nummerlappar = Affecter les dossards +Tilldelning av hyrbrickor = Affecter les puces louées +Tillgängliga automater = Services disponibles +Tillsatte vakans = Vacants utilisés +Tillsätt vakans = Remplir les vacants +Tillämpa parstart = Démarrer l'apairage +Tillåt decimaler = Autoriser les décimales +Tillåt direktanmälan = Autoriser la saisie rapide +Tillåt valutauttryck med decimaler = Autoriser les expressions monétaires avec décimales +Topplista, N bästa = Podiums, N meilleurs +Total = Total +Total tävlingsavgift = Recette totale +TotalCounter = Compteur primaire +Totalresultat = Résultat total +Totalresultat - X = Résultat total - X +Totalt = Total +Totalt faktureras = Facturation totale +Totalt kontant = Total des espèces +Totaltid = Temps total +Trasig = Défectueux +Träning = Entrainement +Tvåmannastafett = Relais en binôme +Typ = Type +Typ av delning = Type de temps intermédiaire +Typ av export = Type d'export +Typ av lista = Type de liste +Typsnitt = Police +Tävling = Compétition +Tävling från Eventor = Compétition depuis Eventor +Tävlingen innehåller inga resultat = Il n'y a pas encore de résultat +Tävlingen måste ha ett namn = Un nom doit être donné à la compétition +Tävlingens namn: X = Le nom de la compétition est : X +Tävlingsdata har sparats = Les données de la compétition ont été sauvées +Tävlingsinställningar = Configuration de la compétition +Tävlingsinställningar (IOF, xml) = Configuration de la compétition (IOF, xml) +Tävlingsnamn = Nom de la compétition +Tävlingsrapport = Rapport sur la compétition +Tävlingsregler = Règles de la compétition +Tävlingsstatistik = Statistiques de la compétition +Underlag för tävlingsavgift = Données pour les frais d'inscription de la compétition +Underlista = Sous liste +Underrubrik = Sous-titre +Undre datumgräns = Date limite basse [Lower date limit] +Undre gräns (år) = Limite basse (années) +Undre ålder = Age minimal +Ungdom = Jeune +Ungdomsavgift = Tarif jeunes +Ungdomsklasser = Catégories jeunes +Uppdatera = Mise à jour +Uppdatera alla klubbar = Mise à jour de tous les clubs +Uppdatera alla värden i tabellen = Mise à jour de la table +Uppdatera alla värden i tabellen (X) = Rafraîchir les valeurs de la table (X) +Uppdatera från Eventor = Mise à jour depuis Eventor +Uppdatera fördelning = Mise à jour de la diffusion +Uppdatera fördelningen av starttider med hänsyn till manuella ändringar ovan = Mise à jour de la diffusion des horaires de départ en prenant en compte les changements manuels +Uppdatera klubbar && löpare = Mise à jour des clubs et coureurs +Uppdatera klubbarnas och löparnas uppgifter med data från löpardatabasen/distriktsregistret = Mise à jour des clubs et coureurs en utilisant la base de données des coureurs +Uppdatera klubbarnas uppgifter med data från löpardatabasen/distriktsregistret = Mise à jour des clubs en utilisant la base de données des coureurs +Uppdatera klubbens uppgifter med data från löpardatabasen/distriktsregistret = Mise à jour du club en utilisant la base de données des coureurs +Uppdatera löpardatabasen = Mise à jour de la base de données des coureurs +Urval = Filtrer +Urval %c%s = Filtrer %c%s +Utan inställningar = Pas de configuration +Utan tidtagning = Pas de chronométrage +Utbyt tävlingsdata med Eventor = Echange des données de la compétition avec Eventor +Utför lottning = Effectuer le tirage au sort +Utfört = Fait +Utg. = Aband. +Utskrift / export = Imprimer / exporter +Utskriftsintervall (MM:SS) = Intervalle d'impression (MM:SS) +Utökat protokoll = Protocole étendu +VALFRI( = UnParmis( +Vak. ranking = Classement des vacants +Vakanser = Vacants +Vakanser / klassbyte = Changements tardifs +Vakanser och efteranmälda = Vacants et retardataires +Vakanser stöds ej i stafett = Les vacants ne sont pas supporté en relais +Vakant = Vacant +Val av export = Choisir Export +Valbar = Optionel +Vald bricka = Puce choisie +Valuta = Devise +Valutakod = Code devise +Valutasymbol = Symbole monétaire +Valutasymbol före = Symbole monétaire devant la valeur +Varning: Deltagaren 'X' finns inte = Attention: Le coureur 'X' n'existe pas +Varning: Laget 'X' finns inte = Attention: L'équipe 'X' n'existe pas +Varning: Banan 'X' finns inte = Attention: le circuit 'X' n'existe pas +Varning: Banan 'X' förekommer flera gånger = Attention: Le circuit 'X' est définie plus d'une fois +Varning: Ingen organisatör/avsändare av fakturan angiven (Se tävlingsinställningar) = Attention: Aucun organisateur défini (Voir Configuration de la compétition) +Varning: Inget kontonummer angivet (Se tävlingsinställningar) = Attention: Pas de compte défini (Voir Configuration de la compétition) +Varning: Inget sista betalningsdatum angivet (Se tävlingsinställningar) = Attention: Aucune date limite de paiement définie (Voir Configuration de la compétition) +Varning: deltagare med blankt namn påträffad. MeOS kräver att alla deltagare har ett namn, och tilldelar namnet 'N.N.' = Attention: Un coureur sans nom a été détecté. MeOS a besoin d'un nom, et a affecté le nom 'N.N.' +Varning: lag utan namn påträffat. MeOS kräver att alla lag har ett namn, och tilldelar namnet 'N.N.' = Attention: Une équipe sans nom a été détectée. MeOS a besoin d'un nom et a affecté le nom 'N.N.' +Verkställ = Confirmer +Version X = Version X +Vi stöder MeOS = Nous soutenons MeOS +Viktiga händelser = Evènements importants +Vill du flytta löpare från X till Y och ta bort Z? = Voulez vous déplacer les coureurs de X vers Y et supprimer Z ? +Vill du klistra in X nya rader i tabellen? = Voulez vous coller X nouvelles lignes dans la table ? +Vill du lägga till banan 'X' (Y)? = Souhaitez vous ajouter le circuit 'X' (Y)? +Vill du lägga till deltagaren 'X'? = Souhaitez vous ajouter le coureur 'X'? +Vill du lägga till klassen 'X'? = Souhaitez vous ajouter la catégorie 'X'? +Vill du lägga till laget 'X'? = Souhaitez vous ajouter l'équipe 'X'? +Vill du radera X rader från tabellen? = Voulez-vous supprimer X lignes de la table ? +Vill du radera alla vakanser från tävlingen? = Voulez-vous supprimer tous les vacants de la compétition ? +Vill du skapa en ny klass? = Voulez-vous créer une nouvelle catégorie ? +Vill du spara ändringar? = Voulez-vous sauver les changements ? +Vill du verkligen radera alla starttider i X? = Voulez-vous vraiment effacer les horaires de départ dans X? +Vill du verkligen radera starttider i X klasser? = Voulez-vous vraiment effacer les horaires de départ de la catégorie X ? +Vill du verkligen radera tävlingen? = Sohaitez-vous supprimer la compétition ? +Vill du verkligen stänga MeOS? = Souhaitez-vous fermer MeOS ? +Vill du verkligen ta bort laget? = Souhaitez-vous supprimer l'équipe ? +Vill du verkligen ta bort löparen? = Souhaitez-vous supprimer le coureur ? +Visa = Afficher +Visa alla = Afficher tout +Visa avancerade funktioner = Afficher la configuration avancée +Visa en tabell över alla stämplingar = Afficher la table avec les poinçons +Visa klubbdatabasen = Afficher la base de données des clubs +Visa listan i fullskärm = Afficher la liste en plein écran +Visa löpardatabasen = Afficher la base de données des coureurs +Visa mellantider = Afficher les temps intermédiaires +Visa och hantera löpardatabasen = Afficher et gérer la base des coureurs +Visa senast inlästa deltagare = Afficher le coureur de la dernière lecture de puce +Visa startlistan = Afficher la liste des départs +Visa tillgängliga säkerhetskopior = Afficher les sauvegardes disponibles +Visa valda deltagare = Afficher les coureurs sélectionnés +Visar de X bästa = Affichage des X meilleurs +Visualisera startfältet = Visualisation des champs de départ +Vuxen = Adulte +Vuxenklasser = Catégories adultes +Vuxna = Adultes +Välj Spara för att lagra brickorna. Interaktiv inläsning är INTE aktiverad = Clicker sur pour enregistrer la puce. La lecture interactive n'est pas activée +Välj Spara för att lagra brickorna. Interaktiv inläsning är aktiverad = Clicker sur pour enregistrer les puces. La lecture interactive est activée +Välj alla = Sélectionner tout +Välj alla klasser = Sélectionner toutes les catégories +Välj allt = Sélectionner tout +Välj automatiskt = Sélection automatique +Välj den etapp som föregår denna tävling = Sélectionner l'étape précdente +Välj den etapp som kommer efter denna tävling = Sélectionner l'étape suivante +Välj en vakant plats nedan = Choisissez une place vacante ci-dessous +Välj ingen = Désélectionner +Välj inget = Désélectionner +Välj klass = Sélectionner la catégorie +Välj klass och starttid nedan = Choisissez la catégorie et l'heure de départ ci-dessous +Välj klasser = Choisir les catégories +Välj klasser där alla löpare saknar starttid = Sélectionner les catégories où aucun coureur n'a d'heure de départ +Välj klasser där någon löpare saknar starttid = Sélectionner les catégories où des coureurs n'ont pas d'heure de départ +Välj kolumner = Choisir les colonnes +Välj kolumner att visa = Choisir les colonnes à afficher +Välj kolumner för tabellen X = Choisir les colonnes pour la table X +Välj lista = Sélectionner la liste +Välj lopp = Sélectionner la course +Välj löpare = Choisir un coureur +Välj löpare att prioritera bevakning för = Sélectionner les coureurs à privilégier +Välj löpare för sträcka X = Définir le coureur pour la variation X +Välj skrivare = Choisir une imprimante +Välj tävling = Choisir une compétition +Välj vilka klasser och kontroller du vill bevaka = Choisir les catégories et les postes que vous souhaitez observer +Välj vilka klasser och kontroller som bevakas = Sélectionner les catégories et les postes à observer +Välj vilka kolumner du vill visa = Choisr les colonnes à afficher +Välj vy = Choisir la vue +Välkommen till MeOS = Bienvenue dans MeOS +Vänligen betala senast = Merci de régler au plus tard le +Vänligen återlämna hyrbrickan = Merci de rendre votre puce de location +Växling = Changement +Webb = Document Web +Webbdokument = Document Web +Webbdokument (html) = Document Web (html) +Webben (html) = Le web (html) +X (Saknar e-post) = X (n'a pas de courriel) +X (Y deltagare, grupp Z, W) = X (Y coureurs, groupe Z, W) +X har startat = X est parti +X kontroller = X postes +X meter = X mètres +X poäng fattas = X points manquant +X rader kunde inte raderas = X lignes ne peuvent être effacées +X senaste = X derniers +X: Y. Tryck för att spara = X: Y. Appuyez sur pour sauver +Zooma in (Ctrl + '+') = Zoomer (Ctrl + '+') +Zooma ut (Ctrl + '-') = Dézoomer (Ctrl + '-') +[Bevaka] = [Observer] +[Flytta ner] = [Descendre] +[Bort] = [Supprimer] +[Klassens bana] = [De la catégorie] +[Uppdaterad anmälan] = [Mise à jour de l'inscription] +[VARNING] ingen/okänd = [ATTENTION] aucun/inconnu +[Återställ] = [Remise à zéro] +andra = seconde +ask:addpunches = Aucune puce n'a été lue pour ce coureur. Voulez-vous ajouter des poinçons manuellement ? +ask:changedclassfee = Le tarif a été modifié pour certaines catégories. Voulez-vous appliquer les nouveaux tarifs aux coureurs déjà présents dans ces catégories ?\n\nAttention: les frais d'inscription affectés manuellement seront écrasés. +ask:changedcmpfee = Les tarifs ont été modifiés. Voulez-vous appliquer les nouveaux tarifs aux coureurs et classes existantes ?\n\nAttention les frais d'inscription affectés manuellement seront écrasés. +ask:firstasstart = Il existe des coureurs ayant des résultats pour ce circuit. Si vous utilisez le premier poste comme départ, les heures de départ seront écrasées.\n\nSouhaitez-vous continuer ? +ask:kiosk = Quand vous démarrez la diffusion des résultats, vous mettez MeOS dans un mode où il est uniquement possible d'afficher les résultats. Aucune autre opération n'est autorisée jusqu'à ce que le programme soir redémarré. S'il y a un boîtier SI actif raccordé à l'ordinateur, MeOS affichera automatiquement les résultats pour la dernière puce lue.\n\nVous devriez penser à protéger la base de donnée avec un mot de passe, si la diffusion est rendue publique.\n\nVoulez-vous démarrer la difusion des résultats ? +ask:missingcourse = Des catégories (X) n'ont pas de circuit.\n\nMeOS utilise les circuits lors du tirage pour éviter que les coureurs ayant le même premier poste ne partent en même temps.\n\nVoulez-vous continuer tout de même ? +ask:overwrite_server = La compétition est déjà sur le serveur. Voulez-vous écraser la compétition présente sur le serveur ? +ask:overwriteconfirm = Vous avez choisi d'écraser la compétition. Vérifiez que personne d'autre n'est connecté.\n\nSouhaitez vous continuer ? +ask:repair = Effectuez une réparation de la base de données uniquement si vous rencontrez des problèmes.\n\nImportant:\n- Assurez-vous que personne d'autre n'est connecté à la base.\n- Si le serveur plante ou s'arrête pendant la réparation, vous devez le redémarrer et réessayer la réparation avant d'effectuer quoi que ce soit d'autre. Si vous faites d'autres opération avec la base de données toutes les données seront perdues.\n\nSouhaitez-vous essayer une réparation maintenant ? +backup = sauvegarde +c/o = Aux bon soins de +check (X) = Vérification de (X) +ej aktiv = inactif +elfte = onzième +elva = onzième +ett Mycket Enkelt OrienteringsSystem = un logiciel GEC bien plus simple +eventor:help = Si vous utilisez MeOS pour la CO en Suède, nous recommandons que vous utilisiez les fonctionnalités de connexion Eventor. +eventor:question = X\n\nSouhaitez-vous utiliser la connexion à Eventor ? +femma = cinquième +femte = cinquième +fjärde = quatrième +fritt att använda och du är välkommen att distribuera det under vissa villkor = gratuit, et vous êtes invités à le diffuser sous certaines conditions +fyra = quatrième +går i mål på X plats med tiden Y = termine X en Y +går i mål på X plats, efter Y, på tiden Z = termine X, derrière Y, en Z +går upp i delad ledning med tiden X = partage la tête de la course avec un temps de X +handskakning = authentification +har startat = a démarré +help:10000 = Un service dans MeOS est un petit programme qui, de temps à autre ou lorsque les données de la compétition changent, fait des choses automatiquement. +help:12138 = Choisr une catégorie à fusionner avec la catégorie choisie. Si le tirage des catégories a été effectué, vous devez refaire un tirage, car les coureurs conservent leur horaire de départ. +help:12290 = La compétition a été créée avec une autre version de MeOS et ne peut pas être ouverte depuis le serveur. Vous pouvez toutefois la compétition depuis un fichier. +help:12352 = Cette opération supprime le club que vous avez choisi (%s, id=%d) et déplace tous les coureurs de ce club vers le club que vous choisissez ci-dessous. L'opération ne peut être annulée. +help:12662 = Ajoutez des postes en ajoutant une séquence de numéros de postes. Vous ne devez pas préciser l'arrivée. Exemple: 31, 50, 36, 50, 37, 100. +help:14070 = Le port TCP est utilisé pour recevoir les poinçons par TCP depuis d'autres machines. Précisez le port utilisé. L'instant initial du protocole est 00:00:00. +help:14343 = Une liste avec la puce lue est affichée. Pour affecter un coureur à une autre puce, double cliquez sur la puce ou le coureur que vous souhaitez déplacer. +help:146122 = Vous pouvez étendre les connaissances de MeOS sur les coureurs, clubs et catégories en cherchant les bases de données au format MeOS ou IOF (xml).\n\nSouhaitez vous effectuer cette opération ? +help:14692 = Saisir le numéro de poste, le coureur (numéro de départ ou de puce) et l'heure (HH:MM:SS). Vous pouvez laisser le champ heure vide; l'heure du PC sera alors utilisée. Appuyez sur pour enregistrer. +help:15491 = Vous pouvez exporter les configurations ainsi que les bases de données des clubs et coureurs dans le répertoire de votre choix. Ces configurations et bases de données peuvent être importées sur un autre PC. +help:21576 = En cas d'erreur, cliquer sur le nom des coureurs pour modifier la saisie. Utiliser la page des coureurs pour supprimer les enregistrements. Pour voir une catégorie dans la liste ci-dessous, elle doit être marquée pour saisie rapide sur la page des catégories. +help:25041 = Ici vous déclarez vos circuits. Un circuit est alors lié à une ou plusieurs catégories (ou coureurs). Il est également possible d'importer des circuits depuis OCAD, Condes, ou tout autre logiciel d'élaboration de circuits. Si vous spécifiez le nombre de cartes, MeOS contrôlera le nombre de cartes disponibles dans le formulaire de saisie rapide. +help:26963 = Un ensemble de circuits est utilisé pour définir un ensemble de partiels pour une branche. Le circuit est affecté au compétiteur à l'arrivée sur la base des postes poinçonnés. Définissez les partiels dans le groupe en les ajoutant dans Circuits Multiples/Relais. Un [S] après la catégorie signifie que tous les compétiteurs ont un horaire de départ. +help:29191 = Vous pouvez installer les configurations, clubs et base de données des coureurs à partir d'un répertoire source spécifié. Vos configurations locales sont écrasées. MeOS devrait être redémarré après l'installation.\n\nLe bouton vous conduit à une page où vous pouvez exporter votre configuration courante. +help:29758 = Ici vous gérez les clubs et l'impression des factures. Vous pouvez définir un tarif prenant en compte le type de catégorie et la date d'inscription. Les clubs en double (mal orthographiés) peuvent être regroupés dans le club correct. Vous pouvez également mettre à jour les adresses de clubs à partir du tableau de comptes. +help:30750 = Vous pouvez créer un grand nombre de listes et rapports différents. Ceux-ci peuvent être visualisés à l'écran, imprimés, ou sauvés dans un format web. La liste est automatiquement mise à jour lorsque des données liées à la compétition changent. L'impression automatique des résultats s'obtient à partir de la page Services. Pour exporter les données de la compétition, par exemple les temps intermédiaires, aller à la page Compétition. +help:31661 = Un nouveau départ (en masse) est défini par une barrière horaire et une heure de reprise. A la barrière horaire les passages de relais sont terminés et aucun compétiteur n'est autorisé à partir en forêt. Les concurrents restants partent à l'heure de la barrière horaire. Il est possible de spécifier différents horaires pour des partiels précis, mais en utilisant cett efonction vous pouvez rapidement prendre en charge des catégories entières. +help:33940 = Importer les inscriptions en format texte libre. Spécifier le nom, le club, la catégorie et le numéro de puce (éventuellement l'heure de départ), de préférence séparés par des virgules, une personne (équipe) par ligne. Il est également possible de spécifier plusieurs compétiteurs dans le même club / catégorie en laissant partiellement vides ces champs. Il est également possible d'importer des données formatées par d'autres moyens. +help:41072 = Sélectionner un poinçon dans la liste pour le modifier ou le supprimer. Vous pouvez ajouter des poinçons manquants à partir du modèle de course. Si l'heure d'arrivée est manquante, le coureur obtient le statut . Si un poinçon est manquant, le statut est . Il est impossible d'assigner un statut incompatible avec les poinçons. S'il y a un poinçon d'arrivée, vous devez le modifier pour pouvoir définir manuellement l'heure d'arrivée. Le même principe s'applique au poinçon de départ. +help:41641 = Entrez un premier horaire de départ et un intervalle. Tirage Aléatoire affecte un ordre de départ totalement aléatoire. La Méthode de Tirage Suédoie utilise des règles spéciales pour répartir les coureurs d'un même club. Départ groupé signifie que la catégorie complète part par petits groupes pendant la durée spécifiée (Départ en masse étendu). Dans le champ Partiel vous pouvez spécifier quel partiel doit être tiré au hasard si la catégorie en a plusieurs. +help:425188 = Vous pouvez gérer automatiquement les compétiteurs qui ne sont pas partis en lisant les boîtiers SI (clear/check/start/controls) dans SIConfig. Sauvegarder les données lues en tant que fichier texte dont les colonnes sont séparées par des points-virgules, et importez ce fichier dans MeOS. Les compétiteurs figurant dans cet import reçoivent un enregistrement. Vous pouvez alors donner le statut DNS à tous les compétiteurs n'ayant pas d'enregistrement. Si ultérieurement vous importez d'autres coureurs, vous pouvez réinitialiser le statut (de DNS à Inconnu) sur les compétiteurs alors importés. +help:471101 = Activez le boîtier SI en sélectionnant son port COM ou en recherchant les boîtiers SI installés. Appuyez sur Information pour obtenir le statut du port sélectionné.\n\nLecture Interactive vous permet de gérer directement les problèmes tels qu'un numéro de puce erroné. N'utilisez pas cette possibilité quand les compétiteurs ayant des problèmes sont pris en charge séparément.\n\nLa base de données des compétiteurs est utilisée si vous voulez ajouter automatiquement de nouveaux compétiteurs. Les poinçons sont utilisés pour trouver (détecter) la bonne catégorie. +help:50431 = Vous êtes désormais connecté à un serveur. Pour ouvrir une compétition sur le serveur, sélectionnez le dans la liste et cliquer Ouvrir. Ajoutez une compétition au serveur, ouvrez la compétition en local et sélectionnez Télécharger. Quand vous aurez ouvert une compétition sur le serveur, vous pourrez voir tous les autres clients MeOS connectés. +help:52726 = Connectez vous à un serveur ci-dessous.\n\nInstallation\nTélécharger et installer MySQL 5 (Community Edition) depuis www.mysql.com. Vous pouvez utiliser la configuration par défaut. Il est uniquement nécessaire d'installer MySQL sur l'ordinateur servant de serveur. Quand MySQL est installé, démarrer MySQL Command Line Client et créez un compte utilisateur pour MeOS. Ecrire quelque chose du genre :\n\n> CREATE USER meos;\nGRANT ALL ON *.* TO meos;\n\nVous avez maintenant un utilisateur meos sans mot de passe. Entrez le nom du serveur ci-dessous (vous pouvez avoir à configurer les pare-feu pour laisser passer le traffic).\n\nComme alternative vous pouvez utiliser le compte root d'origine de MySQL. Le nom d'utilisateur est 'root' et le mot de passe est celui donné lors de l'installation de MySQL. +help:5422 = Pas de boîtier SI trouvé. Sont-ils connectés et démarrés ? +help:59395 = Dans ce formulaire, vous pouvez rapidement effectuer des réglages de base en une seule opération pour plusieurs catégories.\n\nDépart est le nom du départ tel qu'il apparaît sur les liste d'horaire de départ.\n\nUn Bloc est un nombre entre 0 et 100 qui peut fournir une distribution des compétiteurs encore plus fine. Les catégories dans le même bloc seront imprimées dans la même minute sur les horaires de départ. \n\nIndex est une clé de tri. Les catégories sont triées à l'aide de cette clé dans toutes les listes.\n\nLe circuit peut être défini pour les catégories ayant exactement un circuit; s'il y a plusieurs circuits possibles vous devez utiliser le formulaire standard de catégorie.\n\nSaisie rapide détermine si la catégorie accepte les inscriptions rapides. +help:59395_more = The class fees, which shows if you have activated Economy features, are used for new entries. If you change a fee, MeOS will ask if you wish to apply the change to existing competitors.\n\nFor bibs you have the options None, Consecutive and Manual. You can also type the first bib in the class, for example A100, or 50. Consecutive means that the last number of the preceeding class is used to define the first number in this class. Reserved bib numbers gives a gap (of the specified width) in the numbering between classes.\n\nMeOS updates bibs when you draw start times or change the settings. Manual means that MeOS will never automatically update bibs.\n\nFor classes with teams the setting Team member controls the relation between the team number and the bibs. It can be the same, increasing (100, 101, 102), leg dependent (100-1, 100-2, etc.) or completely independent. +help:7618 = Le nombre de compétiteurs dans l'équipe est défini dans la page Catégories. +help:7620 = Intervalle (secondes). Laisser le champ vide pour qu'il soit mis à jour quand la compétition évolue. +help:89064 = Pour chaque poste, vous devez spécifier un ou plusieurs numéro de code (codes SI). Dans un circuit, vous faites référence à un poste par son identifiant (ID). Habituellement vous n'avez pas besoin d'ajouter des postes manuellement puisque MeOS ajoute automatiquement tous les postes nécessaires.\n\nL'utilisation de plus d'un code SI est utile lorsque l'on veut remplacer un boîtier défectueux ou pour créer des fourches simples. Pour un poste ordinaire, il est exigé que le compétiteur poinçonne un des postes spécifiés. Si le statut du poste est , tous les postes spécifiés doivent être poinçonnés (dans un ordre quelconque). Si le statut est , le boîtier est ignoré.\n\nSi vous spécifiez un nom de poste, il est possible d'imprimer les résultats avec les temps intermédiaires aux postes nommés.\n\nUn réajustement de l'heure du poste peut être effectué s'il apparaît que le boîtier n'était pas à l'heure. Le format de l'heure est +/-MM:SS ou +/-HH:MM:SS.\n\nLe temps de partiel le plus court définit le temps le plus court possible sur ce partiel. Aucun concurrent n'aura un temps plus court pour aller à ce poste, aussi rapide soit-il. Cela peut être utilisé, par exemple, si une route dangereuse doit être traversée.\n\nLe statut signifie que le temps pour aller au poste est ignoré; le temps total sera le même quel que soit le temps réellement mis pour se rendre au poste. +help:9373 = Donnez un ou plusieurs numéro de postes (codes SI) utilisés pour ce poste.\nExemple: 31, 32, 33. +help:9615 = Aucune réponse reçue. Voulez-vous ouvrir le port en mode passif ? MeOS doit-il être à l'écoute de poinçons à venir ? +help:assignfee = MeOS va prendre en charge automatiquement pour vous les droits d'inscription dans la plupart des cas. Le tarif est basé sur l'âge et la date d'inscrition des compétiteurs (vous pouvez définir les limites dans Configuration de la compétition). Chaque catégorie définit un tarif. Vous fournissez une valeur par défaut pour différentes catégories dans Configuration de la Compétition, mais vous pouvez également reconfigurer la catégorie en utilisant Configuration Rapide pour cette catégorie.\n\nCette page vous permet d'utiliser différentes limites en âges et date limites d'inscription pour différents tarifs. Sur la page des Compétiteurs, vous pouvez ajuster manuellement le tarif pour chaque compétiteur en cas de besoin. +help:baudrate = Vitesse de transmission (baudrate) : utilisez 4800 ou 38400. +help:computer_voice = Un poinçon arrivant est mis en correspondance avec un numéro de départ et joue le fichier où N est le numéro de départ. Les fichiers sont situés dans le répertoire ci-dessous. Si le compétiteur/équipe a une nationalité NAT d'affectée, MeOS essaie en priorité de jouer le fichier , qui se doit de contenir le nombre dans la version de langue appropriée. +help:dbage = La base de donnée des compétiteurs dat ede plus de deux mois. Souhaitez vous télécharger une nouvelle base à partir d'Eventor ? +help:duplicate = Faire une copie locale de cette compétition. +help:eventorkey = Entrez la clef Eventor de votre club (spécial Suède). Vous pouvez obtenir la clef auprès de l'administrateur Eventor de votre club. +help:fullscreen = Vous pouvez ajuster la vitesse de défilement en utilisant Ctrl+M (augmente) et Ctrl+N (diminue). Pour sortir du mode plein écran, appuyez sur Esc. +help:import_entry_data = Vous pouvez importer des compétiteurs, des catégories, des clubs et des inscriptions à partir de divers formats texte et XML. Il n'est pas nécessaire de fournir tous les fichiers ci-dessous. Par exemple, un fichier CSV de OE avec les inscriptions contient les clubs et les catégories, aussi dans ce cas ces champs devraient-ils être laissés vides.\n\nSi le même compétiteur est importé plusieurs fois vous n'obtiendrez pas plusieurs copies de ce compétiteur, mais son inscription sera modifiée. Cela signifie qu'il est sans danger de ré-importer ou d'importer un fichier d'inscription qui a été étendu. +help:importcourse = Vous pouvez importer des circuits et des catégories à partir (par exemple) d'exports OCAD ou Condes. +help:ocad13091 = Si vous avez accès aux circuits (par exemple à partir d'OCAD ou Condes) vous pouvez fournir les fichiers contenant les circuits ici. Autrement, vous pourrez ajouter les circuits ultérieurement. +help:relaysetup = Utilisez le guide ci-dessous pour choisir parmis les formulaires de compétitions prédéfinis. Après avoir appliqué la configuration, il est possible d'adapter manuellement la configuration pour chaque partiel et configurer les circuits.\n\nQuelques explications :\n- Relais est utilisé pour différent type de relais.\n- Relais par paire signifie que deux compétiteurs forme une équipe et courent à tour de rôle.\n- Un relais en Co-compétition est parfois utilisé dans les catégories jeunes et permet d'avoir plus d'un compétiteur sur certains partiels. (le premier compétiteur change d'une fois à l'autre).\n- Une patrouille peut s'effectuer avec une ou deux puces.\n- Prologue et poursuite est une compétition individuelle mais constitué de deux courses.\n- Un pool de circuit signifie qu'il y a plusieurs variantes, mais qu'il n'est pas décidé à l'avance qui court sur quelle variante; la décision est prise automatiquement lorsque le coureur a terminé. +help:restore_backup = Choisissez une sauvegarde à restaurer en cliquant la date à laquelle la sauvegarde a été faite. +help:runnerdatabase = En important une base de donnée de clubs et de coureurs, MeOS reconnaitra automatiquement les coureurs inconnus (par leur numéro de puce), et vous aurez les adresses et numéros de téléphone du club. +help:save = MeOS sauve automatiquement toutes les configurations lorsque c'est nécessaire. +help:speaker_setup = Choisissez les catégories et circuits que vous voulez surveiller. +help:speakerprio = Cochez les coureurs/équipes que vous souhaitez surveiller dès le départ et tant que tout va bien. Mettre deux coches pour surveiller même si le résultat n'est plus très bon. Aucune coche signifie que la surveillance n'est activée que si le coureur/l'équipe a de bons résultats (donc pas forcément depuis le départ). +help:splitexport = Décidez si vous voulez exporter les résultats individuellement ou globalement pour chaque course. Si vous choisissez d'exporter toutes les courses, des fichiers numérotés seront créés. +help:startmethod = MeOS utilisera automatiquement la méthode de départ choisie. Quoi que vous choisissiez ici, vous pourez dans tous les cas changer la méthode de départ ou refaire le tirage plus tard. +help:winsplits_auto = Ce service sauvegarde les temps intermédiaires dans un fichier IOF (xml) à intervalles réguliers. Si vous ouvrez ce fichier dans WinSplits, les temps intermédiaires seront mis à jour en temps réel. +help:zero_time = Définissez l'heure zéro à une heure avant le premier départ prévu. +help:long_times = La date de compétition est la date à laquelle toutes les catégories commencent. L'heure zéro est à minuit. +help_autodraw = Fournit une première heure de départ (ordinaire), un intervalle minimal (pour une catégorie) et le pourcentage de vacants. Vous pouvez également choisir la méthode utilisée pour le tirage au sort et si les retardataires doivent partir avant ou après les autres coureurs. Le premier horaire de départ doit être postérieur l'heure zéro de la compétition.\n\nSi vous cliquez sur , MeOS vérifie toutes les catégories. Si la catégorie n'a pas eu de tirage celui-ci est effectué. S'il y a des retardataires sans horaires de départ dans une catégorie, leur horaire de départ sera tiré au sort.\n\nMeOS garantit que les coureurs ayant des circuits similaires ne partent pas simultanément, et de la place est réservée pour permettre l'accueil de retardataires dans les même conditions.\n\nSi au contraire vous cliquez sur vous pouvez contrôler exactement quelle catégories sont tirées au sort et avec quels paramètres. +help_draw = Le tirage au sort des horaire de départ se fait en deux temps. Premièrement vous choisissez les catégories et entrz quelques paramètres. Quand vous appuyez sur MeOS utilise vos paramètres pour attribuer les plages d'horaires entre les catégories. MeOS garantit que les catégories ayant des circuits similaires ne partent pas ne même temps en prenant en compte toutes les catégories ayant déjà eu un tirage. L'objectif est une répartition uniforme des partants.\n\nLa répartition calculée se présente sous la forme d'une table dans laquelle vous pouvez effectuer vos propres modifications, ou laisser MeOS mettre à jour sa répartition en prenant en compte vos modifications. Lorsque vous êtes satisfaits avec la répartition, vous laisser MeOS faire le tirage au sort des catégories sélectionnées.\n\nLes paramétrages que vous devez effectuer consistent à fournir l'heure du premier départ possible, et le plus petit intervalle de temps entre coureur autorisé. Le nombre maximal de départ en parallèle détermine combien de coureurs peuvent prendre le départ en même temps. Une valeur plus importante conduit à une durée de départ plus faible.\n\nLe pourcentage de vacants détermine le nombre d'horaires laissés disponibles. Si vous n'en voulez aucune, entrez 0%. Le nombre prévu de retardataires réserve de la place pour ces derniers dans la liste de départ, avec la garantie qu'aucun coureur prenant le départ au même moment n'aura un circuit identique. +info:multieventnetwork = Pour prendre en charge plus d'une étape vous devez travailler localement. Faite une copie de sauvergarde de la compétition, ouvrez-la en local et transferrez les résultats à l'étape suivante. Enfin, remontez l'étape suivante sur le serveur. +info:readout_action = X: Puce no. Y lue.\nDes actions manuelles sont requises. +info:readout_queue = X: Puce no. Y lue.\nLa puce a été mise en file d'attente. +inforestwarning = Aucun concurrent ne semble être encore en forêt. Comme les données qui ont servi à émettre cette conclusion peuvent être erronées, vous devez vérifier qu'aucun concurrent n'est encore en forêt par d'autres moyens. +kartor = carte +klar = établir +kontroll = poste +kontroll X (Y) = poste X (Y) +localhost = machine locale +lopp = course +mål = arrivée +målet = l'arrivée +målet (X) = l'arrivée (X) +nia = neuvième +nionde = neuvième +radio X = radio X +saknas = manquant +se license.txt som levereras med programmet = voir le fichier license.txt fourni avec le logiciel +serverbackup = sauvegarde du serveur +sexa = sixième +sjua = septième +sjunde = septième +sjätte = sixième +skicka stämplar = envoyer le spoinçons +sortering: X, antal rader: Y = ordre de tri: X, nombre de lignes: Y +starten (X) = le départ (X) +sträcka %d = variation %d +stämplade vid = a poinçonné +stämplar vid X som Y, på tiden Z = poinçonne à X en tant que Y, en Z +tar ledningen med tiden X = prend la tête en X +tia = dixième +till = à +tionde = dixième +tolfte = douzième +tolva = douzième +tooltip:analyze = Analyse les donnée et prévisualise les données importées. +tooltip:builddata = Etendre les connaissances de MeOS des coureurs, clubs et catégories en analysant les données de la compétition. +tooltip:import = Importer depuis un fichier. +tooltip:inforest = Liste des coureurs en forêt et des coureurs n'ayant pas pris le départ. +tooltip:paste = Coller depuis le presse papier. +tooltip:resultprint = Imprimer les résultats à l'écran +tooltip:voice = Synthèse vocale des pré-annonces. +trea = troisième +tredje = troisième +tvåa = second +väntas till X om någon minut = est attendu sous peu au poste X +väntas till X om någon minut, och kan i så fall ta en Y plats = est attendu au poste X dans la minute, et peut prendre la Y place. +väntas till X om någon minut, och kan i så fall ta ledningen = est attendu au poste X dans la minute, et peut prendre la tête de la course. +växeln = passage de relais +växlar på X plats med tiden Y = passage de relais au poste X avec un temps de Y +växlar på X plats, efter Y, på tiden Z = passage de relais à la X place, après Y, avec un temps de Z +växlar på delad X plats med tiden Y = devient X avec un temps de Y +warn:changedtimezero = Changer l'heure zéro d'une compétition ayant des résultats n'est pas recommandé.\n\nVoulez vous tout de même faire ce changement ? +warn:olddbversion = La base de donnée est utilisée par une version postérieure de MeOS. Une mise à jour est recommandée. +warning:dbproblem = ATTENTION. Problèmes rencontrés avec la connexion à la base: 'X'. La connexion sera automatiquement restaurée. Vous pouvez continuer à travailler normalement. +warning:drawresult = La catégorie a déjà des résultats, les heures de départ seront écrasées. Voulez-vous continuer ? +warning:has_entries = La catégorie a déjà des coureurs . Changer la réparition des variations à ce stade peut entraîner un eperte de données.\n\nVoulez-vous continuer ? +warning:has_results = La catégorie a déjà des résultats. Changer la réparition des variations à ce stade est inhabituel.\n\nVoulez-vous continuer ? +xml-data = données xml +Äldre protokoll = Protocole périmé +Ändra = Modifier +Ändra grundläggande inställningar och gör en ny fördelning = Modifier les configuration de base et faire une nouvelle répartition +Ändra inställningar = Modifier les configurations +Ändra klassinställningar = Modifier les configurations de catégorie +Ändra lag = Changer l'équipe +Ändra sträckindelning = Modifier la configuration des variations +Ändrad = Modifié +Ändrade avgift för X deltagare = Tarif modifié pour X coureur(s) +Åldersfilter = Filtrer suivant l'âge +Åldersgräns ungdom = Age minimal +Åldersgräns äldre = Age maximal +Åldersgränser, reducerad anmälningsavgift = Age limite pour tarif réduit +Ångra = Annuler la saisie +Återansluten mot databasen, tävlingen synkroniserad = Reconnecté à la base de donnée, compétition synchronisée +Återbud = Annuler l'inscription +Återgå = Retour +Återställ = Restaurer +Återställ / uppdatera klasstillhörighet = Réinitialiser / modifier la catégorie du coureur +Återställ löpare med registrering till = Passer le statut à pour les coureurs inscrits +Återställ säkerhetskopia = Restaurer la sauvegarde +Återställ tabeldesignen och visa allt = Restaurer la présentation de la table +ÅÅÅÅ-MM-DD = AAAA-MM-JJ +Öppen = Open +Öppen klass = Catégorie Open +Öppna = Ouvrir +Öppna fil = Ouvrir le fichier +Öppna från aktuell tävling = Ouvrir depuis cette compétition +Öppna föregående = Ouvrir le précédent +Öppna föregående etapp = Ouvrir l'étape précédente +Öppna i ett nytt fönster = Ouvrir dans une nouvelle fenêtre +Öppna klasser, ungdom = Ouvrir les catégories jeunes +Öppna klasser, vuxna = Ouvrir les catégories adultes +Öppna nästa = Ouvrir le sivant +Öppna nästa etapp = Ouvrir l'étape suivante +Öppna tävling = Ouvrir la compétition +Öppna vald tävling = Ouvrir la compétition sélectionnée +Öppnad tävling = Compétition ouverte +Överför anmälda = [Transfer entires] +Överför nya deltagare i ej valda klasser med status "deltar ej" = Transférer les nouveaux coureurs dans les catégories non sélectionnées avec le statut "Ne participe pas" +Överför resultat = Transférer les résultats +Överför resultat till X = Transfert des résultats à X +Överför resultat till nästa etapp = Transfert des résultats à l'étape suivante +Övre datumgräns = Date au plus tard +Övre gräns (år) = Date au plus tard (années) +Övre ålder = Age maxi +Övriga = Autre +är först i mål med tiden X = est premier à l'arrivée en X +är först vid X med tiden Y = est premier au poste X en Y +är först vid växeln med tiden X = est premier au passage de relais avec un temps de X +är inte godkänd = est disqualifié +återställd = restauré +åtta = huit +åttonde = huitième +Kopia (X) = Copier (X) +Tillåt samma bana inom basintervall = Autoriser le même circuit dans l'intervalle de base [within base interval] +Välj X = Selectionner X +Ett startblock spänner över flera starter: X/Y = Un bloc de départ couvre plus d'un départ: X/Y +Bricka X = Puce X +RunnerTimePerKM = Allure min/km +X är inget giltigt sträcknummer = X n'est pas un numéro de variation valide +Listan togs bort från tävlingen = La liste a été retirée de la compétition +Töm = Effacer +Status matchar inte deltagarnas status = Le statut ne correspond pas au statut du coureur. +Status matchar inte data i löparbrickan = Le statut ne correspond pas au donnée contenues dans la puce. +Döp om = Renommer +går upp i delad ledning vid X med tiden Y = partage la tête de la course au poste X, en Y +X:e = X:ème +tar ledningen vid X med tiden Y = prend la tête au poste X, en Y +Eventor server = Serveur Eventor +(har stämplat) = (a poinçonné) +documentation = meos_doc_eng.html +Hittar inte hjälpfilen, X = Documentation introuvable, X +X har redan ett resultat. Vi du fortsätta? = X a déjà un résultat. Souhaitez-vous continuer ? +Aktuell tid = Heure courante +Godkänd = OK +Nummerlapp, SI eller Namn = Dossard, puce ou nom +Utgått = Aband. +Manuell inmatning = Entrée manuelle +Tilldelad = Affecté +Eventors tider i UTC (koordinerad universell tid) = Heure UTC d'Eventor +Exportera tider i UTC = Heure UTC d'export +Tidszon = Fuseau horaire +RunnerAge = Age du coureur +RunnerBirthYear = Année de naissance du compétiteur +RunnerFee = Prix payé par le coureur +RunnerNationality = Nationalité du coureur +RunnerPhone = Numéro de téléphone du coureur +RunnerSex = Sexe du coureur +TeamFee = Prix payé par l'équipe +Varning: ändringar i X blev överskrivna = Attention: les changements dans X ont été écrasés +help:simulate = Ce service vous permet de simuler des lectures de puces. Des temps et des poinçons sont générés pour tous les participants. Même les postes radio peuvent être simulés.\n\nATTENTION: A n'utiliser que pour les tests. Si vous utilisez cette fonctionnalité sur une vraie course, elle sera corrompue. +Rogainingresultat - %s = Résultats de la course au score - %s +TeamPlaceDiff = Ecart de place de l'équipe (étape courante) +TeamTotalPlace = Place finale de l'équipe (toutes les étapes) +TeamTotalTime = Temps total de l'équipe (toutes les étapes) +TeamTotalTimeAfter = Retard total de l'équipe (toutes les étapes) +TeamTotalTimeDiff = Ecart total de l'équipe (étape courante) +TeamTotalTimeStatus = Temps total ou statut de l'équipe (toutes les étapes) +Vill du dumpa aktuellt tävling och skapa en testtävling? = Voulez vous faire un dump de la compétition courante et créer une compétition de test ? +Radera alla klubbar = Effacer tous les clubs +Radera alla klubbar och ta bort klubbtillhörighet = Effacer tous les clubs et les membres des clubs +Vill du ta bort alla klubbar från tävlingen? Alla deltagare blir klubblösa = Souhaitez-vous effacer tous les clubs de la compétition ? Aucune compétition n'aura de club. +Besökare = Visiteurs +Föregående kontroll = Poste précédent +Ja = Oui +Nej = Non +På banan = Sur le circuit +Stämpelkod = Code du poste +Tidpunkt = Temps +Antal deltagare = Competiteurs +Förekomst = Occurrence +Exporterar om = Export dans +Exportformat = Format d'export +Filnamnsprefix = Préfixe du nom de fichier +Mapp = Répertoire +Mappnamnet får inte vara tomt = Le nom du répertoire ne peut pas être vide +Onlineresultat = Résultats en ligne +Packa stora filer (zip) = Compresser les grands fichiers (zip) +Publicera resultat direkt på nätet = Publier les résultats directement sur le web +Resultat online = Résultats en ligne +Skicka till webben = Envoyer sur le web +Spara på disk = Sauver sur disque +Till exempel X = Par exemple X +Tävlingens ID-nummer = Identifiant de la compétition +URL = URL +URL måste anges = URL manquant +Tidsintervall (sekunder) = Intervalle de temps (secondes) +Antal skickade uppdateringar X (Y kb) = Nombre de mise à jour X (Y kb) +Filen finns redan: X = La destination existe déjà: X +Misslyckades med att ladda upp onlineresultat = Echec lors de la monté des résultats sur Internet +Onlineservern svarade felaktigt = Le serveur distant a fourni une réponse inattendue (Configuration incorrecte ?) +Onlineservern svarade: ZIP stöds ej = Réponse du serveur distant : ZIP non supporté. +Onlineservern svarade: Serverfel = Réponse du serveur distant: Erreur du serveur +Onlineservern svarade: Felaktigt lösenord = Réponse du serveur distant : Mot de passe incorrect +Onlineservern svarade: Felaktigt tävlings-id = Réponse du serveur distant : Identifiant de compétition incorrect +Online Results Error X = Erreur dans les résulatts en ligne X +PDF = PDF +ClassTeamLeg = Catégorie, équipe, relayeur +Okänd = Inconnu +Antal hämtade uppdateringar X (Y kb) = Nombre de mise à jour reçues X (Y kb) +Använd ROC-protokoll = Utiliser le protocole ROC +Definierade mappningar = [Defined mappings] +Funktion = Fonction +Hämta stämplingar m.m. från nätet = Retrouver des poinçons etc... depuis Internet. +Inmatning online = Saisie à distance +Kod = Code +Kontrollmappning = [Control Mapping] +Ogiltig funktion = Fonction invalide +Ogiltig kontrollkod = Code de poste invalide +Onlineinput = Saisie distante +Online Input Error X = Erreur de saisie distante X +Ekonomi = Comptabilité +Fakturainställningar = Configuration de la facturation +Hantera klubbar = Gestion des clubs +Spara som PDF = Sauver en tant que PDF +Avgifter och valuta ställer du in under = Les tarifs et les monnaies sont changés depuis +Fakturanummer = Numéro de facture +Formatering = Format +Första fakturanummer = Premier numéro de facture +Koordinater (mm) för adressfält = Coordonnées (mm) du champ d'adresse +Organisatör = Organisateur +Tilldela nya fakturanummer till alla klubbar? = Affecter un nouveau numéro de facture à tous les clubs ? +Exportera alla till PDF = Tout exporter en PDF +help:onlineresult = Le service est utilisé pour envoyer automatiquement les résultats et les listes de départ sur Internet pour publication immédiate dans des formulaires. Vous devez créer des configurations adaptées au service distant que vous voulez utiliser : le fournisseur du service distant vous fournira tous les détails utiles.\n\nSi vous voulez développer vos propres services, vous trouverez de la documentation et des exemples sur le site web de MeOS : www.melin.nu/meos. +help:onlineinput = Le service est utilisé pour recevoir les poinçons radio depuis Internet, par exemple un poste radio raccordé à l'aide d'un téléphone sans fil. Il est également possible de créer un formulaire en ligne où les numéros de dossard seront saisis manuellement au fur et à mesure des passages.\n\nLe protocole du service supporte également d'autres moyens de saisie, tels que les équipes [team line-up], des saisies directes, des changements de puce etc. Si vous voulez développer vos propres services, vous trouverez de la documentation et des exemples sur le site web de MeOS : www.melin.nu/meos. +Egna textrader = Ligne de texte personnalisée +Inga bommar registrerade = Aucune erreur de poste détectée +Inställningar sträcktidsutskrift = Configuration de l'impression des temps intermédiaires +Med km-tid = Inclure l'allure (min/km) +Tidsförluster (kontroll-tid) = Temps perdu (poste-temps) +Underlag saknas för bomanalys = Aucune donnée pour les erreurs de poste +min/km = min/km +X har redan bricknummer Y. Vill du ändra det? = X a déjà la puce Y. Voulez-vous la changer ? +Avmarkera 'X' för att hantera alla bricktildelningar samtidigt = Décocher 'X' pour gérer toutes les affectations de puces sur une seule page +Bricknr = Numéro de puce +Knyt automatiskt efter inläsning = Affectation automatique à la lecture de la puce +Knyt bricka / deltagare = Affecter une puce à un coureur +Nummerlapp, lopp-id eller namn = Dossard, identifiant de la course ou nom +Lopp-id = Identifiant de la course +Markera 'X' för att hantera deltagarna en och en = Cocher 'X' pour gérer les compétiteurs un par un +Installerbara listor = Listes pouvant être installées +Listor i tävlingen = Listes dans la compétition +Radera permanent = Suppression définitive +Tillgängliga listor = Listes disponibles +Vill du ta bort 'X'? = Voulez-vous supprimer 'X'? +classcourseresult = Résultats par catégorie et par circuit +Hantera egna listor = Gérer les listes personnalisées +Redigera = Editer +Skriver sträcktider när tävlingsdata ändras = Ecriture du fichier quand les données de la compétition changent +Bana med slingor = Circuits avec boucles +En bana med slingor tillåter deltagaren att ta slingorna i valfri ordning = Un circuit avec des boucles autorise le coureur à effectuer les boucles dans n'importe quel ordre. +Varvningskontroll = Poste commun +warn:notextended = INFO: Programmez les boîtiers en protocole étendu avec SI.Config pour accélérer la lecture de puce. +help:DirectResult = - S'il n'y a pas de circuit, le statut est mis à OK sur le poinçon d'arrivé.\n\n- S'il y a des circuits, les poinçons radio sont utilisés comme postes. Aucune lecture de puce n'est nécessaire. +Resultat vid målstämpling = Résultat sur le poinçon d'arrivée +Stämpling = Poinçon +Skicka och ta emot snabb förhandsinformation om stämplingar och resultat = Envoyez et recevoir des pré-informations rapides sur les poinçons et résultats +Centrera = Centrer +Färg = Couleur +Höger = Droite +PunchControlCode = Numéro de poste +PunchControlNumber = Numéro de poinçon +PunchControlPlace = Place sur le partiel vers le poste +PunchControlPlaceAcc = Place après le poste +PunchLostTime = Temps perdu au poste +Slå ihop text med föregående = Fusionner avec le précédent +Textjustering = Ajustement du texte +Vänster = gauche +X (press Ctrl+Space to confirm) = X (Appuyez sur + pour confirmer) +Press Enter to continue = Appuyez sur pour continuer +ask:overwriteresult = X a déjà des résultats. Voulez-vous les écraser ? +Brickan används av X = La puce est utilisée par X +DATABASE ERROR = ERREUR DE BASE DE DONNEE +Lyssnar på X = Ecoute de X +vid kontroll X = au poste X +info:runnerdbonline = Comme vous êtes connecté à un serveur, il n'est pas possible d'étiter les bases de données club et compétiteurs manuellement. Effectuez les changements avant d'uploader la compétition sur un serveur. Il est également possible de remplacer la base de données existante sur le serveur en important une nouvelle base (à partir de IOF XML). +ask:cleardb = Voulez-vous effacer les données club et compétiteurs ? +Banan saknar rogainingkontroller = La compétition n'a pas de poste de type course au score +Banans kontroller ger för få poäng för att täcka poängkravet = Les postes de type course au score n'attribuent pas assez de points +CustomSort = Ordre personnalisé +Brickhantering = Gestion des poinçons +HTML med AutoRefresh = HTML avec rafraîchissement automatique +Importera laguppställningar = Alignement des équipes importées [Import Team Line-Ups] +MeOS Funktioner = Fonctionnalités MeOS +Målfil = Fichier de destination +Spara tid = Heure enregistrée [Save time] +Stämplingstid = Instant de poinçonnage +Data from result module (X) = Données fournies par le module de résultat (X) +Forkings = Variations [Forkings] +Forkings for X = Variations pour X +Gruppera = Groupe +Resultatuträkning = Calcul des résultats +RunnerRogainingPointTotal = Total des points du compétiteur +Show forking = Montrer les variations +Standard = Standard +TeamRogainingPointTotal = Total des points de l'équipe +The forking is fair = Les variations sont équitables +Underfilter = Sous filtre +Ogiltigt lag på rad X = Equipe invalide ligne X +Okänd klass på rad X = Catégorie inconnue ligne X +Klassen X är individuell = La catégorie X est individuelle +Använd befintliga deltagare = Utiliser les compétiteurs déjà inscrits +Knyt redan anmälda deltagare till laget (identifiera genom namn och/eller bricka) = Regrouper les compétiteurs existants à l'équipe (identifiés par le nom et/ou le numéro de puce) +Laguppställning = Constitution de l'équipe [Team Line-up] +Bakåt = Retour +Bibs = Dossards +Club and runner database = Base de donnée des clubs et compétiteurs +Clubs = Clubs +Economy and fees = Gestion et frais d'inscription +Forked individual courses = Circuit individuel avec variations +General = General +Manual point reductions and adjustments = Réduction des points et ajustements +Manual time penalties and adjustments = Pénalités en temps et ajustements +MeOS Features = Fonctionnalités de MeOS +MeOS – Funktioner = MeOS – Fonctionnalités +Patrols = Equipe +Prepare start lists = Preparation des listes de départ +Relays = Relais +Several MeOS Clients in a network = Plusieurs clients MeOS en réseau +Several races for a runner = Plusieurs compétitions pour un concurrent +Spara laguppställningar = Sauver l'alignement de l'équipe [Save Team Line-Ups] +Teams and forking = Equipes et variations +Track runners in forest = Suivi des coureurs en forêt +Vacancies and entry cancellations = Places disponibles et annulation des inscriptions +Banan saknas = Circuit manquant +Klassen saknas = Catégorie absente +Alla lopp som individuella = Toutes les courses sont individuelles +Exportera individuella lopp istället för lag = Exporter comme courses individuelles au lieu de par équipe +Exportera startlista = Exporter les horaires de départ +Exporttyp = Type d'export +Exportval, IOF-XML = Configuration de l'export, IOF-XML +Failed to read file = Echec lors de la lecture du fichier. +Klassval = Sélection de catégorie +The forking is not fair = Les variations ne sont pas équitables +Unfair control legs = Branche non équitable +Växel = Passage +help:teamlineup = Ici vous pouvez importer un alignement d'équipe à partir d'un fichier texte structuré qu'il est facile de produire manuellement à partir d'un tableur. Le fichier doit avoir le format suivant :\n\nCatégorie;Nom de l'équipe;[Club]\nCompétiteur 1;[No de puce];[Club];[Circuit];[Catégorie du compétiteur]\nCompétiteur 2;[No de puce];[Club];[Circuit];[Catégorie du compétiteur]\n...\nCatégorie;Nom de l'équipe;[Club]\n...\n\nLes champs marqués entre crochets [] sont optionnels. Notez que les catégories et circuits utilisées doivent exister, et que le nombre de branches dans la catégorie doit correspondre au nombre de ligne définissant les compétiteurs après la catégorie. Des lignes vides peuvent être utilisées s'il n'y a pas de compétiteur. L'option signifie que seulement les compétiteurs déjà inscrits à la compétition sont ajoutés à l'équipe; les autres compétiteurs spécifiés sont ignorés. +Poängjustering = Point d'ajustment +Use initials in names = Utiliser les initiales comme noms +Exportera klubbar (IOF-XML) = Export des clubs (IOF-XML) +Exportera personer (IOF-XML) = Export des personnes (IOF-XML) +Töm databasen = Effacement des données +Several stages = Plusieurs étapes +Assign courses and apply forking to X = Assigner un circuit et appliquer la variation à X +Assign selected courses to selected legs = Assigner les circuits sélectionnés aux branches sélectioonnées +Calculate and apply forking = Calculer et utiliser les variations +Clear selections = Effacer les sélections +Define forking = Definir les variations +Forking setup = Configuration des variations +Leg X: Do not modify = Branche X: Ne pas modifier +Legs = Branches +help:assignforking = Cette fonction calcule un jeu de variation optimal pour les circuits sélectionnés. Affecter un ou plusieurs circuits aux branches en sélectionnant les circuits et les branches à partir des listes ci-dessus. Tous les circuits peuvent avoir le même ensemble de circuits (même variation) ou bien utiliser divers jeux de circuits pour différentes variations. De même dans ce cas, MeOS va calculer les variations de ces circuits entre eux, si les circuits le permettent. +Leg X = Branche X +Leg X: Use Y = La branche X: utilise Y +Created X distinct forkings using Y courses = X variations distinctes ont été créées à partir de Y circuits +Clear Memory = Effacement de la mémoire +Create Competition = Creation de la compétition +Print Card Data = Imprimer les données de la puce +Print card data = Imprimer les données de la puce +help:analyzecard = Cette fonction vous permet d'imprimer les données de la puce sans utiliser une quelconque compétition, comme le ferait une borne d'impression autonome. Sélectionner 'Imprimer les temps intermédiaires' pour choisir et configurer l'imprimante.\n\nLes puces sont également conservées en mémoire (mais pas dans la compétition). Vous pouvez éditer le nom et le club pour une puce en cliquant le nom (ou 'inconnu'). Vous pouvez également sauver les puces dans un fichier (Enregistrer) ou créer une nouvelle compétition à partir des données des puces. Notez que si une compétition est ouverte, vous devez la fermer pour rendre cette option disponible. +Använd endast en bana i klassen = Utiliser uniquement un circuit pour la catégorie +Gafflade banor = Circuits avec variations +Unroll split times for loop courses = Dérouler les temps intermédiaires pour les circuits en boucle. +Löpare per klass = Compétiteurs par catégorie +Alla funktioner = Toutes les fonctionnalités +Anmäl inga deltagare nu = Aucune inscription +Datum (för första start) = Date (du premier départ) +Endast grundläggande = Fonctionnalités de base +Funktioner i MeOS = Fonctionnalités de MeOS +Första tillåtna starttid = Heure du premier départ possible +Importera anmälda = Importer les inscriptions +Individuell tävling = Compétition individuelle +Namn och tidpunkt = Nom et heure +Skapar tävling = Creation de la compétition +Tävling med lag = Compétition en équipe +Tävlingen måste avgöras mellan X och Y = La compétition doit se dérouler entre X et Y +Tävlingens namn = Nom de la compétition +Välj från lista = Sélection détaillée +Välj vilka funktioner du vill använda = Sélectionnez les fonctionnalités de MeOS dont vous avez besoin pour cette compétition +Individuellt, gafflat = Individuel, avec variations +Skapa tävlingen = Créer la compétition +newcmp:featuredesc = Selectionnez les fonctionnalités de MeOS dont vous avez besoin pour cette compétition. Vous pouvez ajouter ou supprimer des fonctionnalités à tout moment en sélectionnant sur la page Compétition. +Exportera till fil = Exporter dans un fichier +FilterPrelResult = Résultats prél. +FinishTimeReverse = Temps inversés (le dernier en premier) +Open a Copy = Ouvrir une copie +Point calculation for runner = Calcul du nombre de points pour un compétiteur +Point calculation for team = Calcul du nombre de points pour l'équipe +Result score calculation for runner = Détermination du score pour un compétiteur +Result score calculation for team = Détermination du score pour une équipe +ResultDescription = Nom du type de résultat +Skapa = Créer +Status calculation for runner = Détermination du status pour un compétiteur +Status calculation for team = Détermination du status pour une équipe +Support time from control = Temps depuis le poste [Support time from control] +Support time to control = Temps vers le poste [Support time to control] +Time calculation for runner = Calcul du temps pour un compétiteur +Time calculation for team = Calcul du temps pour une équipe +TimingFrom = Nom du point de départ +TimingTo = Nom du point d'arrivée +Applying rules to the current competition = Appliquer les règles à la compétition courante +Available symbols = Symboles disponibles +Cancel = Annuler +Description = Description +Edit Clubs = Edition des clubs +Edit Result Modules = Edition des modules de résultats +Edit rule for = Editer la règle pour +Name of result module = Nom du module de résultat +New Result Module = Nouveau modul ede résultat +New Set of Result Rules = Nouvel ensemble de règles de résultat +Result Calculation = Calcul du résultat +Result Module – X = Module résultat – X +Result module identifier = Identificateur de module de résultat +Result Modules = Modules de résultats +Save = Enregistrer +Save changes = Enregistrer les changements +Source code = Code source +Test Result Module = Module de test de résultat +Result score calculation for team = Calcul du score pour l'équipe +Time: X = Temps : X +Start: X = Départ : X +Index in X[index] = Index en X[index] +X är inget giltigt index = X n'est pas un index valide +ResultModuleNumber = Module de résultat : Nombre +ResultModuleTime = Module de résultat : Temps +ResultModuleNumberTeam = Module de résultat : Nombre (pour l'équipe) +ResultModuleTimeTeam = Module de résultat : Temps (pour l'équipe) +RunnerRogainingOvertime = Dépassement de temps pour le compétiteur (course au score) +RunnerRogainingReduction = Réduction du nombre de points du compétiteur +TeamRogainingOvertime = Dépassement de temps pour l'équipe (course au score) +TeamRogainingReduction = Réduction du nombre de points pour l'équipe +Automatic rogaining point reduction = Réduction automatique du nombre de points pour la course au score +Choose result module = Choisir un module de résultat +Deviation +/- from expected time on course leg = Ecart +/- par rapport au temps estimé sur le partiel +Leg number in team, zero indexed = Partiel en équipe, indexé à partir de zéro +Length of course = Longueur du circuit +Maximum allowed running time = Temps de course maximal autorisé +Place on course leg = Classement sur le partiel du circuit +Result Modules = Modules de résultat +Runner's card, matched control ids (-1 for unmatched punches) = La puce du compétiteur correspond aux n° de poste (-1 par poinçon différents) +Runner's card, punch codes = Puce du compétiteur, n° de poinçon +Runner's card, punch times = Puce du compétiteur, heure du poinçon +Runner's course = Circuit du compétiteur +Runner's split times = Temps intermédiaires du compétiteurs +Runner's total running time to control = Temps total du compétiteur jusqu'au poste +Runner/team fee = Droit d'inscription compétiteur/équipe +Runner/team finish time = Heure d'arrivée compétiteur/équipe +Runner/team input place = Place initiale compétiteur/équipe +Runner/team input points = Points initiaux compétiteur/équipe +Runner/team input running time = Temps de course initial compétiteur/équipe +Runner/team input status = Status initial compétiteur/équipe +Runner/team place = Place compétiteur/équipe +Runner/team rogaining overtime = Dépassement du temps pour compétiteur/équipe (course au score) +Runner/team rogaining points = Point compétiteur/équipe (course au score) +Runner/team rogaining points adjustment = Ajustement des points compétiteur/équipe (course au score) +Runner/team running time = Temps de course compétiteur/équipe +Runner/team start time = Heure de départ compétiteur/équipe +Runner/team status = Status compétiteur/équipe +Runner/team time adjustment = Ajustement du temps compétiteur/équipe +Runner/team total place = Place finale compétiteur/équipe +Runner/team total running time = Temps total de course compétiteur/équipe +Runner/team total status = Status final compétiteur/équipe +Shortest time in class = Meilleur temps de la catégorie +Status as computed by your status method = Status tel que calculé par votre méthode +Status code for a missing punch = Code de status pour un poinçon manquant +Status code for a time over the maximum = Code de status en cas de dépassement du temps +Status code for a valid result = Code de status pour un résultat valide +Status code for an unknown result = Code de status pour un résultat inconnu +Status code for disqualification = Code de status pour une disqualification +Status code for not competing = Code de status en cas d'absence +Status code for not finishing = Code de status en cas d'abandon +Status code for not starting = Code de status en cas de non prise de départ +Points as computed by your point method = Points tels que calculés par votre méthode +Time as computed by your time method = Temps tel que calculé par votre méthode +Time after leg winner = Temps après le vainqueur du partiel +Finish time for each team member = Heure d'arrivée pour chaque équipier +Matched control ids (-1 for unmatched) for each team member = Postes corrects pour chaque équipier (-1 en cas de différence) +Punch codes for each team member = No de poinçon pour chaque équipier +Punch times for each team member = Heure de poinçonnage pour chaque équipier +Result Modules = Modules résultat +Rogaining points for each team member = Points pour chaque équipier (course au score) +Runner's method output numbers = Méthode de génération de nombre pour les compétiteurs [Runner's method output numbers] +Runner's method output times = Méthode de génération des temps pour les compétiteurs [Runner's method output times] +Running time for each team member = Temps de course pour chaque équipier +Start time for each team member = Heure de départ pour chaque équipier +Status for each team member = Status de cahque équipier +Check: X = Vérification : X +Debug = Debug +Debug Output = Sortie de debug +Debug X for Y = Debug X pour Y +Do you want to clear the card memory? = Voulez vous effacer la puce ? +Portable Document Format (PDF) = Portable Document Format (PDF) +Poängavdrag = Réduction de point +RunnerPointAdjustment = Ajustement des points du compétiteur +RunnerTimeAdjustment = Ajustement du temps du compétiteur +Save changes in rule code? = Enregistrer les changements dans le code de la règle ? +Symboler = Symboles +TeamPointAdjustment = Ajustement des points de l'équipe +TeamTimeAdjustment = Ajustement du temps de l'équipe +Variabler = Variables +Check: X = Véfification : X +Choose result module = Choisir le module de résultat +Result Modules = Modules de résultat +Error in result module X, method Y (Z) = Erreur dans le module de résultat 'X', méthode 'Y'\n\nZ +Invalid operator X = Opérateur invalide X +Unknown symbol X = Symbole inconnu X +RunnerGlobal = Competiteur (catégories regroupées) +TeamGlobal = Equipe (catégories regroupées) +List Error: X = Erreur de liste : X +Rader markerade med (*) kommer från en lista i tävlingen = Les lignes avec une (*) proviennent d'une liste de la compétition +Resultatmodulen används i X = Le module de résultat est utilisé dans X +Valfri = Optionnel +Vill du sätta resultatet från tidigare etapper till ? = Voulez vous modifier le résultat des étapes précédentes en (Not taking part = absent)? +Hantera deltagare som bytt klass = Traitement des compétiteurs qui ont changé de catégorie +Välj klasser med nya anmälningar = Spécifiez les catégories pour lesquelles de nouvelles inscriptions sont autorisées +Byt till rätt klass (behåll eventuell starttid) = Basculer vers la bonne catégorie (conserver l'heure de départ) +Byt till vakansplats i rätt klass (om möjligt) = Déplacer vers un horaire vaquant dans la bonne catagorie (si possible) +Tillåt ny klass, behåll resultat från annan klass = Autoriser de nouvelles catégories et conserver les résultats des autres catégories +Tillåt ny klass, inget totalresultat = Autoriser de nouvelels catégories mais sans résultat global +tooltip_explain_status = - = Status inconnu (pas encore de résultat)\nOK = Résultat valide\nDNS = Did Not Start (non parti)\nMP = Missing Punch (poiçon manquant)\nDNF = Did Not Finish (abandon)\nDISQ = Disqualifié\nOMT = Over Maximum Time (dépassement du temps maxi)\nNTP = Not Taking Part (absent) +Placering = Place +Resultat från tidigare etapper = Résultats des étapes précédentes +Input Results = Saisir les résultats [Input Results] +Input Results - X = Saisir les résultats - X +Individuella resultat = Résultats individuels +Avdrag = Réduction +Team Rogaining = Course au score en équipe +Övertid = Dépassement en temps +Kunde inte öppna tävlingen = Ouverture de la compétition impossible +warn:opennewversion = La compétition a été créée avec MeOS X. Les données peuvent être perdues si vous continuez.\n\nVoulez vous continuer ? +District id number = Identifiants distincts +Kunde inte ladda X\n\n(Y) = Chargement impossible de X\n\n(Y) +Narrow Results = Réduire la liste des résultats +Club id number = Identifiant du club +User input number = Paramètre saisi par l'utilisateur +listinfo:singleclub = Créer une liste de résultats pour un seul club.\nUtilisez le paramètre de saisi pour spécifier l'identifiant du club. +listinfo:inputresults = Afficher les résultats initiaux depuis les étapes précédentes. +Ett värde vars tolkning beror på listan = Une valeur ayant une interprétation dépendant d'une liste +Listparameter = Paramètre de la liste +Individual results in a club = Résultats individuel au sein du club +OL-Skytte med tidstillägg = Orientation/Tir avec pénalité en temps +OL-Skytte utan tidstillägg = Orientation/Tir sans pénalité en temps +OL-Skytte stafettresultat = Relais Orientation/Tir +Sluttid = Temps final +olshooting:timepunishment = Liste de résultats Orientation/Tir avec pénalité en temps.\n\nActiver les support pour la course au score et les ajustements manuels de points. Utilisez ensuite la réduction de points sur la page Compétiteurs pour spécifier les pénalités sous la forme PPPLLSS, où PPP est l'erreur de position en millimètres, LL est le nombre de tirs ratés allongé et SS est le nombre de tirs ratés debout. Exemple 30201 signifie 3 mm d'erreur, 2 tirs allongés et 1 tir debout ratés. +olshooting:notimepunishment = Liste de résultats Orientation/Tir sans pénalité en temps.\n\nActiver les support pour la course au score et les ajustements manuels de points. Utilisez ensuite la réduction de points sur la page Compétiteurs pour spécifier les pénalités sous la forme LLSS, où LL est le nombre de tirs ratés allongé et SS est le nombre de tirs ratés debout. Exemple: 0201 signifie 2 tirs allongés et 1 tir debout ratés. +Namnet kan inte vara tomt = Le nom ne peut pas être vide +Ingen / okänd = Aucun / inconnu +Inget nummer = Aucun nombre +Stafettresultat = Résultats de relais +Döp om X = Renommer X +Gräns för maxtid = Barrière horaire (OMT) +Individual Example = Exemple de course individuelle +Long = Longue +MeOS Three Days Race X = Les 3 jours MeOS X +Medium = Moyenne +Open = Ouvrir +Open X = Ouvrir X +Prologue + Pursuit = Prologue + Poursuite +Relay Example = Exemple de relais +Short = Court +Ultra Long = Ultra Longue +Tillgängliga filer installerades. Starta om MeOS. = Les configurations ont été installées. Redémarrez MeOS S.V.P. +edit_in_forest = Gérer\nCompétiteurs en forêt +Latest Results = Résultats récents +warning:direct_result = Notez que l'utilisation de nécessite que tous les poinçons de tous les postes du circuit aient été transmis comme poste radio, ou que MeOS soit utilisé pour chronométrer uniquement sans tenir compte du circuit.\n\nUtiliser les résultats sur poinçon d'arrivée ? +Inställningar startbevis = Configuration de l'impression des tickets de départ +Skrivarinställningar = Configuration de l'impression +Skrivarinställningar för sträcktider och startbevis = Configuration de l'impression des tickets de temps intermédiaires et de départ +Startbevis = Ticket de départ +Startbevis X = Ticket de départ X +Skriv ut startbevis = Ticket de départ +Skriv ut startbevis för deltagaren = Imprimer le ticket de départ du coureur +Utskrift = Imprimer +Från klassen = de la catégorie +Tillsätt ytterligare vakans = Fill Another Vacancy +Överföring = Transférer +Anmäl till efterföljande etapper = Enter for subsequent stages +Totalt antal etapper = Nombre total d'étapes +Vill du använda den nya brickan till alla etapper? = +Avkortad banvariant = Course raccourcie +Avkortning = Raccourci +Hantera laget = Gérer l'équipe +Med avkortning = Avec raccourci +info_shortening = Sélectionnez un circuit existant qui raccourcit le circuit sélectionné. Plusieurs niveaux de raccourcissement sont possibles. +Tilldela starttider = Attribuer des heures de départ +Avkortar: X = Raccourcit: X +Vill du nollställa alla manuellt tilldelade banor? = Voulez-vous effacer tous les circuits manuellement attribués ? +Ange löpande numrering eller första nummer i klassen = Specify consecutive numbering between classes or specify first number in class +Ange relation mellan lagets och deltagarnas nummerlappar = Specify the relation between team's bib and team member's bibs +Lagmedlem = Membre de l'équipe +Löpande = Consécutif +Oberoende = Indépendant +Samma = Same +Ökande = Increasing +Manuell = Manuel +Vill du uppdatera alla nummerlappar? = Do you want to update all bibs? +Hela banan = Circuit entier +Ogiltigt maximalt intervall = Intervalle maximum invalide +Startintervallet får inte vara kortare än basintervallet = +Ett startintervall måste vara en multipel av basintervallet = A start interval must be a multiple of the base interval +Ogiltigt minimalt intervall = Intervalle minimum invalide +Ogiltigt basintervall = Intervalle de base invalide +Country = Pays +CourseShortening = Raccourcissement de course +Nationality = Nationalité +Number of shortenings = Nombre de raccourcissements +Längd = Distance +Redigera sträcklängder = Modifier les distances +Redigera sträcklängder för X = Modifier les distances du circuit 'X' +Oordnade parallella sträckor = Out of order parallel legs +Tillåt löpare inom en parallell grupp att springa gruppens banor i godtycklig ordning = Allow competitors within a parallel group to run the courses of the group in any order +Laguppställningen hade fel, som har rättats = The team line-up had errors, which have been corrected +ControlClasses = Control's classes +ControlCodes = Control's punch codes +ControlCourses = Control's courses +ControlMaxLostTime = Control, lost time, maximum +ControlMedianLostTime = Control, lost time, median +ControlMistakeQuotient = Control, quotient of runners with lost time +ControlName = Control's name +ControlPunches = Control's actual number of visitors +ControlRunnersLeft = Control's remaining number of visitors +ControlVisitors = Control's expected number of visitors +CourseClasses = Course's classes +CourseUsage = Course's number of required maps +CourseUsageNoVacant = Course's number of entries excluding vacant positions +Bomkvot = Quotient d'erreur +Control = Control +Control Statistics = Statistiques postes +Control Statistics - X = Statistiques poste - X +Course = Course +FilterSameParallel = Collect parallel legs +Kontrollrapport - X = Control Report - X +Maxbom = Erreur maximale +Control Overview = Control Overview +Medianbom = Erreur médiane +N.N. = X +Endast på obligatoriska sträckor = Only process non-optional legs. +Fyll obesatta sträckor i alla lag med anonyma tillfälliga lagmedlemmar (N.N.) = Fill vacant legs in all teams with anonymous temporary team members (X) +Skapa anonyma lagmedlemmar = Appoint Anonymous Team Members +Tillsätt tillfälliga anonyma lagmedlemmar = Appoint Anonymous Team Members +Tillsätt = Appoint +help:anonymous_team = Create and appoint (temporary) team members for all teams, to whom you can assign SI Card, Course etc. +Anonymt namn = Anonymous name +Med anmälningsavgift (lagets klubb) = With entry fee (for the team club) +Tar bort X = Removing X +Källa = Source +Ta bort eventuella avanmälda deltagare = Supprimer les inscriptions annulées si nécessaire +Verktyg = Tools +Automatisk = Automatic +Avstånd = Distance +Extra avstånd ovanför textblock = Extra distance above +FilterSameParallelNotFirst = Collect parallel legs, skip first +RunnerLeg = Competitor (specific leg) +Texten ska innehålla tecknet X, som byts ut mot tävlingsspecifik data = The text must include the symbol X, which is replaced by competition specific data +Tabellverktyg = Table tools +Antal reserverade nummerlappsnummer mellan klasser = Nombre de dossards réservés entre les catégories +help:bibs = You can handle bibs automatically or manually. Here you can assign bibs manually for a certain class by specifying the method Manual and provide the first number in the class.\n\nThe method automatic works in the same way, with the difference that MeOS will update the bibs of all classes at once. Although it is possible to make this setting here, it is better to use the Quick settings for classes to get an overview over all classes.\n\nUse the method Automatic together with the methods None or Consecutive, which means that the last number in the preceding class is used as first number. The number of reserved bibs specifies the jump made in the numbering between classes.\n\nFor team classes you can specify how the competitors´ bibs relate to the team´s bib. It can be the Same, Independent, Increasing (Team 1: 101, 102, 103, 104, Team 2: 111, 112, 113, 114 etc) or Leg (100-1, 100-2, 100-3 etc). +RunnerGeneralPlace = Competitor's team's or individual place +RunnerGeneralTimeAfter = Competitor's team's or individual time after +RunnerGeneralTimeStatus = Competitor's team's or individual time / status +open_error = Failed to open X.\n\nY. +open_error_locked = This competition is already open in MeOS.\n\nYou have to use a database to open more than one instance of the competition. +Ogiltigt bricknummer = Invalid card number +ask:updatelegs = Lengths of individual course legs may require an update after this change.\n\nDo you wish fix that now? +warn:updatelegs = Lengths of individual course legs may require an update after this change. +Ingen deltagare vald = No competitor selected +Från klubben = From the Club +Från laget = From the Team +Gafflingsnyckel X = Forking Key X +help:teamwork = The runners swap position. You can make a sequence of swaps to reach the new team line-up. +Ordnat = Ordered +Str. X = Leg X +Vill du att X går in i laget? = Do you want to put X in the team? +Vill du att X och Y byter sträcka? = Do you want X and Y to switch leg? +Vill du att X tar sträckan istället för Y? = Do you want X to run the leg instead of Y? +Ändra lagets gaffling = Change Team Forking +Deltagarens klass styrs av laget = The class is defined by the team +För att delta i en lagklass måste deltagaren ingå i ett lag = To participate in a team class you need to assign a team to the competitor +Dela upp = Split +Alla sträckor = All legs +Liveresultat, deltagare = Live Results, individual +Använd enhets-id istället för tävlings-id = Use Unit ID instead of competition ID +Enhetens ID-nummer (MAC) = Unit ID (MAC) +Antal deltagare: X = Number of competitors: X +Dela efter placering = Split by result +Dela efter tid = Split by time +Dela slumpmässigt = Random split +Jämna klasser (placering) = Make equal classes (result) +Jämna klasser (ranking) = Make equal classes (ranking) +Jämna klasser (tid) = Make equal classes (time) +Klass X = Class X +Not yet implemented = Not yet implemented +Tidstillägg = Pénalité (M:S) +help:seeding_info = Seeded start time allocation means that an earlier result or ranking controls the process in part. In the field seeding groups you may either enter a single group size, meaning that the entire class is partitioned into groups of this size. The group size "1" means that the seeding order is strictly used. You can also specify several group sizes. "15, 1000" would meen a seeded group with the 15 highest ranked runners and the remaining (at most 1000) runners are placed in a non-seeded group. +Ange en gruppstorlek (som repeteras) eller flera kommaseparerade gruppstorlekar = Supply one group size (to be repeated) or several comma separated sizes +Hindra att deltagare från samma klubb startar på angränsande tider = Prevent competitors from the same club to start on adjacent start times. +Låt de bästa start först = Let the highest ranked start first +Seedningsgrupper = Seeding groups +Seedningskälla = Seeding source +error:invalidmethod = The selected method gave no distribution. Source data is insufficient. +Ogiltig storlek på seedningsgrupper X = Invalid size of seeding groups: X +Bananvändning = Fréquentation des circuits +Antal banor = Number of courses +Could not load list 'X' = Could not load list 'X' +Från den här listan kan man skapa etiketter att klistra på kartor = From this list, you can create labels to stick on the maps +Gafflingar i tabellformat = Forkings in table format +Vakanser - X = Vacancies - X +Kopiera = Copy +Kopiera till urklipp = Copy to the clipboard +RunnerStartCond = Competitor's start time (if individual) +StartTimeForClassRange = Class start time range +TeamStartCond = Team's start time (if individual) +Liveresultat = Resultats live +Visa rullande tider mellan kontroller i helskärmsläge = Show rolling times between controls in full screen mode +help:liveresultat = This method starts a timer in full screen mode (large-screen) when a competitor in a selected class punches the control, and measures the time until the control is reached. Otherwise a top list with the best results is shown. Both controls need of course be online controls and if you use a network, make sure to activate to get a responsive timer. +Result at a control = Result at a control +Total/team result at a control = Total/team result at a control +prefsAccount = Numéro de compte par défaut +prefsAddress = Adresse par défaut +prefsAdvancedClassSettings = Afficher les paramètres avancés des catégories +prefsAutoSaveTimeOut = Intervalle de sauvegarde automatique (ms) +prefsCardFee = Default card fee +prefsClient = Name of client in a network +Vissa inställningar kräver omstart av MeOS för att ha effekt = Certains paramètres nécessitent le redémarrage de MeOS pour prendre effet +prefsAutoTie = Lier automatiquement coureur et puce +prefsControlFrom = Last from control +prefsControlTo = Last to control +prefsCurrencyFactor = Facteur d'échelle monétaire +prefsCurrencyPreSymbol = Placer le symbole monétaire en premier +prefsCurrencySeparator = Séparateur décimal monétaire +prefsCurrencySymbol = Symbole monétaire +prefsDatabase = Utiliser la base de données des coureurs +prefsDatabaseUpdate = Last runner database update +prefsDefaultDrawMethod = Default draw method +prefsDirectPort = Network port for advance punch data +prefsEMail = EMail +prefsEliteFee = Default elite fee +prefsEntryFee = Default entry fee +prefsEventorBase = URL to Eventor +prefsFirstInvoice = First invoice number +prefsFirstTime = First startup +prefsHomepage = Site web +prefsInteractive = Interactive card handling +prefsLateEntryFactor = Factor for late entry fee +prefsLiveResultFont = Font used for live results +prefsMIPURL = URL to MIP server +prefsMOPFolderName = Local MOP folder +prefsMOPURL = URL to MOP server +prefsManualInput = Use manual result input +prefsMaximumSpeakerDelay = Maximum delay in speaker update +prefsOrganizer = Organisateur +prefsPort = MySQL network port +prefsRentCard = Rent card +prefsSeniorAge = Upper age limit +prefsServer = Serveur réseau par défaut +prefsSpeakerShortNames = Use initials in names +prefsStreet = Organizer street address +prefsSynchronizationTimeOut = Network update timeout (ms) +prefsTextFont = Police utilisée par MeOS +prefsUseDirectSocket = Use advance punch data +prefsUseEventor = Utiliser Eventor +prefsUseEventorUTC = Use universal coordinated time with Eventor +prefsUseHourFormat = Use fromat HH:MM:SS instead of MMM:SS +prefsUserName = Identifiant MySQL +prefsYouthAge = Low age limit +prefsYouthFee = Reduced fee +prefsaddressxpos = Address x-coordinate +prefsaddressypos = Address y-coordinate +prefsclasslimit = Limit shown results per class +prefsintertime = Show intermediate times +prefspagebreak = Ajouter des sauts de page +prefssplitanalysis = Analyser les temps intermédiaires +Ändra MeOS lokala systemegenskaper = Paramètres de MeOS +true[boolean] = true +false[boolean] = false +Ändra X = Change X +Ingen parstart = Individual start +Parvis (två och två) = Pairwise (two by two) +X och Y[N by N] = X by Y +Lotta klasser med samma bana gemensamt = Draw classes with the same course together +Lotta starttider = Définir les horaires de départ +Lotta klasser med banan X = Définir les horaires de départ du circuit 'X' +MeOS Timing = MeOS Timing +Med resultat = Avec les résultats +Säkerhetskopiering = Sauvegarde périodique +Destination: X = Destination: X +Ogiltig destination X = Invalid destination X +Säkerhetskopierar om = Backing up in +Year of birth = Year of birth +Ogiltigt antal sekunder: X = Invalid number of seconds: X +Du kan använda en SI-enhet för att läsa in bricknummer = You can use an SI unit to read card the number +Ignorera startstämpling = Ignorer le poinçon de départ +Uppdatera inte starttiden vid startstämpling = Ne pas mettre à jour l'horaire de départ avec le poinçon de départ +Ändra lokala inställningar = Modifier les paramètres +Gafflingsnyckel = Forking key +Felaktigt datumformat 'X' (Använd ÅÅÅÅ-MM-DD) = Incorrect date format 'X' (Use YYYY-MM-DD) +Felaktigt tidsformat 'X' (Använd TT:MM:SS) = Incorrect time format 'X' (Use HH:MM:SS) +Hämta inställningar från föregående lottning = Fetch settings from previous sessions +Ej startstämpling = Disregard start punch +Extraplatser = Extra places +Fritt = Free +Från lag = From team +Lag + sträcka = Team + leg +Nummerlappshantering = Bib managemant +Oordnade parallella = Unordered parallel +Spara starttider = Save start times +X platser. Startar Y = X places. Starts Y +övriga = other +RunnerStartZero = Competitor's relative start time (zero time) +TeamStartZero = Team's relative start time (zero time) +Datumfilter = Date filter +Inget filter = No filter +Inlästa stämplar = Read punches +Löpare saknas = No competitor +Klasserna X och Y har samma externa id. Använd tabelläget för att ändra id = The classes X and Y have the same external id. Use the table mode to correct the id +Vill du koppla isär X från inläst bricka Y? = Would you like to disconnect X from the read out card Y? +RunnerRogainingPointGross = Rogaining points before reduction +Samlade poäng = Collected points +Tidsavdrag = Deduction +X p = X p +Bricka X används också av = Card X is also used by +reused card = reused card +Varning: Brickan X används redan av Y = Warning: The card X is already used by Y +Invalid filter X = Invalid filter X +Invalid font X = Invalid font X +Aktivera stöd för tider över 24 timmar = Supporter les durées de course de plus de 24h. +Inkludera information om flera lopp per löpare = Include information about multiple races for a single runner. +Alla uthyrda brickor har bockats av = All rented cards are ticked off +Avbockade brickor = Ticked off cards +Avstämning hyrbrickor = Count returned hired cards +Brickor markerade som både uthyrda och egna: X = Cards used as both hired and owned: X +Nollställ = Clear +Nollställ minnet; markera alla brickor som icke avbockade = Clear memery; forget all ticked off cards +Rapport = Report +Totalt antal unika avbockade brickor: X = Number of unique ticked off cards: X +Uthyrda brickor som inte avbockats = Hired cards that are not ticked off +Uthyrda: X, Egna: Y, Avbockade uthyrda: Z = Hired Cards: X, Owned Cards: Y, Hired and Ticked Off: Z +Vill du göra om avbockningen från början igen? = Do you want to reset and begin all over again? +help:checkcards = Use this function to count and tick off hired cards to check that they all have been returned. Attach a SI unit (preferrably programmed as a control or finish, since that is faster than card read out), and punch all returned cards. Push the Report button to see if any card is missing.\n\n The check is done locally at this computer, and does not modify the competition. +Betalningsmetoder = Modes de paiement +help:paymentmodes = Vous pouvez définir des modes de paiement personnalisés, en complément des informations de facturation, afin de faciliter la comptabilité. +Betalsätt = Payment Mode +Förväntat antal besökare: X = Expected number of visitors: X +Starttiden är definerad genom klassen eller löparens startstämpling = The start time is defined through the class or through a start punch +sekunder = seconds +är X före Y = is X before Y +var först i mål med tiden X = was first to the finish with time X +var först vid X med tiden Y = was first at X with time Y +var först vid växeln med tiden X = was first to the changeover with time X +är nu på X plats med tiden Y = is now on a X place with time Y +är nu på delad X plats med tiden Y = is now on a shared X place with time Y +är X efter = is X behind +är X efter Y = is X behind Y +är X efter; har tappat Y = is X behind; has lost Y +är X efter; har tagit in Y = is X behind; as gained Y +leder med X; har tappat Y = leads with X; has lost Y +leder med X; sprang Y snabbare än de jagande = leads with X; ran Y faster than the others +leder med X = leads with X +delar placering med X = shares place with X +sekund = second +skickar ut X = sends out X +Import names as "surname, first name" = Importer les noms sous la forme "nom de famille, prénoms" +Use French Federation of Orienteering mapping = Utiliser le format de la Fédération Française de CO +Export language = Langue +Export Split Times = Exporter les temps intermédiaires +Filename OE (csv) with runners and clubs = Nom de fichier OE (csv) avec coureurs et clubs +Climb (m) = Dénivelée (m) +Utrymme: X = Taille: X +[Radera] = [Supprimer] +ClassTeamLegResult = Résultat par catégorie et relayeur +Databaskälla = Base de donnée source +Export split times = Exporter les temps intermédiaires +Filnamn IOF (xml) eller OE (csv) med löpare = Fichier IOF (xml) ou OE (csv) avec coureurs +Importinställning = Préférences d'importation +Längsta tid i sekunder att vänta med utskrift = Délai maximum d'attente de l'impression en seconde +Max antal brickor per sida = Nombre maximum de puces par page +Resultat efter sträcka X = Résultats après le partiel X +SortLastNameOnly = Nom de famille +Sträcktider i kolumner (f?r standardpapper) = Temps en colonnes (papier standard) +prefsExportCSVSplits = Inclure les temps intermédiaires dans l'export csv +prefsExportFormat = Format d'exportation par défaut +prefsImportOptions = Options d'importation par défaut +prefsNumSplitsOnePage = Nombre de puces par page +prefsPayModes = Modes de paiement +prefsSplitLateFees = Séparer les frais d'inscription en frais standards et frais d'inscription tardive pour l'exportation IOF XML +prefsSplitPrintMaxWait = Temps d'attente maximum lors de l'impression des temps intermédiaires +prefsWideSplitFormat = Imprimer les temps intermédiaires en grand format +sträcka X = Partiel X diff --git a/code/gdiconstants.h b/code/gdiconstants.h new file mode 100644 index 0000000..e0cfc0c --- /dev/null +++ b/code/gdiconstants.h @@ -0,0 +1,44 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#ifndef GDI_CONSTANTS +#define GDI_CONSTANTS + +#include "gdifonts.h" + +enum KeyCommandCode { + KC_NONE, + KC_COPY, + KC_PASTE, + KC_DELETE, + KC_INSERT, + KC_PRINT, + KC_FIND, + KC_FINDBACK, + KC_REFRESH, + KC_SPEEDUP, + KC_SLOWDOWN, + KC_AUTOCOMPLETE, +}; + +const int GDI_BUTTON_SPACING = 8; +#endif diff --git a/code/gdifonts.h b/code/gdifonts.h new file mode 100644 index 0000000..a5557de --- /dev/null +++ b/code/gdifonts.h @@ -0,0 +1,78 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2012 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#pragma once + +enum gdiFonts { + normalText=0, + boldText=1, + boldLarge=2, + boldHuge=3, + boldSmall=5, + + italicText = 6, + italicMediumPlus = 7, + monoText = 8, + + fontLarge=11, + fontMedium=12, + fontSmall=13, + fontMediumPlus=14, + + italicSmall = 15, + formatIgnore = 1000, +}; + +const int pageNewPage=100; +//const int pageReserveHeight=101; +const int pagePageInfo=102; + +const int textRight=256; +const int textCenter=512; +const int timerCanBeNegative=1024; +const int breakLines=2048; +const int fullTimeHMS = 4096; +const int timeWithTenth = 1<<13; +const int timeSeconds = 1<<14; +const int timerIgnoreSign = 1<<15; +const int Capitalize = 1<<16; + +enum GDICOLOR {colorBlack = RGB(0,0,0), + colorRed = RGB(128,0,0), + colorGreen = RGB(0,128,0), + colorDarkGrey = RGB(40,40,40), + colorDarkRed = RGB(64,0,0), + colorGreyBlue = RGB(92,92,128), + colorDarkBlue = RGB(0,0,92), + colorDarkGreen = RGB(0,64,0), + colorYellow = RGB(255, 230, 0), + colorLightBlue = RGB(240,240,255), + colorLightRed = RGB(255,230,230), + colorLightGreen = RGB(180, 255, 180), + colorLightYellow = RGB(255, 255, 200), + colorLightCyan = RGB(200, 255, 255), + colorLightMagenta = RGB(255, 200, 255), + colorMediumRed = RGB(255,200,200), + colorMediumDarkRed = RGB(240,120,120), + colorWindowBar = -2, + colorDefault = -1}; + diff --git a/code/gdiimpl.h b/code/gdiimpl.h new file mode 100644 index 0000000..796fe03 --- /dev/null +++ b/code/gdiimpl.h @@ -0,0 +1,76 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#pragma once + +class gdioutput; +struct FontInfo; + +class GDIImplFontSet { + HFONT Huge; + HFONT Large; + HFONT Medium; + HFONT Small; + + HFONT pfLarge; + HFONT pfMedium; + HFONT pfSmall; + HFONT pfMediumPlus; + HFONT pfMono; + + HFONT pfSmallItalic; + HFONT pfItalicMediumPlus; + HFONT pfItalic; + void deleteFonts(); + + string gdiName; + mutable vector avgWidthCache; + int charSet; +public: + static float baseSize(int format, float scale); + void getInfo(FontInfo &fi) const; + + GDIImplFontSet(); + virtual ~GDIImplFontSet(); + void init(double scale, int charSet, const string &font, const string &gdiName); + void selectFont(HDC hDC, int format) const; + HFONT getGUIFont() const {return pfMedium;} + HFONT getFont(int format) const; + double getAvgFontWidth(const gdioutput &gdi, gdiFonts font) const; +}; + +class GDIImplFontEnum { +private: + int width; + int height; + double relScale; + string face; +public: + GDIImplFontEnum(); + virtual ~GDIImplFontEnum(); + + const string &getFace() const {return face;} + double getRelScale() const {return relScale;} + + friend int CALLBACK enumFontProc(const LOGFONT* logFont, const TEXTMETRIC *metric, DWORD id, LPARAM lParam); +}; + diff --git a/code/gdioutput.cpp b/code/gdioutput.cpp new file mode 100644 index 0000000..166cc73 --- /dev/null +++ b/code/gdioutput.cpp @@ -0,0 +1,6544 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +// gdioutput.cpp: implementation of the gdioutput class. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "gdioutput.h" +#include "gdiconstants.h" +#include "meosException.h" + +#include "process.h" + +#include "meos.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "meos_util.h" +#include "Table.h" + +#define _USE_MATH_DEFINES +#include "math.h" + +#include "Localizer.h" + +#include "TabBase.h" +#include "toolbar.h" +#include "gdiimpl.h" +#include "Printer.h" +#include "recorder.h" + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + + +//Fulhack... +#ifndef IDC_HAND + #define IDC_HAND MAKEINTRESOURCE(32649) +#endif + +//#define DEBUGRENDER + +#ifdef DEBUGRENDER + static int counterRender = 0; + static bool breakRender = false; + static int debugDrawColor = 0; +#endif + + +GuiHandler &BaseInfo::getHandler() const { + if (handler == 0) + throw meosException("Handler not definied."); + return *handler; +} + +void GuiHandler::handle(gdioutput &gdi, BaseInfo &info, GuiEventType type) { + throw meosException("Handler not definied."); +} + +InputInfo::InputInfo() : hWnd(0), callBack(0), ignoreCheck(false), + isEditControl(true), bgColor(colorDefault), fgColor(colorDefault), + writeLock(false), updateLastData(0) {} + + +EventInfo::EventInfo() : callBack(0), keyEvent(KC_NONE) {} + +/** Return true if rendering text should be skipped for + this format. */ +bool gdioutput::skipTextRender(int format) { + format &= 0xFF; + return format == pageNewPage || + format == pagePageInfo; +} + +#ifndef MEOSDB + +gdioutput::gdioutput(const string &_tag, double _scale, FontEncoding encoding) : + recorder((Recorder *)0, false) { + tag = _tag; + fontEncoding = encoding; + po_default = new PrinterObject(); + tabs = 0; + hasAnyTimer = false; + constructor(_scale); + + isTestMode = false; +} + +gdioutput::gdioutput(double _scale, FontEncoding encoding, HWND hWnd, const PrinterObject &prndef) : + recorder((Recorder *)0, false) { + fontEncoding = encoding; + hasAnyTimer = false; + po_default = new PrinterObject(prndef); + tabs = 0; + setWindow(hWnd); + constructor(_scale); + + isTestMode = false; +} + +void gdioutput::constructor(double _scale) +{ + currentFontSet = 0; + commandLock = false; + commandUnlockTime = 0; + lockUpDown = false; + + Background = 0; + + toolbar = 0; + initCommon(_scale, "Arial"); + + OffsetY=0; + OffsetX=0; + + manualUpdate = false; + + itTL = TL.end(); + + hWndTarget = 0; + hWndToolTip = 0; + hWndAppMain = 0; + onClear = 0; + postClear = 0; + clearPage(true); + hasCleared = false; + highContrast = false; + hideBG = false; + fullScreen = false; + lockRefresh = 0; + autoSpeed = 0; + autoPos = 0; + lastSpeed = 0; + autoCounter = 0; +} + +#endif + +void gdioutput::setFont(int size, const string &font, FontEncoding enc) +{ + setEncoding(enc); + double s = 1+size*sqrt(double(size))*0.2; + initCommon(s, font); +} + +void gdioutput::setFontCtrl(HWND hWnd) { + SendMessage(hWnd, WM_SETFONT, (WPARAM) getGUIFont(), MAKELPARAM(TRUE, 0)); +} + +static void scaleWindow(HWND hWnd, double scale, int &w, int &h) { + RECT rc; + GetWindowRect(hWnd, &rc); + w = rc.right - rc.left; + h = rc.bottom - rc.top; + w = int(w * scale + 0.5); + h = int(h * scale + 0.5); +} + +int transformX(int x, double scale) { + if (x<40) + return int(x * scale + 0.5); + else + return int((x-40) * scale + 0.5) + 40; +} + +void gdioutput::scaleSize(double scale_) { + if (fabs(scale_ - 1.0) < 1e-4) + return; // No scaling + double ns = scale*scale_; + + if (ns + 1e-6 < 1.0 ) { + ns = 1.0; + scale_ = 1.0; + } + initCommon(ns, currentFont); + + for (list::iterator it = TL.begin(); it!=TL.end(); ++it) { + it->xlimit = int(it->xlimit * scale_ + 0.5); + it->xp = transformX(it->xp, scale_); + it->yp = int(it->yp * scale_ + 0.5); + } + int w, h; + OffsetY = int (OffsetY * scale_ + 0.5); + OffsetX = int (OffsetX * scale_ + 0.5); + + for (list::iterator it = BI.begin(); it!=BI.end(); ++it) { + if (it->fixedRightTop) + it->xp = int(scale_ * it->xp + 0.5); + else + it->xp = transformX(it->xp, scale_); + + it->yp = int(it->yp * scale_ + 0.5); + + if (it->isCheckbox) + scaleWindow(it->hWnd, 1.0, w, h); + else + scaleWindow(it->hWnd, scale_, w, h); + setFontCtrl(it->hWnd); + MoveWindow(it->hWnd, it->xp-OffsetX, it->yp-OffsetY, w, h, true); + } + + for (list::iterator it = II.begin(); it!=II.end(); ++it) { + it->xp = transformX(it->xp, scale_); + it->yp = int(it->yp * scale_ + 0.5); + it->height *= scale_; + it->width *= scale_; + setFontCtrl(it->hWnd); + MoveWindow(it->hWnd, it->xp-OffsetX, it->yp-OffsetY, int(it->width+0.5), int(it->height+0.5), true); + } + + for (list::iterator it = LBI.begin(); it!=LBI.end(); ++it) { + it->xp = transformX(it->xp, scale_); + it->yp = int(it->yp * scale_ + 0.5); + it->height *= scale_; + it->width *= scale_; + setFontCtrl(it->hWnd); + MoveWindow(it->hWnd, it->xp-OffsetX, it->yp-OffsetY, int(it->width+0.5), int(it->height+0.5), true); + } + + for (list::iterator it = Rectangles.begin(); it!=Rectangles.end(); ++it) { + it->rc.bottom = int(it->rc.bottom * scale_ + 0.5); + it->rc.top = int(it->rc.top * scale_ + 0.5); + it->rc.right = transformX(it->rc.right, scale_); + it->rc.left = transformX(it->rc.left, scale_); + } + + for (list::iterator it = Tables.begin(); it != Tables.end(); ++it) { + it->xp = transformX(it->xp, scale_); + it->yp = int(it->yp * scale_ + 0.5); + } + + MaxX = transformX(MaxX, scale_); + MaxY = int (MaxY * scale_ + 0.5); + CurrentX = transformX(CurrentX, scale_); + CurrentY = int (CurrentY * scale_ + 0.5); + SX = transformX(SX, scale_); + SY = int (SY * scale_ + 0.5); + + for (map::iterator it = restorePoints.begin(); it != restorePoints.end(); ++it) { + RestoreInfo &r = it->second; + r.sMX = transformX(r.sMX, scale_); + r.sMY = int (r.sMY * scale_ + 0.5); + r.sCX = transformX(r.sCX, scale_); + r.sCY = int (r.sCY * scale_ + 0.5); + r.sOX = transformX(r.sOX, scale_); + r.sOY = int (r.sOY * scale_ + 0.5); + + } + refresh(); +} + +void gdioutput::initCommon(double _scale, const string &font) +{ + dbErrorState = false; + currentFontSet = 0; + scale = _scale; + currentFont = font; + deleteFonts(); + enableTables(); + lineHeight = int(scale*14); + + Background=CreateSolidBrush(GetSysColor(COLOR_WINDOW)); + + fonts[currentFont].init(scale, getCharSet(), currentFont, ""); +} + +double getLocalScale(const string &fontName, string &faceName) { + double locScale = 1.0; + vector res; + split(fontName, ";", res); + + if (res.empty() || res.size() > 2) + throw meosException("Cannot load font: " + fontName); + if (res.size() == 2) { + locScale = atof(res[1].c_str()); + if (!(locScale>0.001 && locScale < 100)) + throw meosException("Cannot scale font with factor: " + res[1]); + } + faceName = res[0]; + return locScale; +} + +const GDIImplFontSet & gdioutput::loadFont(const string &font) { + currentFontSet = 0; + vector< pair > fontIx; + getEnumeratedFonts(fontIx); + double relScale = 1.0; + for (size_t k = 0; k < fontIx.size(); k++) { + if (stringMatch(fontIx[k].first, font)) { + relScale = enumeratedFonts[fontIx[k].second].getRelScale(); + } + } + /*vector res; + split(font, ";", res); + double locScale = 1.0; + if (res.empty() || res.size() > 2) + throw meosException("Cannot load font: " + font); + if (res.size() == 2) { + locScale = atof(res[1].c_str()); + if (!(locScale>0.001 && locScale < 100)) + throw meosException("Cannot scale font with factor: " + res[1]); + }*/ + string faceName; + double locScale = getLocalScale(font, faceName); + + if (faceName.empty()) + faceName = currentFont; + fonts[font].init(scale * relScale * locScale, getCharSet(), faceName, font); + return fonts[font]; +} + +void gdioutput::deleteFonts() { + if (Background) + DeleteObject(Background); + Background = 0; + + currentFontSet = 0; + fonts.clear(); +} + +#ifndef MEOSDB + +gdioutput::~gdioutput() +{ + while(!timers.empty()) { + KillTimer(hWndTarget, (UINT_PTR)&timers.back()); + timers.back().parent = 0; + timers.pop_back(); + } + + deleteFonts(); + + if (toolbar) + delete toolbar; + toolbar = 0; + //delete table; + while(!Tables.empty()){ + Tables.front().table->releaseOwnership(); + Tables.pop_front(); + } + + if (tabs) { + delete tabs; + tabs = 0; + } + + initRecorder(0); + + delete po_default; + po_default = 0; +} +#endif + + +FixedTabs &gdioutput::getTabs() { +#ifndef MEOSDB + if (!tabs) + tabs = new FixedTabs(); +#endif + + return *tabs; +} + + + +void gdioutput::fetchPrinterSettings(PrinterObject &po) const { + po = *po_default; +} + + +void gdioutput::drawBackground(HDC hDC, RECT &rc) +{ + GRADIENT_RECT gr[1]; + + SelectObject(hDC, GetStockObject(NULL_PEN)); + SelectObject(hDC, Background); + + if (highContrast) { + Rectangle(hDC, -1, -1, rc.right + 1, rc.bottom + 1); + + HFONT hInfo = CreateFont(min(30, int(scale*22)), 0, 900, 900, FW_LIGHT, false, false, false, getCharSet(), + OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, + DEFAULT_PITCH|FF_ROMAN, "Arial"); + + SelectObject(hDC, hInfo); + RECT rc; + rc.left = 0; + rc.right = 0; + rc.top = 0; + rc.bottom = 0; + DrawText(hDC, listDescription.c_str(), listDescription.length(), &rc, DT_LEFT|DT_CALCRECT|DT_NOPREFIX); + int height = rc.right + rc.right / 3; + SetBkMode(hDC, TRANSPARENT); + + for (int k = height; k < MaxY; k += height) { + RECT rc; + rc.left = 5 - OffsetX; + rc.right = 1000; + rc.top = k - OffsetY; + rc.bottom = MaxY; + SetTextColor(hDC, RGB(192, 192, 192)); + + DrawText(hDC, listDescription.c_str(), listDescription.length(), &rc, DT_LEFT|DT_NOCLIP|DT_NOPREFIX); + rc.top -= 1; + rc.left -= 1; + SetTextColor(hDC, RGB(92, 32, 32)); + + DrawText(hDC, listDescription.c_str(), listDescription.length(), &rc, DT_LEFT|DT_NOCLIP|DT_NOPREFIX); + + } + SelectObject(hDC, GetStockObject(ANSI_FIXED_FONT)); + DeleteObject(hInfo); + return; + } + if (!hideBG) { + Rectangle(hDC, -1, -1, rc.right-OffsetX+1, 10-OffsetY+1); + Rectangle(hDC, -1, -1, 11-OffsetX, rc.bottom+1); + Rectangle(hDC, MaxX+10-OffsetX, 0, rc.right+1, rc.bottom+1); + Rectangle(hDC, 10-OffsetX, MaxY+13-OffsetY, MaxX+11-OffsetX, rc.bottom+1); + } + if (dbErrorState) { + SelectObject(hDC, GetStockObject(DC_BRUSH)); + SetDCBrushColor(hDC, RGB(255, 100, 100)); + Rectangle(hDC, -1, -1, rc.right+1, rc.bottom+1); + + HFONT hInfo = CreateFont(30, 0, 900, 900, FW_BOLD, false, false, false, getCharSet(), + OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, + DEFAULT_PITCH|FF_ROMAN, "Arial"); + + string err = lang.tl("DATABASE ERROR"); + SelectObject(hDC, hInfo); + RECT mrc; + mrc.left = 0; + mrc.right = 0; + mrc.top = 0; + mrc.bottom = 0; + DrawText(hDC, err.c_str(), err.length(), &mrc, DT_LEFT|DT_CALCRECT|DT_NOPREFIX); + int width = mrc.bottom + mrc.bottom / 4; + int height = mrc.right + mrc.right / 4; + SetBkMode(hDC, TRANSPARENT); + SetTextColor(hDC, RGB(64, 0, 0)); + + for (int k = height; k < max(MaxY, rc.bottom + height); k += height) { + RECT mrc; + mrc.left = rc.right - 50 - OffsetX; + mrc.right = mrc.left + 1000; + mrc.top = k - OffsetY; + mrc.bottom = MaxY; + DrawText(hDC, err.c_str(), err.length(), &mrc, DT_LEFT|DT_NOCLIP|DT_NOPREFIX); + mrc.left -= width; + mrc.top -= height / 2; + DrawText(hDC, err.c_str(), err.length(), &mrc, DT_LEFT|DT_NOCLIP|DT_NOPREFIX); + } + SelectObject(hDC, GetStockObject(ANSI_FIXED_FONT)); + DeleteObject(hInfo); + } + + DWORD c=GetSysColor(COLOR_3DFACE); + double red = double(GetRValue(c)) *0.9; + double green = double(GetGValue(c)) * 0.85; + double blue = min(255.0, double(GetBValue(c)) * 1.05); + + if (blue<100) { + //Invert + red = 255-red; + green = 255-green; + blue = 255-blue; + } + + double blue1=min(255., blue*1.3); + double green1=min(255., green*1.3); + double red1=min(255., red*1.3); + + + TRIVERTEX vert[2]; + if (hideBG) { + vert [0] .x = 0; + vert [0] .y = 0; + } + else { + vert [0] .x = 10-OffsetX; + vert [0] .y = 10-OffsetY; + } + vert [0] .Red = 0xff00&DWORD(red1*256); + vert [0] .Green = 0xff00&DWORD(green1*256); + vert [0] .Blue = 0xff00&DWORD(blue1*256); + vert [0] .Alpha = 0x0000; + + if (hideBG) { + vert [1] .x = rc.right + 1; + vert [1] .y = rc.bottom + 1; + } + else { + vert [1] .x = MaxX+10-OffsetX; + vert [1] .y = MaxY+13-OffsetY; + } + vert [1] .Red = 0xff00&DWORD(red*256); + vert [1] .Green = 0xff00&DWORD(green*256); + vert [1] .Blue = 0xff00&DWORD(blue*256); + vert [1] .Alpha = 0x0000; + + gr[0].UpperLeft=0; + gr[0].LowerRight=1; + + + if (MaxY>max(800, MaxX) || hideBG) + GradientFill(hDC,vert, 2, gr, 1,GRADIENT_FILL_RECT_H); + else + GradientFill(hDC,vert, 2, gr, 1,GRADIENT_FILL_RECT_V); + + if (!hideBG) { + SelectObject(hDC, GetSysColorBrush(COLOR_3DSHADOW)); + + Rectangle(hDC, vert[0].x+3, vert[1].y, vert[1].x+1, vert[1].y+3); + Rectangle(hDC, vert[1].x, vert[0].y+3, vert[1].x+3, vert[1].y+3); + + SelectObject(hDC, GetStockObject(NULL_BRUSH)); + SelectObject(hDC, GetStockObject(DC_PEN)); + SetDCPenColor(hDC, RGB(DWORD(red*0.4), DWORD(green*0.4), DWORD(blue*0.4))); + Rectangle(hDC, vert[0].x, vert[0].y, vert[1].x, vert[1].y); + } +} + +void gdioutput::setDBErrorState(bool state) { + if (dbErrorState != state) { + dbErrorState = state; + refresh(); + } +} + +void gdioutput::draw(HDC hDC, RECT &rc, RECT &drawArea) +{ +#ifdef DEBUGRENDER + if (debugDrawColor) { + string ds = "DebugDraw" + itos(drawArea.left) + "-" + itos(drawArea.right) + ", " + itos(drawArea.top) + "-" + itos(drawArea.bottom) + "\n"; + OutputDebugString(ds.c_str()); + SelectObject(hDC,GetStockObject(DC_BRUSH)); + SetDCBrushColor(hDC, debugDrawColor); + Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom); + return; + } +#endif + if (highContrast) + drawBackground(hDC, drawArea); + else + drawBackground(hDC, rc); + + if (drawArea.left > MaxX - OffsetX + 15) { + drawBoxes(hDC, rc); + return; + } + + list::iterator rit; + SelectObject(hDC,GetStockObject(DC_BRUSH)); + + for(rit=Rectangles.begin();rit!=Rectangles.end(); ++rit){ + if (rit->drawBorder) + SelectObject(hDC, GetStockObject(BLACK_PEN)); + else + SelectObject(hDC, GetStockObject(NULL_PEN)); + SetDCBrushColor(hDC, rit->color); + + RECT rect_rc=rit->rc; + OffsetRect(&rect_rc, -OffsetX, -OffsetY); + Rectangle(hDC, rect_rc.left, rect_rc.top, rect_rc.right, rect_rc.bottom); + } + + if (useTables) + for(list::iterator tit=Tables.begin();tit!=Tables.end(); ++tit){ + tit->table->draw(*this, hDC, tit->xp, tit->yp, rc); + } + + resetLast(); + TIList::iterator it; + + int BoundYup=OffsetY-100 + drawArea.top; + int BoundYdown=OffsetY+ drawArea.bottom + 2; + + if (!renderOptimize || itTL == TL.end()) { +#ifdef DEBUGRENDER + //if (breakRender) + // DebugBreak(); + OutputDebugString(("Raw render" + itos(size_t(this)) + "\n").c_str()); +#endif + for(it=TL.begin();it!=TL.end(); ++it){ + TextInfo &ti=*it; + if ( ti.yp > BoundYup && ti.yp < BoundYdown) + RenderString(*it, hDC); + } + } + else { + #ifdef DEBUGRENDER + OutputDebugString((itos(++counterRender) + " opt render " + itos(size_t(this)) + "\n").c_str()); + #endif + + while( itTL != TL.end() && itTL->yp < BoundYup) + ++itTL; + + if (itTL!=TL.end()) + while( itTL != TL.begin() && itTL->yp > BoundYup) + --itTL; + + it=itTL; + while( it != TL.end() && it->yp < BoundYdown) { + RenderString(*it, hDC); + ++it; + } + } + + updateStringPosCache(); + drawBoxes(hDC, rc); +} + +void gdioutput::renderRectangle(HDC hDC, RECT *clipRegion, const RectangleInfo &ri) { + if (ri.drawBorder) + SelectObject(hDC, GetStockObject(BLACK_PEN)); + else + SelectObject(hDC, GetStockObject(NULL_PEN)); + SetDCBrushColor(hDC, ri.color); + + RECT rect_rc=ri.rc; + OffsetRect(&rect_rc, -OffsetX, -OffsetY); + Rectangle(hDC, rect_rc.left, rect_rc.top, rect_rc.right, rect_rc.bottom); +} + +void gdioutput::updateStringPosCache() { + RECT rc; + GetClientRect(hWndTarget, &rc); + int BoundYup = OffsetY-100; + int BoundYdown = OffsetY+rc.bottom+10; + shownStrings.clear(); + TIList::iterator it; + + if (!renderOptimize || itTL == TL.end()) { + for (it=TL.begin();it!=TL.end(); ++it) { + TextInfo &ti=*it; + if ( ti.yp > BoundYup && ti.yp < BoundYdown) { + if (ti.textRect.top != ti.yp - OffsetY) { + int diff = it->textRect.top - (ti.yp - OffsetY); + ti.textRect.top -= diff; + ti.textRect.bottom -= diff; + } + shownStrings.push_back(&ti); + } + } + } + else { + TIList::iterator itC = itTL; + + while( itC != TL.end() && itC->yp < BoundYup) + ++itC; + + if (itC!=TL.end()) + while( itC != TL.begin() && itC->yp > BoundYup) + --itC; + + it=itC; + while( it != TL.end() && it->yp < BoundYdown) { + shownStrings.push_back(&*it); + if (it->textRect.top != it->yp - OffsetY) { + int diff = it->textRect.top - (it->yp - OffsetY); + it->textRect.top -= diff; + it->textRect.bottom -= diff; + } + ++it; + } + } +} + +TextInfo &gdioutput::addTimer(int yp, int xp, int format, DWORD zeroTime, int xlimit, + GUICALLBACK cb, int timeOut, const char *fontFace) { + hasAnyTimer = true; + DWORD zt=GetTickCount()-1000*zeroTime; + string text=getTimerText(zeroTime, format); + + addStringUT(yp, xp, format, text, xlimit, cb, fontFace); + TextInfo &ti=TL.back(); + ti.hasTimer=true; + ti.zeroTime=zt; + + if (timeOut != NOTIMEOUT) + ti.timeOut = ti.zeroTime + timeOut*1000; + + return ti; +} + +TextInfo &gdioutput::addTimeout(int TimeOut, GUICALLBACK cb) { + addStringUT(0, 0, 0, "", 0, cb); + TextInfo &ti=TL.back(); + ti.hasTimer=true; + ti.zeroTime=GetTickCount(); + if (TimeOut!=NOTIMEOUT) + ti.timeOut=ti.zeroTime+(TimeOut)*1000; + return ti; +} + +void CALLBACK gdiTimerProc(HWND hWnd, UINT a, UINT_PTR ptr, DWORD b) { + string msg; + KillTimer(hWnd, ptr); + TimerInfo *it = (TimerInfo *)ptr; + try { + if (it->parent) { + it->parent->timerProc(*it, b); + } + } + catch(std::exception &ex) { + msg=ex.what(); + if (msg.empty()) + msg="Ett okänt fel inträffade."; + } + catch(...) { + msg="Unexpected error"; + } + + if (!msg.empty()) { + MessageBox(hWnd, msg.c_str(), "MeOS", MB_OK|MB_ICONEXCLAMATION); + } +} + +void gdioutput::timerProc(TimerInfo &timer, DWORD timeout) { + if (timer.handler) + timer.handler->handle(*this, timer, GUI_TIMER); + else if (timer.callBack) + timer.callBack(this, GUI_TIMER, &timer); + + for (list::iterator it = timers.begin(); it != timers.end(); ++it) { + if (&*it == &timer) { + timers.erase(it); + return; + } + } +} + +void gdioutput::removeTimeoutMilli(const string &id) { + for (list::iterator it = timers.begin(); it != timers.end(); ++it) { + if (it->id == id) { + UINT_PTR ptr = (UINT_PTR)&*it; + KillTimer(hWndTarget, ptr); + timers.erase(it); + return; + } + } +} + +TimerInfo &gdioutput::addTimeoutMilli(int timeOut, const string &id, GUICALLBACK cb) +{ + removeTimeoutMilli(id); + timers.push_back(TimerInfo(this, cb)); + timers.back().id = id; + timers.back().data = 0; + SetTimer(hWndTarget, (UINT_PTR)&timers.back(), timeOut, gdiTimerProc); + return timers.back(); +} + +TextInfo &gdioutput::addStringUT(int yp, int xp, int format, const string &text, + int xlimit, GUICALLBACK cb, const char *fontFace) +{ + TextInfo TI; + TI.format=format; + TI.xp=xp; + TI.yp=yp; + TI.text=text; + TI.xlimit=xlimit; + TI.callBack=cb; + if (fontFace) + TI.font = fontFace; + if (!skipTextRender(format)) { + HDC hDC=GetDC(hWndTarget); + + if (hWndTarget && !manualUpdate) + RenderString(TI, hDC); + else + calcStringSize(TI, hDC); + + if (xlimit == 0 || (format & (textRight|textCenter)) == 0) { + updatePos(TI.textRect.right+OffsetX, TI.yp, scaleLength(10), + TI.textRect.bottom - TI.textRect.top + scaleLength(2)); + } + else { + updatePos(TI.xp, TI.yp, TI.realWidth + scaleLength(10), + TI.textRect.bottom - TI.textRect.top + scaleLength(2)); + } + + ReleaseDC(hWndTarget, hDC); + + if (renderOptimize && !TL.empty()) { + if (TL.back().yp > TI.yp) + renderOptimize=false; + } + } + else { + TI.textRect.left = xp; + TI.textRect.right = xp; + TI.textRect.bottom = yp; + TI.textRect.top = yp; + } + + TL.push_back(TI); + itTL=TL.begin(); + + return TL.back(); +} + +TextInfo &gdioutput::addString(const char *id, int yp, int xp, int format, const string &text, + int xlimit, GUICALLBACK cb, const char *fontFace) +{ + TextInfo TI; + TI.format=format; + TI.xp=xp; + TI.yp=yp; + TI.text=lang.tl(text); + if ( (format & Capitalize) == Capitalize && lang.capitalizeWords()) + capitalizeWords(TI.text); + TI.id=id; + TI.xlimit=xlimit; + TI.callBack=cb; + if (fontFace) + TI.font = fontFace; + + if (!skipTextRender(format)) { + HDC hDC=GetDC(hWndTarget); + + if (hWndTarget && !manualUpdate) + RenderString(TI, hDC); + else + calcStringSize(TI, hDC); + + if (xlimit == 0 || (format & (textRight|textCenter)) == 0) { + updatePos(TI.textRect.right+OffsetX, yp, scaleLength(10), + TI.textRect.bottom - TI.textRect.top + scaleLength(2)); + } + else { + updatePos(TI.xp, TI.yp, TI.realWidth + scaleLength(10), + TI.textRect.bottom - TI.textRect.top + scaleLength(2)); + } + ReleaseDC(hWndTarget, hDC); + + if (renderOptimize && !TL.empty()) { + if (TL.back().yp > TI.yp) + renderOptimize=false; + } + } + else { + TI.textRect.left = xp; + TI.textRect.right = xp; + TI.textRect.bottom = yp; + TI.textRect.top = yp; + } + + TL.push_back(TI); + itTL=TL.begin(); + + return TL.back(); +} + +TextInfo &gdioutput::addString(const string &id, int format, const string &text, GUICALLBACK cb) { + return addString(id.c_str(), CurrentY, CurrentX, format, text, 0, cb); +} + +TextInfo &gdioutput::addString(const string &id, int yp, int xp, int format, const string &text, + int xlimit, GUICALLBACK cb, const char *fontFace) { + return addString(id.c_str(), yp, xp, format, text, xlimit, cb, fontFace); +} + +TextInfo &gdioutput::addString(const char *id, int format, const string &text, GUICALLBACK cb) +{ + return addString(id, CurrentY, CurrentX, format, text, 0, cb); +} + +TextInfo &gdioutput::addStringUT(int format, const string &text, GUICALLBACK cb) +{ + return addStringUT(CurrentY, CurrentX, format, text, 0, cb); +} + + +ButtonInfo &gdioutput::addButton(const string &id, const string &text, GUICALLBACK cb, + const string &tooltip) +{ + return addButton(CurrentX, CurrentY, id, text, cb, tooltip); +} + +ButtonInfo &gdioutput::addButton(int x, int y, const string &id, const string &text, GUICALLBACK cb, + const string &tooltip) +{ + SIZE size; + + HDC hDC=GetDC(hWndTarget); + SelectObject(hDC, getGUIFont()); + string ttext = lang.tl(text); + if (lang.capitalizeWords()) + capitalizeWords(ttext); + GetTextExtentPoint32(hDC, ttext.c_str(), ttext.length(), &size); + ReleaseDC(hWndTarget, hDC); + int width = size.cx+scaleLength(30); + if (text != "...") + width = max(width, scaleLength(75)); + ButtonInfo &bi=addButton(x, y, width, id, text, cb, tooltip, false, false); + + return bi; +} + +ButtonInfo &ButtonInfo::setDefault() +{ + flags |= 1; + storedFlags |= 1; + //SetWindowLong(hWnd, i, GetWindowLong(hWnd, i)|BS_DEFPUSHBUTTON); + return *this; +} + +int gdioutput::getButtonHeight() const { + return int(scale * 24)+0; +} + +void ButtonInfo::moveButton(gdioutput &gdi, int nxp, int nyp) { + /*WINDOWPLACEMENT wpl; + GetWindowPlacement(hWnd, &wpl); + wpl. + + SetWindowPos*/ + //SetWindowPos(hWnd, NULL, xp, yp, 0, 0, + xp = nxp; + yp = nyp; + int w, h; + getDimension(gdi, w, h); + MoveWindow(hWnd, xp, yp, w, h, true); + gdi.updatePos(xp, yp, w, h); +} + +void ButtonInfo::getDimension(gdioutput &gdi, int &w, int &h) { + RECT rc; + GetWindowRect(hWnd, &rc); + w = rc.right - rc.left + gdi.scaleLength(GDI_BUTTON_SPACING); + h = rc.bottom - rc.top; +} + +ButtonInfo &gdioutput::addButton(int x, int y, int w, const string &id, + const string &text, GUICALLBACK cb, const string &tooltip, + bool AbsPos, bool hasState) +{ + int style = hasState ? BS_CHECKBOX|BS_PUSHLIKE : BS_PUSHBUTTON; + ButtonInfo bi; + string ttext = lang.tl(text); + if (lang.capitalizeWords()) + capitalizeWords(ttext); + int height = getButtonHeight(); + if (AbsPos){ + if (ttext.find_first_of('\n') != string::npos) { + style |= BS_MULTILINE; + height *= 2; + } + bi.hWnd=CreateWindow("BUTTON", ttext.c_str(), WS_TABSTOP|WS_VISIBLE|WS_CHILD|style|BS_NOTIFY, + x-OffsetX, y, w, height, hWndTarget, NULL, + (HINSTANCE)GetWindowLong(hWndTarget, GWL_HINSTANCE), NULL); + } + else { + bi.hWnd=CreateWindow("BUTTON", ttext.c_str(), WS_TABSTOP|WS_VISIBLE|WS_CHILD|style|BS_NOTIFY, + x-OffsetX, y-OffsetY-1, w, height, hWndTarget, NULL, + (HINSTANCE)GetWindowLong(hWndTarget, GWL_HINSTANCE), NULL); + } + + if (getEncoding() != ANSI) { + const wstring &output = toWide(ttext); + SetWindowTextW(bi.hWnd, output.c_str()); + } + + SendMessage(bi.hWnd, WM_SETFONT, (WPARAM) getGUIFont(), 0); + + if (!AbsPos) + updatePos(x, y, w+scaleLength(GDI_BUTTON_SPACING), height+5); + + bi.xp=x; + bi.yp=y; + bi.width = w; + bi.text=ttext; + bi.id=id; + bi.callBack=cb; + bi.AbsPos=AbsPos; + + if (tooltip.length()>0) + addToolTip(id, tooltip, bi.hWnd); + + BI.push_back(bi); + biByHwnd[bi.hWnd] = &BI.back(); + + FocusList.push_back(bi.hWnd); + return BI.back(); +} + +static int checkBoxCallback(gdioutput *gdi, int type, void *data) { + if (type == GUI_LINK) { + TextInfo *ti = (TextInfo *)data; + string cid = ti->id.substr(1); + gdi->check(cid, !gdi->isChecked(cid), true); + ButtonInfo &bi = ((ButtonInfo &)gdi->getBaseInfo(cid.c_str())); + if (bi.callBack || bi.hasEventHandler()) + gdi->sendCtrlMessage(cid); + //gdi->getBaseInfo(cid); + } + return 0; +} + +void gdioutput::enableCheckBoxLink(TextInfo &ti, bool enable) { + bool needRefresh = false; + if (enable) { + needRefresh = ti.callBack == 0; + ti.callBack = checkBoxCallback; + ti.setColor(colorDefault); + } + else { + needRefresh = ti.callBack != 0; + ti.callBack = 0; + ti.setColor(colorDarkGrey); + } + if (needRefresh) + InvalidateRect(hWndTarget, &ti.textRect, true); +} + +ButtonInfo &gdioutput::addCheckbox(const string &id, const string &text, + GUICALLBACK cb, bool Checked, const string &tooltip) +{ + return addCheckbox(CurrentX, CurrentY, id, text, cb, Checked, tooltip); +} + +ButtonInfo &gdioutput::addCheckbox(int x, int y, const string &id, const string &text, + GUICALLBACK cb, bool Checked, const string &tooltip, bool AbsPos) +{ + ButtonInfo bi; + SIZE size; + + string ttext = lang.tl(text); + HDC hDC=GetDC(hWndTarget); + SelectObject(hDC, GetStockObject(DEFAULT_GUI_FONT)); + GetTextExtentPoint32(hDC, "M", 1, &size); + + int ox=OffsetX; + int oy=OffsetY; + + if (AbsPos) { + ox=0; + oy=0; + } + + /* + bi.hWnd=CreateWindowEx(0,"BUTTON", ttext.c_str(), WS_TABSTOP|WS_VISIBLE| + WS_CHILD|BS_AUTOCHECKBOX|BS_NOTIFY, + x-ox, y-oy, size.cx+30, size.cy+5, hWndTarget, NULL, + (HINSTANCE)GetWindowLong(hWndTarget, GWL_HINSTANCE), NULL); + */ + int h = size.cy; + SelectObject(hDC, getGUIFont()); + GetTextExtentPoint32(hDC, ttext.c_str(), ttext.length(), &size); + ReleaseDC(hWndTarget, hDC); + + bi.hWnd=CreateWindowEx(0,"BUTTON", "", WS_TABSTOP|WS_VISIBLE| + WS_CHILD|BS_AUTOCHECKBOX|BS_NOTIFY, + x-ox, y-oy + (size.cy-h)/2, h, h, hWndTarget, NULL, + (HINSTANCE)GetWindowLong(hWndTarget, GWL_HINSTANCE), NULL); + + TextInfo &desc = addStringUT(y , x + (3*h)/2, 0, ttext, 0, checkBoxCallback); + desc.id = "T" + id; + + SendMessage(bi.hWnd, WM_SETFONT, (WPARAM) getGUIFont(), 0); + + if (Checked) + SendMessage(bi.hWnd, BM_SETCHECK, BST_CHECKED, 0); + + bi.checked = Checked; + + if (!AbsPos) + updatePos(x, y, size.cx+int(30*scale), size.cy+int(scale * 12)+3); + + if (tooltip.length()>0) { + addToolTip(id, tooltip, bi.hWnd); + addToolTip(desc.id, tooltip, 0, &desc.textRect); + } + bi.isCheckbox = true; + bi.xp=x; + bi.yp=y; + bi.width = desc.textRect.right - (x-ox); + bi.text=ttext; + bi.id=id; + bi.callBack=cb; + bi.AbsPos=AbsPos; + bi.originalState = Checked; + bi.isEdit(true); + BI.push_back(bi); + biByHwnd[bi.hWnd] = &BI.back(); + + FocusList.push_back(bi.hWnd); + return BI.back(); +} + +bool gdioutput::isChecked(const string &id) +{ + list::iterator it; + for(it=BI.begin(); it != BI.end(); ++it) + if (it->id==id) + return SendMessage(it->hWnd, BM_GETCHECK, 0, 0)==BST_CHECKED; + + return false; +} + +void gdioutput::check(const string &id, bool state, bool keepOriginalState){ + list::iterator it; + for(it=BI.begin(); it != BI.end(); ++it) { + if (it->id==id){ + SendMessage(it->hWnd, BM_SETCHECK, state ? BST_CHECKED:BST_UNCHECKED, 0); + it->checked = state; + it->synchData(); + if (!keepOriginalState) + it->originalState = state; + return; + } + } + + #ifdef _DEBUG + string err = string("Internal Error, identifier not found: X#") + id; + throw std::exception(err.c_str()); + #endif +} + +InputInfo &gdioutput::addInput(const string &id, const string &text, int length, GUICALLBACK cb, const string &Explanation, const string &Help) +{ + return addInput(CurrentX, CurrentY, id, text, length, cb, Explanation, Help); +} + +HFONT gdioutput::getGUIFont() const +{ + if (scale==1) + return (HFONT)GetStockObject(DEFAULT_GUI_FONT); + else + return getCurrentFont().getGUIFont(); +} + +InputInfo &gdioutput::addInput(int x, int y, const string &id, const string &text, int length, GUICALLBACK cb, const string &Explanation, const string &Help) +{ + if (Explanation.length()>0) { + addString(id + "_label", y, x, 0, Explanation); + y+=lineHeight; + } + + InputInfo ii; + SIZE size; + + HDC hDC=GetDC(hWndTarget); + SelectObject(hDC, getGUIFont()); + GetTextExtentPoint32(hDC, "M", 1, &size); + ReleaseDC(hWndTarget, hDC); + + int ox=OffsetX; + int oy=OffsetY; + + ii.hWnd=CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", text.c_str(), + WS_TABSTOP|WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL | WS_BORDER, + x-ox, y-oy, length*size.cx+scaleLength(8), size.cy+scaleLength(6), + hWndTarget, NULL, (HINSTANCE)GetWindowLong(hWndTarget, GWL_HINSTANCE), NULL); + + updatePos(x, y, length*size.cx+scaleLength(12), size.cy+scaleLength(10)); + + SendMessage(ii.hWnd, WM_SETFONT, + (WPARAM) getGUIFont(), 0); + + ii.xp=x; + ii.yp=y; + ii.width = length*size.cx+scaleLength(8); + ii.height = size.cy+scaleLength(6); + ii.text = text; + ii.original = text; + ii.focusText = text; + ii.id=id; + ii.callBack=cb; + + II.push_back(ii); + iiByHwnd[ii.hWnd] = &II.back(); + if (Help.length() > 0) + addToolTip(id, Help, ii.hWnd); + + FocusList.push_back(ii.hWnd); + + if (II.size() == 1) { + SetFocus(ii.hWnd); + currentFocus = ii.hWnd; + } + + return II.back(); +} + +InputInfo &gdioutput::addInputBox(const string &id, int width, int height, const string &text, + GUICALLBACK cb, const string &Explanation) +{ + return addInputBox(id, CurrentX, CurrentY, width, height, text, cb, Explanation); +} + +InputInfo &gdioutput::addInputBox(const string &id, int x, int y, int width, int height, + const string &text, GUICALLBACK cb, const string &Explanation) +{ + if (Explanation.length()>0) { + addString("", y, x, 0, Explanation); + y+=lineHeight; + } + + InputInfo ii; + + int ox=OffsetX; + int oy=OffsetY; + + ii.hWnd=CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", text.c_str(), WS_HSCROLL|WS_VSCROLL| + WS_TABSTOP|WS_VISIBLE|WS_CHILD|ES_AUTOHSCROLL|ES_MULTILINE|ES_AUTOVSCROLL|WS_BORDER, + x-ox, y-oy, width, height, hWndTarget, NULL, + (HINSTANCE)GetWindowLong(hWndTarget, GWL_HINSTANCE), NULL); + + updatePos(x, y, width, height); + + SendMessage(ii.hWnd, WM_SETFONT, (WPARAM) getGUIFont(), 0); + + ii.xp=x; + ii.yp=y; + ii.width = width; + ii.height = height; + ii.text = text; + ii.original = text; + ii.focusText = text; + ii.id=id; + ii.callBack=cb; + + II.push_back(ii); + + iiByHwnd[ii.hWnd] = &II.back(); + //if (Help.length() > 0) + // addToolTip(Help, ii.hWnd); + + FocusList.push_back(ii.hWnd); + return II.back(); +} + + +ListBoxInfo &gdioutput::addListBox(const string &id, int width, int height, GUICALLBACK cb, const string &Explanation, const string &Help, bool multiple) +{ + return addListBox(CurrentX, CurrentY, id, width, height, cb, Explanation, Help, multiple); +} + +LRESULT CALLBACK GetMsgProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { + ListBoxInfo *lbi = (ListBoxInfo *)(GetWindowLongPtr(hWnd, GWL_USERDATA)); + if (!lbi) { + throw std::exception("Internal GDI error"); + } + + LPARAM res = CallWindowProc(lbi->originalProc, hWnd, iMsg, wParam, lParam); + if (iMsg == WM_VSCROLL || iMsg == WM_MOUSEWHEEL || iMsg == WM_KEYDOWN) { + int topIndex = CallWindowProc(lbi->originalProc, hWnd, LB_GETTOPINDEX, 0, 0); + if (lbi->lbiSync) { + ListBoxInfo *other = lbi->lbiSync; + CallWindowProc(other->originalProc, other->hWnd, LB_SETTOPINDEX, topIndex, 0); + } + } + return res; +} + +void gdioutput::synchronizeListScroll(const string &id1, const string &id2) +{ + ListBoxInfo *a = 0, *b = 0; + list::iterator it; + for (it = LBI.begin(); it != LBI.end(); ++it) { + if (it->id == id1) + a = &*it; + else if (it->id == id2) + b = &*it; + } + if (!a || !b) + throw std::exception("Not found"); + + a->lbiSync = b; + b->lbiSync = a; + SetWindowLongPtr(a->hWnd, GWL_USERDATA, LONG_PTR(a)); + SetWindowLongPtr(b->hWnd, GWL_USERDATA, LONG_PTR(b)); + + a->originalProc = WNDPROC(GetWindowLongPtr(a->hWnd, GWL_WNDPROC)); + b->originalProc = WNDPROC(GetWindowLongPtr(b->hWnd, GWL_WNDPROC)); + + SetWindowLongPtr(a->hWnd, GWL_WNDPROC, LONG_PTR(GetMsgProc)); + SetWindowLongPtr(b->hWnd, GWL_WNDPROC, LONG_PTR(GetMsgProc)); +} + +ListBoxInfo &gdioutput::addListBox(int x, int y, const string &id, int width, int height, GUICALLBACK cb, const string &Explanation, const string &Help, bool multiple) +{ + if (Explanation.length()>0) { + addString(id+"_expl", y, x, 0, Explanation); + y+=lineHeight; + } + ListBoxInfo lbi; + int ox=OffsetX; + int oy=OffsetY; + + DWORD style=WS_TABSTOP|WS_VISIBLE|WS_CHILD|WS_BORDER|LBS_USETABSTOPS|LBS_NOTIFY|WS_VSCROLL; + + if (multiple) + style|=LBS_MULTIPLESEL; + + lbi.hWnd=CreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX", "", style, + x-ox, y-oy, int(width*scale), int(height*scale), hWndTarget, NULL, + (HINSTANCE)GetWindowLong(hWndTarget, GWL_HINSTANCE), NULL); +/* + if (id == "Punches") { + winHandle = WNDPROC(GetWindowLong(lbi.hWnd, GWL_WNDPROC)); + SetWindowLong(lbi.hWnd, GWL_WNDPROC, LONG(GetMsgProc)); + }*/ + + updatePos(x, y, int(scale*(width+5)), int(scale * (height+2))); + SendMessage(lbi.hWnd, WM_SETFONT, (WPARAM) getGUIFont(), 0); + + lbi.IsCombo=false; + lbi.multipleSelection = multiple; + lbi.xp=x; + lbi.yp=y; + lbi.width = scale*width; + lbi.height = scale*height; + lbi.id=id; + lbi.callBack=cb; + LBI.push_back(lbi); + lbiByHwnd[lbi.hWnd] = &LBI.back(); + if (Help.length() > 0) + addToolTip(id, Help, lbi.hWnd); + + FocusList.push_back(lbi.hWnd); + return LBI.back(); +} + +void gdioutput::setSelection(const string &id, const set &selection) +{ + list::iterator it; + for(it=LBI.begin(); it != LBI.end(); ++it){ + if (it->id==id && !it->IsCombo) { + list::const_iterator cit; + + if (selection.count(-1)==1) + SendMessage(it->hWnd, LB_SETSEL, 1, -1); + else { + int count=SendMessage(it->hWnd, LB_GETCOUNT, 0,0); + SendMessage(it->hWnd, LB_SETSEL, 0, -1); + for(int i=0;ihWnd, LB_GETITEMDATA, i, 0); + + if (selection.count(d)==1) + SendMessage(it->hWnd, LB_SETSEL, 1, i); + } + return; + } + } + } +} + +void gdioutput::getSelection(const string &id, set &selection) { + list::iterator it; + for(it=LBI.begin(); it != LBI.end(); ++it){ + if (it->id==id && !it->IsCombo) { + selection.clear(); + int count=SendMessage(it->hWnd, LB_GETCOUNT, 0,0); + for(int i=0;ihWnd, LB_GETSEL, i, 0); + if (s) { + int d=SendMessage(it->hWnd, LB_GETITEMDATA, i, 0); + selection.insert(d); + } + } + return; + } + } + + #ifdef _DEBUG + string err = string("Internal Error, identifier not found: X#") + id; + throw std::exception(err.c_str()); + #endif +} + +ListBoxInfo &gdioutput::addSelection(const string &id, int width, int height, GUICALLBACK cb, const string &Explanation, const string &Help) +{ + return addSelection(CurrentX, CurrentY, id, width, height, cb, Explanation, Help); +} + +ListBoxInfo &gdioutput::addSelection(int x, int y, const string &id, int width, int height, GUICALLBACK cb, const string &Explanation, const string &Help) +{ + if (Explanation.length()>0) { + addString("", y, x, 0, Explanation); + y+=lineHeight; + } + + ListBoxInfo lbi; + + int ox = OffsetX; + int oy = OffsetY; + + lbi.hWnd=CreateWindowEx(WS_EX_CLIENTEDGE, "COMBOBOX", "", WS_TABSTOP|WS_VISIBLE | WS_CHILD |WS_BORDER|CBS_DROPDOWNLIST|WS_VSCROLL , + x-ox, y-oy, int(scale*width), int(scale*height), hWndTarget, NULL, + (HINSTANCE)GetWindowLong(hWndTarget, GWL_HINSTANCE), NULL); + + updatePos(x, y, int(scale*(width+5)), int(scale*30)); + + SendMessage(lbi.hWnd, WM_SETFONT, (WPARAM) getGUIFont(), 0); + + lbi.IsCombo=true; + lbi.xp=x; + lbi.yp=y; + lbi.width = scale*width; + lbi.height = scale*height; + lbi.id=id; + lbi.callBack=cb; + + LBI.push_back(lbi); + lbiByHwnd[lbi.hWnd] = &LBI.back(); + + if (Help.length() > 0) + addToolTip(id, Help, lbi.hWnd); + + FocusList.push_back(lbi.hWnd); + return LBI.back(); +} + + + +ListBoxInfo &gdioutput::addCombo(const string &id, int width, int height, GUICALLBACK cb, const string &Explanation, const string &Help) +{ + return addCombo(CurrentX, CurrentY, id, width, height, cb, Explanation, Help); +} + +ListBoxInfo &gdioutput::addCombo(int x, int y, const string &id, int width, int height, GUICALLBACK cb, const string &Explanation, const string &Help) +{ + if (Explanation.length()>0) { + addString("", y, x, 0, Explanation); + y+=lineHeight; + } + + ListBoxInfo lbi; + int ox=OffsetX; + int oy=OffsetY; + + lbi.hWnd=CreateWindowEx(WS_EX_CLIENTEDGE, "COMBOBOX", "", WS_TABSTOP|WS_VISIBLE | WS_CHILD |WS_BORDER|CBS_DROPDOWN |CBS_AUTOHSCROLL, + x-ox, y-oy, int(scale*width), int(scale*height), hWndTarget, NULL, + (HINSTANCE)GetWindowLong(hWndTarget, GWL_HINSTANCE), NULL); + + updatePos(x, y, int(scale * (width+5)), getButtonHeight()+scaleLength(5)); + + SendMessage(lbi.hWnd, WM_SETFONT, (WPARAM) getGUIFont(), 0); + + lbi.IsCombo=true; + lbi.xp=x; + lbi.yp=y; + lbi.width = scale*width; + lbi.height = scale*height; + lbi.id=id; + lbi.callBack=cb; + + LBI.push_back(lbi); + lbiByHwnd[lbi.hWnd] = &LBI.back(); + + if (Help.length() > 0) + addToolTip(id, Help, lbi.hWnd); + + FocusList.push_back(lbi.hWnd); + return LBI.back(); +} + +bool gdioutput::addItem(const string &id, const string &text, size_t data) +{ + list::reverse_iterator it; + for (it=LBI.rbegin(); it != LBI.rend(); ++it) { + if (it->id==id) { + if (it->IsCombo) { + int index=SendMessage(it->hWnd, CB_ADDSTRING, 0, LPARAM(text.c_str())); + SendMessage(it->hWnd, CB_SETITEMDATA, index, data); + it->data2Index[data] = index; + } + else { + int index=SendMessage(it->hWnd, LB_INSERTSTRING, -1, LPARAM(text.c_str())); + SendMessage(it->hWnd, LB_SETITEMDATA, index, data); + it->data2Index[data] = index; + } + return true; + } + } + return false; +} + +bool gdioutput::addItem(const string &id, const vector< pair > &items) +{ + list::reverse_iterator it; + for (it=LBI.rbegin(); it != LBI.rend(); ++it) { + if (it->id==id) { + if (it->IsCombo) { + SendMessage(it->hWnd, CB_RESETCONTENT, 0, 0); + SendMessage(it->hWnd, CB_INITSTORAGE, items.size(), 48); + it->data2Index.clear(); + + for (size_t k = 0; khWnd, CB_ADDSTRING, 0, LPARAM(items[k].first.c_str())); + SendMessage(it->hWnd, CB_SETITEMDATA, index, items[k].second); + it->data2Index[items[k].second] = index; + } + } + else { + SendMessage(it->hWnd, LB_RESETCONTENT, 0, 0); + SendMessage(it->hWnd, LB_INITSTORAGE, items.size(), 48); + it->data2Index.clear(); + for (size_t k = 0; khWnd, LB_INSERTSTRING, -1, LPARAM(items[k].first.c_str())); + SendMessage(it->hWnd, LB_SETITEMDATA, index, items[k].second); + it->data2Index[items[k].second] = index; + } + } + return true; + } + } + return false; +} + +void gdioutput::filterOnData(const string &id, const stdext::hash_set &filter) { + list::iterator it; + for (it=LBI.begin(); it != LBI.end(); ++it) { + if (it->id==id) { + if (it->IsCombo) { + } + else { + const HWND &hWnd = it->hWnd; + int count = SendMessage(hWnd, LB_GETCOUNT, 0, 0); + for (int ix = count - 1; ix>=0; ix--) { + int ret = SendMessage(hWnd, LB_GETITEMDATA, ix, 0); + if (ret != LB_ERR && filter.count(ret) == 0) + SendMessage(hWnd, LB_DELETESTRING, ix, 0); + } + return; + } + } + } + assert(false); +} + +bool gdioutput::clearList(const string &id) +{ + list::iterator it; + for(it=LBI.begin(); it != LBI.end(); ++it){ + if (it->id==id) { + it->original = ""; + it->originalIdx = -1; + if (it->IsCombo) + SendMessage(it->hWnd, CB_RESETCONTENT , 0, 0); + else + SendMessage(it->hWnd, LB_RESETCONTENT , 0, 0); + return true; + } + } + + return false; +} + +bool gdioutput::getSelectedItem(const string &id, ListBoxInfo &lbi) { + lbi = ListBoxInfo(); + list::iterator it; + for (it=LBI.begin(); it != LBI.end(); ++it) { + if (it->id==id) { + bool ret = getSelectedItem(*it); + it->copyUserData(lbi); + return ret; + } + } + return false; +} + +pair gdioutput::getSelectedItem(const string &id) { + ListBoxInfo lbi; + bool ret = getSelectedItem(id, lbi); + return make_pair(lbi.data, ret); +} + +pair gdioutput::getSelectedItem(const char *id) { + string ids = id; + return getSelectedItem(ids); +} + +void ListBoxInfo::copyUserData(ListBoxInfo &dest) const { + dest.data = data; + dest.text = text; + dest.id = id; + dest.extra = extra; + dest.index = index; + dest.IsCombo = IsCombo; +} + +bool gdioutput::getSelectedItem(ListBoxInfo &lbi) { + if (lbi.IsCombo) { + int index=SendMessage(lbi.hWnd, CB_GETCURSEL, 0, 0); + + if (index == CB_ERR) { + char bf[256]; + GetWindowText(lbi.hWnd, bf, 256); + lbi.text=bf; + lbi.data=-1; + lbi.index=index; + return false; + } + lbi.data=SendMessage(lbi.hWnd, CB_GETITEMDATA, index, 0); + char bf[1024]; + if (SendMessage(lbi.hWnd, CB_GETLBTEXT, index, LPARAM(bf)) != CB_ERR) + lbi.text=bf; + } + else { + int index=SendMessage(lbi.hWnd, LB_GETCURSEL, 0, 0); + + if (index==LB_ERR) + return false; + + lbi.data=SendMessage(lbi.hWnd, LB_GETITEMDATA, index, 0); + lbi.index=index; + + char bf[1024]; + if (SendMessage(lbi.hWnd, LB_GETTEXT, index, LPARAM(bf))!=LB_ERR) + lbi.text=bf; + } + return true; +} + +int gdioutput::getItemDataByName(const char *id, const char *name) const{ + list::const_iterator it; + for(it = LBI.begin(); it != LBI.end(); ++it){ + if (it->id==id) { + if (it->IsCombo) { + int ix = SendMessage(it->hWnd, CB_FINDSTRING, -1, LPARAM(name)); + if (ix >= 0) { + return SendMessage(it->hWnd, CB_GETITEMDATA, ix, 0); + } + return -1; + } + else { + int ix = SendMessage(it->hWnd, LB_FINDSTRING, -1, LPARAM(name)); + if (ix >= 0) { + return SendMessage(it->hWnd, LB_GETITEMDATA, ix, 0); + } + return -1; + } + } + } + return -1; +} + +bool gdioutput::selectItemByData(const char *id, int data) +{ + list::iterator it; + for(it=LBI.begin(); it != LBI.end(); ++it){ + if (it->id==id) { + if (it->IsCombo) { + + if (data==-1) { + SendMessage(it->hWnd, CB_SETCURSEL, -1, 0); + it->data = 0; + it->text = ""; + it->original = ""; + it->originalIdx = -1; + return true; + } + else { + int count = SendMessage(it->hWnd, CB_GETCOUNT, 0, 0); + + for (int m = 0; m < count; m++) { + int ret = SendMessage(it->hWnd, CB_GETITEMDATA, m, 0); + if (ret == data) { + SendMessage(it->hWnd, CB_SETCURSEL, m, 0); + it->data = data; + it->originalIdx = data; + char bf[1024]; + if (SendMessage(it->hWnd, CB_GETLBTEXT, m, LPARAM(bf))!=CB_ERR) { + it->text = bf; + it->original = bf; + } + return true; + } + } + } + return false; + } + else { + if (data==-1) { + SendMessage(it->hWnd, LB_SETCURSEL, -1, 0); + it->data=0; + it->text = ""; + it->original = ""; + it->originalIdx = -1; + return true; + } + else { + int count = SendMessage(it->hWnd, LB_GETCOUNT, 0, 0); + for (int m = 0; m < count; m++) { + int ret = SendMessage(it->hWnd, LB_GETITEMDATA, m, 0); + + if (ret == data) { + SendMessage(it->hWnd, LB_SETCURSEL, m, 0); + it->data = data; + it->originalIdx = data; + char bf[1024]; + if (SendMessage(it->hWnd, LB_GETTEXT, m, LPARAM(bf)) != LB_ERR) { + it->text = bf; + it->original = bf; + } + return true; + } + } + } + return false; + } + } + } + return false; +} + +bool gdioutput::autoGrow(const char *id) { + list::iterator it; + int size = 0; + TextInfo TI; + TI.format=0; + TI.xp=0; + TI.yp=0; + TI.id=""; + TI.xlimit=0; + TI.callBack=0; + HDC hDC=GetDC(hWndTarget); + + for(it=LBI.begin(); it != LBI.end(); ++it){ + if (it->id==id) { + if (it->IsCombo) { + int count = SendMessage(it->hWnd, CB_GETCOUNT, 0, 0); + for (int m = 0; m < count; m++) { + char bf[1024]; + if (SendMessage(it->hWnd, CB_GETLBTEXT, m, LPARAM(bf))!=CB_ERR) { + TI.text = bf; + calcStringSize(TI, hDC); + size = max(size, TI.textRect.right - TI.textRect.left); + } + m++; + } + + ReleaseDC(hWndTarget, hDC); + + size += scaleLength(20); + if (size > it->width) { + it->width = size; + SetWindowPos(it->hWnd, 0, 0, 0, (int)it->width, (int)it->height, SWP_NOZORDER|SWP_NOCOPYBITS|SWP_NOMOVE); + updatePos(it->xp, it->yp, (int)it->width + int(scale*5), (int)it->height); + return true; + } + return false; + } + else { + int count = SendMessage(it->hWnd, LB_GETCOUNT, 0, 0); + for (int m = 0; m < count; m++) { + char bf[1024]; + int len = SendMessage(it->hWnd, LB_GETTEXT, m, LPARAM(bf)); + if (len!=LB_ERR) { + if (it->lastTabStop == 0) + TI.text = bf; + else { + int pos = len; + while(pos > 0) { + if (bf[pos-1] == '\t') { + break; + } + pos--; + } + TI.text = &bf[pos]; + } + calcStringSize(TI, hDC); + size = max(size, TI.realWidth + it->lastTabStop); + } + } + + ReleaseDC(hWndTarget, hDC); + size += scaleLength(20); + if (size > it->width) { + it->width = size; + SetWindowPos(it->hWnd, 0, 0, 0, (int)it->width, (int)it->height, SWP_NOZORDER|SWP_NOCOPYBITS|SWP_NOMOVE); + updatePos(it->xp, it->yp, (int)it->width+int(scale*5), (int)it->height); + return true; + } + return false; + } + } + } + + ReleaseDC(hWndTarget, hDC); + return false; +} + + +void gdioutput::removeSelected(const char *id) +{ +} + +LRESULT gdioutput::ProcessMsg(UINT iMessage, LPARAM lParam, WPARAM wParam) +{ + string msg; + try { + return ProcessMsgWrp(iMessage, lParam, wParam); + } + catch(std::exception &ex) { + msg=ex.what(); + if (msg.empty()) + msg="Ett okänt fel inträffade."; + } + catch(...) { + msg="Ett okänt fel inträffade."; + } + + + if (!msg.empty()) { + alert(msg); + setWaitCursor(false); + } + return 0; +} + +void gdioutput::processButtonMessage(ButtonInfo &bi, DWORD wParam) +{ + WORD hwParam = HIWORD(wParam); + + switch (hwParam) { + case BN_CLICKED: { + string cmd; + if (getRecorder().recording()) { + if (bi.isExtraString()) { + cmd = "press(\"" + bi.id + "\", \"" + bi.getExtra() + "\"); //" + bi.text; + } + else { + int arg = int(bi.extra); + if (arg > 1000000 || arg < -1000000 || arg == 0) + cmd = "press(\"" + bi.id + "\"); //" + bi.text; + else + cmd = "press(\"" + bi.id + "\", " + itos(bi.getExtraInt()) + "); //" + bi.text; + } + } + if (bi.isCheckbox) + bi.checked = SendMessage(bi.hWnd, BM_GETCHECK, 0, 0)==BST_CHECKED; + bi.synchData(); + if (bi.callBack || bi.handler) { + setWaitCursor(true); + if (!bi.handleEvent(*this, GUI_BUTTON) && bi.callBack) + bi.callBack(this, GUI_BUTTON, &bi); //it may be destroyed here... + + setWaitCursor(false); + } + getRecorder().record(cmd); + break; + } + case BN_SETFOCUS: + if (currentFocus.hWnd != bi.hWnd) { +// if (currentF ocus.wasTabbed) +// Button_SetState(currentFocus.hWnd, false); + currentFocus = bi.hWnd; + } + break; + case BN_KILLFOCUS: + if (currentFocus.hWnd == bi.hWnd) { +// if (currentFocus.wasTabbed) +// Button_SetState(currentFocus.hWnd, false); + } + break; + } +} + +void gdioutput::processEditMessage(InputInfo &bi, DWORD wParam) +{ + WORD hwParam = HIWORD(wParam); + + switch (hwParam) { + case EN_CHANGE: + if (bi.writeLock) + return; + getWindowText(bi.hWnd, bi.text); + if (bi.handler) + bi.handler->handle(*this, bi, GUI_INPUTCHANGE); + else if (bi.callBack) + bi.callBack(this, GUI_INPUTCHANGE, &bi); //it may be destroyed here... + + break; + + case EN_KILLFOCUS: { + string old = bi.focusText; + getWindowText(bi.hWnd, bi.text); + bi.synchData(); + bool equal = old == bi.text; + string cmd = "input(\"" + bi.id + "\", \"" + bi.text + "\");"; + if (bi.handler) + bi.handler->handle(*this, bi, GUI_INPUT); + else if (bi.callBack) + bi.callBack(this, GUI_INPUT, &bi); + if (!equal) + getRecorder().record(cmd); + break; + } + case EN_SETFOCUS: + currentFocus = bi.hWnd; + getWindowText(bi.hWnd, bi.text); + bi.synchData(); + bi.focusText = bi.text; + if (bi.handler) + bi.handler->handle(*this, bi, GUI_FOCUS); + else if (bi.callBack) + bi.callBack(this, GUI_FOCUS, &bi); + break; + } +} + +void gdioutput::processComboMessage(ListBoxInfo &bi, DWORD wParam) +{ + WORD hwParam = HIWORD(wParam); + int index; + switch (hwParam) { + case CBN_SETFOCUS: + currentFocus = bi.hWnd; + lockUpDown = true; + break; + case CBN_KILLFOCUS: + lockUpDown = false; + + char bf[1024]; + index=SendMessage(bi.hWnd, CB_GETCURSEL, 0, 0); + + if (index != CB_ERR) { + if (SendMessage(bi.hWnd, CB_GETLBTEXT, index, LPARAM(bf)) != CB_ERR) { + bi.text = bf; + bi.data=SendMessage(bi.hWnd, CB_GETITEMDATA, index, 0); + if (bi.handler) + bi.handler->handle(*this, bi, GUI_COMBO); + else if (bi.callBack) + bi.callBack(this, GUI_COMBO, &bi); //it may be destroyed here... + } + } + else { + GetWindowText(bi.hWnd, bf, sizeof(bf)-1); + bi.data = -1; + bi.text = bf; + string cmd = "input(\"" + bi.id + "\", \"" + bi.text + "\");"; + if (bi.handler) + bi.handler->handle(*this, bi, GUI_COMBO); + else if (bi.callBack) + bi.callBack(this, GUI_COMBO, &bi); //it may be destroyed here... + getRecorder().record(cmd); + } + break; + + case CBN_EDITCHANGE: { + if (bi.writeLock) + return; + getWindowText(bi.hWnd, bi.text); + if (bi.handler) + bi.handler->handle(*this, bi, GUI_COMBOCHANGE); + else if (bi.callBack) + bi.callBack(this, GUI_COMBOCHANGE, &bi); //it may be destroyed here... + break; + } + case CBN_SELCHANGE: + index=SendMessage(bi.hWnd, CB_GETCURSEL, 0, 0); + + if (index != CB_ERR) { + bi.data=SendMessage(bi.hWnd, CB_GETITEMDATA, index, 0); + + char bf[1024]; + if (SendMessage(bi.hWnd, CB_GETLBTEXT, index, LPARAM(bf)) != CB_ERR) + bi.text=bf; + string cmd = "select(\"" + bi.id + "\", " + itos(bi.data) + ");"; + internalSelect(bi); + getRecorder().record(cmd); + } + break; + } +} + +#ifndef MEOSDB + +void gdioutput::keyCommand(KeyCommandCode code) { + if (hasCommandLock()) + return; + + if (code == KC_SLOWDOWN) + autoSpeed *= 0.9; + else if (code == KC_SPEEDUP) + autoSpeed *= 1.0/0.9; + + string msg; + try { + list::iterator tit; + if (useTables) { + for (tit=Tables.begin(); tit!=Tables.end(); ++tit) + if (tit->table->keyCommand(*this, code)) + return; + } + + for (list::iterator it = Events.begin(); it != Events.end(); ++it) { + if (it->getKeyCommand() == code) { + it->setData("", 0); + it->setExtra(0); + if (!it->handleEvent(*this, GUI_EVENT) && it->callBack) { + it->callBack(this, GUI_EVENT, &*it); //it may be destroyed here... + } + return; + } + } + } + catch(std::exception &ex) { + msg = ex.what(); + if (msg.empty()) + msg="Ett okänt fel inträffade."; + } + catch(...) { + msg = "Ett okänt fel inträffade."; + } + + if (!msg.empty()) + alert(msg); +} + +#endif + +void gdioutput::processListMessage(ListBoxInfo &bi, DWORD wParam) +{ + WORD hwParam = HIWORD(wParam); + int index; + + switch (hwParam) { + case LBN_SETFOCUS: + currentFocus = bi.hWnd; + lockUpDown = true; + break; + case LBN_KILLFOCUS: + lockUpDown = false; + break; + case LBN_SELCHANGE: + case LBN_DBLCLK: + + index=SendMessage(bi.hWnd, LB_GETCURSEL, 0, 0); + + if (index!=LB_ERR) { + bi.data = SendMessage(bi.hWnd, LB_GETITEMDATA, index, 0); + + char bf[1024]; + if (SendMessage(bi.hWnd, LB_GETTEXT, index, LPARAM(bf)) != LB_ERR) + bi.text = bf; + + string cmd; + if (hwParam == LBN_SELCHANGE) + cmd = "select(\"" + bi.id + "\", " + itos(bi.data) + ");"; + else + cmd = "dblclick(\"" + bi.id + "\", " + itos(bi.data) + ");"; + + if (bi.callBack || bi.handler) { + setWaitCursor(true); + if (hwParam == LBN_SELCHANGE) { + if (bi.handler) + bi.handler->handle(*this, bi, GUI_LISTBOX); + else + bi.callBack(this, GUI_LISTBOX, &bi); //it may be destroyed here... + } + else { + if (bi.handler) + bi.handler->handle(*this, bi, GUI_LISTBOXSELECT); + else + bi.callBack(this, GUI_LISTBOXSELECT, &bi); //it may be destroyed here... + } + setWaitCursor(false); + } + getRecorder().record(cmd); + } + break; + } +} + + +LRESULT gdioutput::ProcessMsgWrp(UINT iMessage, LPARAM lParam, WPARAM wParam) +{ + if (iMessage==WM_COMMAND) { + WORD hwParam = HIWORD(wParam); + HWND hWnd=(HWND)lParam; + if (hwParam==EN_CHANGE) { + list::iterator tit; + if (useTables) + for (tit=Tables.begin(); tit!=Tables.end(); ++tit) + if (tit->table->inputChange(*this, hWnd)) + return 0; + } + + { + //list::iterator it; + //for (it=BI.begin(); it != BI.end(); ++it) { + stdext::hash_map::iterator it = biByHwnd.find(HWND(lParam)); + + // if (it->hWnd==hWnd) { + if ( it != biByHwnd.end() ) { + ButtonInfo &bi = *it->second; + processButtonMessage(bi, wParam); + return 0; + } + //} + } + + { + stdext::hash_map::iterator it = iiByHwnd.find(HWND(lParam)); + if (it != iiByHwnd.end()) { + InputInfo &ii = *it->second; + processEditMessage(ii, wParam); + return 0; + } + //list::iterator it; + /*for (it=II.begin(); it != II.end(); ++it) { + if (it->hWnd==hWnd) { + processEditMessage(*it, wParam); + return 0; + } + }*/ + } + + { + //list::iterator it; + //for(it=LBI.begin(); it != LBI.end(); ++it) { + stdext::hash_map::iterator it = lbiByHwnd.find(HWND(lParam)); + if (it != lbiByHwnd.end()) { + ListBoxInfo &lbi = *it->second; + if (lbi.IsCombo) + processComboMessage(lbi, wParam); + else + processListMessage(lbi, wParam); + return 0; + } + } + } + else if (iMessage==WM_MOUSEMOVE) { + POINT pt; + pt.x=(signed short)LOWORD(lParam); + pt.y=(signed short)HIWORD(lParam); + + list::iterator tit; + + bool GotCapture=false; + + if (useTables) + for (tit=Tables.begin(); tit!=Tables.end(); ++tit) + GotCapture = tit->table->mouseMove(*this, pt.x, pt.y) || GotCapture; + + if (GotCapture) + return 0; + + list::iterator it=IBox.begin(); + + + while (it != IBox.end()) { + if (PtInRect(&it->TextRect, pt) && (it->callBack || it->hasEventHandler())) { + SetCursor(LoadCursor(NULL, IDC_HAND)); + + HDC hDC=GetDC(hWndTarget); + drawBoxText(hDC, it->TextRect, *it, true); + ReleaseDC(hWndTarget, hDC); + SetCapture(hWndTarget); + GotCapture=true; + it->HasTCapture=true; + } + else { + if (it->HasTCapture) { + HDC hDC=GetDC(hWndTarget); + drawBoxText(hDC, it->TextRect, *it, false); + ReleaseDC(hWndTarget, hDC); + if (!GotCapture) + ReleaseCapture(); + it->HasTCapture=false; + } + } + + if (it->HasCapture) { + if (GetCapture()!=hWndTarget) { + HDC hDC=GetDC(hWndTarget); + drawCloseBox(hDC, it->Close, false); + ReleaseDC(hWndTarget, hDC); + if (!GotCapture) ReleaseCapture(); + it->HasCapture=false; + } + else if (!PtInRect(&it->Close, pt)) { + HDC hDC=GetDC(hWndTarget); + drawCloseBox(hDC, it->Close, false); + ReleaseDC(hWndTarget, hDC); + } + else { + HDC hDC=GetDC(hWndTarget); + drawCloseBox(hDC, it->Close, true); + ReleaseDC(hWndTarget, hDC); + } + } + ++it; + } + + for (size_t k=0;k::iterator it=IBox.begin(); + + POINT pt; + pt.x=(signed short)LOWORD(lParam); + pt.y=(signed short)HIWORD(lParam); + + list::iterator tit; + + if (useTables) + for (tit=Tables.begin(); tit!=Tables.end(); ++tit) + if (tit->table->mouseLeftDown(*this, pt.x, pt.y)) + return 0; + + while(it!=IBox.end()) { + if (PtInRect(&it->Close, pt)) { + HDC hDC=GetDC(hWndTarget); + drawCloseBox(hDC, it->Close, true); + ReleaseDC(hWndTarget, hDC); + SetCapture(hWndTarget); + it->HasCapture=true; + } + ++it; + } + + + //Handle links + for (size_t k=0;k::iterator tit; + + list::iterator it=IBox.begin(); + + POINT pt; + pt.x=(signed short)LOWORD(lParam); + pt.y=(signed short)HIWORD(lParam); + + if (useTables) + for (tit=Tables.begin(); tit!=Tables.end(); ++tit) + if (tit->table->mouseLeftUp(*this, pt.x, pt.y)) + return 0; + + while (it!=IBox.end()) { + if (it->HasCapture) { + HDC hDC=GetDC(hWndTarget); + drawCloseBox(hDC, it->Close, false); + ReleaseDC(hWndTarget, hDC); + ReleaseCapture(); + it->HasCapture=false; + + if (PtInRect(&it->Close, pt)) { + IBox.erase(it); + refresh(); + return 0; + } + } + else if (it->HasTCapture) { + ReleaseCapture(); + it->HasTCapture=false; + + if (PtInRect(&it->TextRect, pt)) { + if (!it->handleEvent(*this, GUI_INFOBOX) && it->callBack) + it->callBack(this, GUI_INFOBOX, &*it); //it may be destroyed here... + return 0; + } + } + ++it; + } + + //Handle links + for (size_t k=0;k::iterator tit; + POINT pt; + pt.x=(signed short)LOWORD(lParam); + pt.y=(signed short)HIWORD(lParam); + + if (useTables) + for (tit=Tables.begin(); tit!=Tables.end(); ++tit) + if (tit->table->mouseLeftDblClick(*this, pt.x, pt.y)) + return 0; + + } + else if (iMessage == WM_CHAR) { + /*list::iterator tit; + if (useTables) + for (tit=Tables.begin(); tit!=Tables.end(); ++tit) + if (tit->table->character(*this, int(wParam), lParam & 0xFFFF)) + return 0;*/ + } + else if (iMessage == WM_CTLCOLOREDIT) { + //for (list::const_iterator it = II.begin(); it != II.end(); ++it) { + // if (it->hWnd == HWND(lParam)) { + stdext::hash_map::iterator it = iiByHwnd.find(HWND(lParam)); + if (it != iiByHwnd.end()) { + InputInfo &ii = *it->second; + if (ii.bgColor != colorDefault || ii.fgColor != colorDefault) { + if (ii.bgColor != colorDefault) { + SetDCBrushColor(HDC(wParam), ii.bgColor); + SetBkColor(HDC(wParam), ii.bgColor); + } + else { + SetDCBrushColor(HDC(wParam), GetSysColor(COLOR_WINDOW)); + SetBkColor(HDC(wParam), GetSysColor(COLOR_WINDOW)); + } + if (ii.fgColor != colorDefault) + SetTextColor(HDC(wParam), ii.fgColor); + return LRESULT(GetStockObject(DC_BRUSH)); + } + } + + return 0; + } + + return 0; +} + +void gdioutput::TabFocus(int direction) +{ + list::iterator tit; + + if (useTables) + for (tit=Tables.begin(); tit!=Tables.end(); ++tit) + if (tit->table->tabFocus(*this, direction)) + return; + + if (FocusList.empty()) + return; + + list::iterator it=FocusList.begin(); + + while(it!=FocusList.end() && *it != currentFocus.hWnd) + ++it; + + //if (*it==CurrentFocus) + if (it!=FocusList.end()) { + if (direction==1){ + ++it; + if (it==FocusList.end()) it=FocusList.begin(); + while(!IsWindowEnabled(*it) && *it != currentFocus.hWnd){ + ++it; + if (it==FocusList.end()) it=FocusList.begin(); + } + } + else{ + if (it==FocusList.begin()) it=FocusList.end(); + + it--; + while(!IsWindowEnabled(*it) && *it != currentFocus.hWnd){ + if (it==FocusList.begin()) it=FocusList.end(); + it--; + } + + } + + // if (currentFocus.wasTabbed) + // Button_SetState(currentFocus.hWnd, false); + + HWND hWT = *it; + //SetFocus(0); + SetFocus(hWT); + currentFocus = hWT; + //currentFocus = *it; + /*if (biByHwnd.find(currentFocus.hWnd) != biByHwnd.end()) { + currentFocus.wasTabbed = true; + Button_SetState(currentFocus.hWnd, true); + }*/ + } + else{ + SetFocus(currentFocus.hWnd); + currentFocus=*FocusList.begin(); + + } +} + +bool gdioutput::isInputChanged(const string &exclude) +{ + for(list::iterator it=II.begin(); it != II.end(); ++it) { + if (it->id!=exclude) { + if (it->changed() && !it->ignoreCheck) + return true; + } + } + + for (list::iterator it = LBI.begin(); it != LBI.end(); ++it) { + getSelectedItem(*it); + if (it->changed() && !it->ignoreCheck) + return true; + } + + for (list::iterator it = BI.begin(); it != BI.end(); ++it) { + bool checked = SendMessage(it->hWnd, BM_GETCHECK, 0, 0)==BST_CHECKED; + if (it->originalState != checked) + return true; + } + + return false; +} + +InputInfo *gdioutput::replaceSelection(const char *id, const string &text) +{ + for(list::iterator it=II.begin(); it != II.end(); ++it) + if (it->id==id) { + SendMessage(it->hWnd, EM_REPLACESEL, TRUE, LPARAM(text.c_str())); + return &*it; + } + + return 0; +} + +BaseInfo *gdioutput::setInputFocus(const string &id, bool select) +{ + for(list::iterator it=II.begin(); it != II.end(); ++it) + if (it->id==id) { + scrollTo(it->xp, it->yp); + BaseInfo *bi = SetFocus(it->hWnd)!=NULL ? &*it: 0; + if (bi) { + if (select) + PostMessage(it->hWnd, EM_SETSEL, it->text.length(), 0); + } + return bi; + } + + for(list::iterator it=LBI.begin(); it!=LBI.end();++it) + if (it->id==id) { + scrollTo(it->xp, it->yp); + return SetFocus(it->hWnd)!=NULL ? &*it: 0; + } + + for(list::iterator it=BI.begin(); it!=BI.end();++it) + if (it->id==id) { + scrollTo(it->xp, it->yp); + return SetFocus(it->hWnd)!=NULL ? &*it: 0; + } + + return 0; +} + +InputInfo *gdioutput::getInputFocus() +{ + HWND hF=GetFocus(); + + if (hF) { + list::iterator it; + + for(it=II.begin(); it != II.end(); ++it) + if (it->hWnd==hF) + return &*it; + } + return 0; +} + +void gdioutput::Enter() +{ + if (hasCommandLock()) + return; + + string msg; + try { + doEnter(); + } + catch(std::exception &ex) { + msg = ex.what(); + if (msg.empty()) + msg="Ett okänt fel inträffade."; + } + catch(...) { + msg = "Ett okänt fel inträffade."; + } + + if (!msg.empty()) + alert(msg); +} + +void gdioutput::doEnter() +{ + list::iterator tit; + + if (useTables) + for (tit=Tables.begin(); tit!=Tables.end(); ++tit) + if (tit->table->enter(*this)) + return; + + HWND hWnd=GetFocus(); + + for (list::iterator it=BI.begin(); it!=BI.end(); ++it) + if (it->isDefaultButton() && (it->callBack || it->handler)) { + if (it->handler) + it->handleEvent(*this, GUI_BUTTON); + else + it->callBack(this, GUI_BUTTON, &*it); + return; + } + + list::iterator it; + + for(it=II.begin(); it != II.end(); ++it) + if (it->hWnd==hWnd && (it->callBack || it->handler)){ + char bf[1024]; + GetWindowText(hWnd, bf, 1024); + it->text=bf; + if (it->handler) + it->handleEvent(*this, GUI_INPUT); + else + it->callBack(this, GUI_INPUT, &*it); + return; + } +} + +bool gdioutput::UpDown(int direction) +{ + string msg; + try { + return doUpDown(direction); + } + catch(std::exception &ex) { + msg = ex.what(); + if (msg.empty()) + msg="Ett okänt fel inträffade."; + } + catch(...) { + msg = "Ett okänt fel inträffade."; + } + + if (!msg.empty()) + alert(msg); + return false; +} + + +bool gdioutput::doUpDown(int direction) +{ + list::iterator tit; + + if (useTables) + for (tit=Tables.begin(); tit!=Tables.end(); ++tit) + if (tit->table->UpDown(*this, direction)) + return true; + + return false; +} + +void gdioutput::Escape() +{ + if (hasCommandLock()) + return; + string msg; + try { + doEscape(); + } + catch(std::exception &ex) { + msg = ex.what(); + if (msg.empty()) + msg="Ett okänt fel inträffade."; + } + catch(...) { + msg = "Ett okänt fel inträffade."; + } + + if (!msg.empty()) + alert(msg); +} + + +void gdioutput::doEscape() +{ + if (fullScreen) { + PostMessage(hWndTarget, WM_CLOSE, 0,0); + } + + list::iterator tit; + + if (useTables) + for (tit=Tables.begin(); tit!=Tables.end(); ++tit) + tit->table->escape(*this); + + for (list::iterator it=BI.begin(); it!=BI.end(); ++it) { + if (it->isCancelButton() && (it->callBack || it->handler) ) { + if (it->handler) + it->handleEvent(*this, GUI_BUTTON); + else + it->callBack(this, GUI_BUTTON, &*it); + return; + } + } +} + +void gdioutput::clearPage(bool autoRefresh, bool keepToolbar) { + lockUpDown = false; + hasAnyTimer = false; + enableTables(); + #ifndef MEOSDB + if (toolbar && !keepToolbar) + toolbar->hide(); + #endif + + while(!timers.empty()) { + KillTimer(hWndTarget, (UINT_PTR)&timers.back()); + timers.back().parent = 0; + timers.pop_back(); + } + + restorePoints.clear(); + shownStrings.clear(); + onClear=0; + FocusList.clear(); + currentFocus = 0; + TL.clear(); + itTL=TL.end(); + listDescription.clear(); + + if (hWndTarget && autoRefresh) + InvalidateRect(hWndTarget, NULL, true); + + fillDown(); + + hasCleared = true; + + for (ToolList::iterator it = toolTips.begin(); it != toolTips.end(); ++it) { + if (hWndToolTip) { + SendMessage(hWndToolTip, TTM_DELTOOL, 0, (LPARAM) &it->ti); + } + } + toolTips.clear(); + + { + list::iterator it; + for(it=BI.begin(); it != BI.end(); ++it) { + it->callBack = 0; + it->setHandler(0); + DestroyWindow(it->hWnd); + } + biByHwnd.clear(); + BI.clear(); + } + { + list::iterator it; + for(it=II.begin(); it != II.end(); ++it) { + it->callBack = 0; + it->setHandler(0); + DestroyWindow(it->hWnd); + } + iiByHwnd.clear(); + II.clear(); + } + + { + list::iterator it; + for(it=LBI.begin(); it != LBI.end(); ++it) { + it->callBack = 0; + it->setHandler(0); + DestroyWindow(it->hWnd); + if (it->writeLock) + hasCleared = true; + } + lbiByHwnd.clear(); + LBI.clear(); + } + + //delete table; + //table=0; + while(!Tables.empty()){ + Table *t=Tables.front().table; + Tables.front().table=0; + Tables.pop_front(); + t->hide(*this); + t->releaseOwnership(); + } + + DataInfo.clear(); + FocusList.clear(); + Events.clear(); + + Rectangles.clear(); + + MaxX=40; + MaxY=100; + + CurrentX=40; + CurrentY=START_YP; + + OffsetX=0; + OffsetY=0; + + renderOptimize=true; + + setRestorePoint(); + + if (autoRefresh) + updateScrollbars(); + + try { + if (postClear) + postClear(this, GUI_POSTCLEAR, 0); + } + catch(const std::exception &ex) { + if (isTestMode) + throw ex; + + string msg(ex.what()); + alert(msg); + } + postClear = 0; + + manualUpdate=!autoRefresh; +} + +void gdioutput::getWindowText(HWND hWnd, string &text) +{ + char bf[1024]; + char *bptr=bf; + + int len=GetWindowTextLength(hWnd); + + if (len>1023) + bptr=new char[len+1]; + + GetWindowText(hWnd, bptr, len+1); + text=bptr; + + if (len>1023) + delete[] bptr; +} + +BaseInfo &gdioutput::getBaseInfo(const char *id) const { + for(list::const_iterator it=II.begin(); + it != II.end(); ++it){ + if (it->id==id){ + return const_cast(*it); + } + } + + for(list::const_iterator it=LBI.begin(); + it != LBI.end(); ++it){ + if (it->id==id){ + return const_cast(*it); + } + } + + for(list::const_iterator it=BI.begin(); + it != BI.end(); ++it){ + if (it->id==id) { + return const_cast(*it); + } + } + + for(list::const_iterator it=TL.begin(); + it != TL.end(); ++it){ + if (it->id==id) { + return const_cast(*it); + } + } + + string err = string("Internal Error, identifier not found: X#") + id; + throw std::exception(err.c_str()); +} + +const string &gdioutput::getText(const char *id, bool acceptMissing) const +{ + char bf[1024]; + char *bptr=bf; + + for(list::const_iterator it=II.begin(); + it != II.end(); ++it){ + if (it->id==id){ + int len=GetWindowTextLength(it->hWnd); + + if (len>1023) + bptr=new char[len+1]; + + GetWindowText(it->hWnd, bptr, len+1); + const_cast(it->text)=bptr; + + if (len>1023) + delete[] bptr; + + return it->text; + } + } + + for(list::const_iterator it=LBI.begin(); + it != LBI.end(); ++it){ + if (it->id==id && it->IsCombo){ + if (!it->writeLock) { + GetWindowText(it->hWnd, bf, 1024); + const_cast(it->text)=bf; + } + return it->text; + } + } + + for(list::const_iterator it=TL.begin(); + it != TL.end(); ++it){ + if (it->id==id) { + return it->text; + } + } + +#ifdef _DEBUG + if (!acceptMissing) { + string err = string("Internal Error, identifier not found: X#") + id; + throw std::exception(err.c_str()); + } +#endif + return _EmptyString; +} + +bool gdioutput::hasField(const string &id) const +{ + for(list::const_iterator it=II.begin(); + it != II.end(); ++it){ + if (it->id==id) + return true; + } + + for(list::const_iterator it=LBI.begin(); + it != LBI.end(); ++it){ + if (it->id==id) + return true; + } + + for(list::const_iterator it=BI.begin(); + it != BI.end(); ++it){ + if (it->id==id) + return true; + } + + return false; +} + +int gdioutput::getTextNo(const char *id, bool acceptMissing) const +{ + const string &t = getText(id, acceptMissing); + return atoi(t.c_str()); +} + +BaseInfo *gdioutput::setTextTranslate(const char *id, + const string &text, + bool update) { + return setText(id, lang.tl(text), update); +} + +BaseInfo *gdioutput::setTextTranslate(const string &id, + const string &text, + bool update) { + return setText(id, lang.tl(text), update); +} + +BaseInfo *gdioutput::setTextTranslate(const char *id, + const char *text, + bool update) { + return setText(id, lang.tl(text), update); +} + + + +BaseInfo *gdioutput::setText(const char *id, int number, bool Update) +{ + char bf[16]; + sprintf_s(bf, 16, "%d", number); + return setText(id, bf, Update); +} + +BaseInfo *gdioutput::setTextZeroBlank(const char *id, int number, bool Update) +{ + if (number!=0) + return setText(id, number, Update); + else + return setText(id, "", Update); +} + +BaseInfo *gdioutput::setText(const char *id, const string &text, bool Update) +{ + for (list::iterator it=II.begin(); + it != II.end(); ++it) { + if (it->id==id) { + bool oldWR = it->writeLock; + it->writeLock = true; + SetWindowText(it->hWnd, text.c_str()); + it->writeLock = oldWR; + it->text = text; + it->synchData(); + it->original = text; + it->focusText = text; + return &*it; + } + } + + for (list::iterator it=LBI.begin(); + it != LBI.end(); ++it) { + if (it->id==id && it->IsCombo) { + SetWindowText(it->hWnd, text.c_str()); + it->text = text; + it->original = text; + return &*it; + } + } + + for (list::iterator it=BI.begin(); + it != BI.end(); ++it) { + if (it->id==id) { + SetWindowText(it->hWnd, text.c_str()); + it->text=text; + return &*it; + } + } + + for(list::iterator it=TL.begin(); + it != TL.end(); ++it){ + if (it->id==id) { + RECT rc=it->textRect; + + it->text=text; + calcStringSize(*it); + + rc.right=max(it->textRect.right, rc.right); + rc.bottom=max(it->textRect.bottom, rc.bottom); + + bool changed = updatePos(0, 0, it->textRect.right, it->textRect.bottom); + + if (Update && hWndTarget) { + if (changed) + InvalidateRect(hWndTarget, 0, true); + else + InvalidateRect(hWndTarget, &rc, true); + } + return &*it; + } + } + return 0; +} + +bool gdioutput::insertText(const string &id, const string &text) +{ + for (list::iterator it=II.begin(); + it != II.end(); ++it) { + if (it->id==id) { + SetWindowText(it->hWnd, text.c_str()); + it->text = text; + + if (it->handler) + it->handleEvent(*this, GUI_INPUT); + else if (it->callBack) + it->callBack(this, GUI_INPUT, &*it); + + return true; + } + } + return false; +} + +void gdioutput::setData(const string &id, DWORD data) +{ + void *pd = (void *)(data); + setData(id, pd); +} + +void gdioutput::setData(const string &id, void *data) +{ + list::iterator it; + for(it=DataInfo.begin(); it != DataInfo.end(); ++it){ + if (it->id==id){ + it->data = data; + return; + } + } + + DataStore ds; + ds.id=id; + ds.data=data; + + DataInfo.push_front(ds); + return; +} + +bool gdioutput::getData(const string &id, DWORD &data) const +{ + list::const_iterator it; + for(it=DataInfo.begin(); it != DataInfo.end(); ++it){ + if (it->id==id){ + data=DWORD(it->data); + return true; + } + } + + data=0; + return false; +} + +void *gdioutput::getData(const string &id) const { + list::const_iterator it; + for (it = DataInfo.begin(); it != DataInfo.end(); ++it){ + if (it->id == id){ + return it->data; + } + } + + throw meosException("Data X not found#" + id); +} + +bool gdioutput::hasData(const char *id) const { + DWORD dummy; + return getData(id, dummy); +} + + +bool gdioutput::updatePos(int x, int y, int width, int height) { + int ox=MaxX; + int oy=MaxY; + + MaxX=max(x+width, MaxX); + MaxY=max(y+height, MaxY); + bool changed = (ox!=MaxX || oy!=MaxY); + + if (changed && hWndTarget && !manualUpdate) { + RECT rc; + if (ox == MaxX) { + rc.top = oy - CurrentY - 5; + rc.bottom = MaxY - CurrentY + scaleLength(50); + rc.right = 10000; + rc.left = 0; + InvalidateRect(hWndTarget, &rc, true); + } + else { + InvalidateRect(hWndTarget, 0, true); + } + GetClientRect(hWndTarget, &rc); + + if (MaxX>rc.right || MaxY>rc.bottom) //Update scrollbars + SendMessage(hWndTarget, WM_SIZE, 0, MAKELONG(rc.right, rc.bottom)); + + } + + if (Direction==1) { + CurrentY=max(y+height, CurrentY); + } + else if (Direction==0) { + CurrentX=max(x+width, CurrentX); + } + return changed; +} + +void gdioutput::adjustDimension(int width, int height) +{ + int ox = MaxX; + int oy = MaxY; + + MaxX = width; + MaxY = height; + + if ((ox!=MaxX || oy!=MaxY) && hWndTarget && !manualUpdate) { + RECT rc; + if (ox == MaxX) { + rc.top = oy - CurrentY - 5; + rc.bottom = MaxY - CurrentY + scaleLength(50); + rc.right = 10000; + rc.left = 0; + InvalidateRect(hWndTarget, &rc, true); + } + else { + InvalidateRect(hWndTarget, 0, true); + } + GetClientRect(hWndTarget, &rc); + + if (MaxX>rc.right || MaxY>rc.bottom) //Update scrollbars + SendMessage(hWndTarget, WM_SIZE, 0, MAKELONG(rc.right, rc.bottom)); + + } +} + + +void gdioutput::alert(const string &msg) const +{ + if (isTestMode) { + if (!cmdAnswers.empty()) { + string ans = cmdAnswers.front(); + cmdAnswers.pop_front(); + if (ans == "ok") + return; + } + throw meosException(msg + "-- ok"); + } + + HWND hFlt = getToolbarWindow(); + if (hasToolbar()) { + EnableWindow(hFlt, false); + } + refreshFast(); + SetForegroundWindow(hWndAppMain); + setCommandLock(); + try { + MessageBoxW(hWndAppMain, toWide(lang.tl(msg)).c_str(), L"MeOS", MB_OK|MB_ICONINFORMATION); + if (hasToolbar()) { + EnableWindow(hFlt, true); + } + liftCommandLock(); + } + catch (...) { + liftCommandLock(); + throw; + } +} + +bool gdioutput::ask(const string &s) +{ + if (isTestMode) { + if (!cmdAnswers.empty()) { + string ans = cmdAnswers.front(); + cmdAnswers.pop_front(); + if (ans == "yes") + return true; + else if (ans == "no") + return false; + } + throw meosException(s + "--yes/no"); + } + + setCommandLock(); + SetForegroundWindow(hWndAppMain); + bool yes; + try { + yes = MessageBoxW(hWndAppMain, toWide(lang.tl(s)).c_str(), L"MeOS", MB_YESNO|MB_ICONQUESTION)==IDYES; + liftCommandLock(); + } + catch (...) { + liftCommandLock(); + throw; + } + + return yes; +} + +gdioutput::AskAnswer gdioutput::askCancel(const string &s) +{ + if (isTestMode) { + if (!cmdAnswers.empty()) { + string ans = cmdAnswers.front(); + cmdAnswers.pop_front(); + if (ans == "cancel") + return AnswerCancel; + else if (ans == "yes") + return AnswerYes; + else if (ans == "no") + return AnswerNo; + } + throw meosException(s + "--yes/no/cancel"); + } + + setCommandLock(); + SetForegroundWindow(hWndAppMain); + int a = MessageBoxW(hWndAppMain, toWide(lang.tl(s)).c_str(), L"MeOS", MB_YESNOCANCEL|MB_ICONQUESTION); + liftCommandLock(); + if (a == IDYES) + return AnswerYes; + else if (a == IDNO) + return AnswerNo; + else + return AnswerCancel; +} + + +void gdioutput::setTabStops(const string &Name, int t1, int t2) +{ + DWORD array[2]; + int n=1; + LONG bu=GetDialogBaseUnits(); + int baseunitX=LOWORD(bu); + array[0]=(t1 * 4) / baseunitX ; + array[1]=(t2 * 4) / baseunitX ; + int lastTabStop = 0; + if (t2>0) { + n=2; + lastTabStop = t2; + } + else { + lastTabStop = t1; + } + + list::iterator it; + for(it=LBI.begin(); it != LBI.end(); ++it){ + if (it->id==Name){ + if (!it->IsCombo) { + SendMessage(it->hWnd, LB_SETTABSTOPS, n, LPARAM(array)); + it->lastTabStop = lastTabStop; + } + return; + } + } +} + +void gdioutput::setInputStatus(const char *id, bool status, bool acceptMissing) { + bool hit = false; + for(list::iterator it=II.begin(); it != II.end(); ++it) + if (it->id==id) { + EnableWindow(it->hWnd, status); + hit = true; + } + for(list::iterator it=LBI.begin(); it != LBI.end(); ++it) + if (it->id==id) { + EnableWindow(it->hWnd, status); + hit = true; + } + for(list::iterator it=BI.begin(); it != BI.end(); ++it) + if (it->id==id) { + EnableWindow(it->hWnd, status); + if (it->isCheckbox) { + string tid = "T" + it->id; + for(list::iterator tit=TL.begin(); tit != TL.end(); ++tit){ + if (tit->id == tid) { + enableCheckBoxLink(*tit, status); + break; + } + } + } + + hit = true; + if (status==false) { + it->storedFlags |= it->flags; + it->flags = 0; //Remove default status etc. + } + else { + // Restore flags + it->flags |= it->storedFlags; + } + } + + if (acceptMissing) + return; +#ifdef _DEBUG + if (!hit) { + string err = string("Internal Error, identifier not found: X#") + id; + throw std::exception(err.c_str()); + } +#endif +} + +void gdioutput::refresh() const { +#ifdef DEBUGRENDER + OutputDebugString("### Full refresh\n"); +#endif + if (hWndTarget) { + updateScrollbars(); + InvalidateRect(hWndTarget, NULL, true); + UpdateWindow(hWndTarget); + } + screenXYToString.clear(); + stringToScreenXY.clear(); +} + +void gdioutput::refreshFast() const { +#ifdef DEBUGRENDER + OutputDebugString("Fast refresh\n"); +#endif + if (hWndTarget) { + InvalidateRect(hWndTarget, NULL, true); + UpdateWindow(hWndTarget); + } + screenXYToString.clear(); + stringToScreenXY.clear(); +} + + +void gdioutput::takeShownStringsSnapshot() { +#ifdef DEBUGRENDER + OutputDebugString("** Take snapshot\n"); +#endif + + screenXYToString.clear(); + stringToScreenXY.clear(); + snapshotMaxXY.first = MaxX; + snapshotMaxXY.second = MaxY - OffsetY; +#ifdef DEBUGRENDER + OutputDebugString(("ymax:" + itos(MaxY-OffsetY) + "\n").c_str()); +#endif + for (size_t k = 0; k < shownStrings.size(); k++) { + if (shownStrings[k]->hasTimer) + continue; //Ignore + int x = shownStrings[k]->xp - OffsetX; + int y = shownStrings[k]->yp - OffsetY; + const string &str = shownStrings[k]->text; +#ifdef DEBUGRENDER + //OutputDebugString((itos(k) + ":" + itos(shownStrings[k]->xp) + "," + itos(shownStrings[k]->yp) + "," + str + "\n").c_str()); +#endif + screenXYToString.insert(make_pair(make_pair(x, y), ScreenStringInfo(shownStrings[k]->textRect, str))); + if (stringToScreenXY.count(str) == 0) + stringToScreenXY.insert(make_pair(str,make_pair(x, y))); + } + + RECT rc; + GetClientRect(hWndTarget, &rc); + int BoundYup = OffsetY; + int BoundYdown = OffsetY+rc.bottom; + for (list::iterator it = Rectangles.begin(); it != Rectangles.end(); ++it) { + if (it->rc.top <= BoundYdown && it->rc.bottom >= BoundYup) { + string r = "[R]"; + RECT rect_rc = it->rc; + OffsetRect(&rect_rc, -OffsetX, -OffsetY); + screenXYToString.insert(make_pair(make_pair(rect_rc.left, rect_rc.top), ScreenStringInfo(rect_rc, r))); + } + } +} + +void updateScrollInfo(HWND hWnd, gdioutput &gdi, int nHeight, int nWidth); + +void gdioutput::refreshSmartFromSnapshot(bool allowMoveOffset) { +#ifdef DEBUGRENDER + OutputDebugString("Smart refresh\n"); +#endif + + RECT clientRC; + GetClientRect(hWndTarget, &clientRC); + + updateStringPosCache(); + + vector changedStrings; + bool updateScroll = false; + if (allowMoveOffset) { + map< pair, int> offsetCount; + int misses = 0, hits = 0; + for (size_t k = 0; k < shownStrings.size(); k++) { + if (shownStrings[k]->hasTimer) + continue; //Ignore + int x = shownStrings[k]->xp - OffsetX; + int y = shownStrings[k]->yp - OffsetY; + const string &str = shownStrings[k]->text; + map >::const_iterator found = stringToScreenXY.find(str); + if (found != stringToScreenXY.end()) { + hits++; + int ox = found->second.first - x; + int oy = found->second.second - y; + ++offsetCount[make_pair(ox, oy)]; + if (hits > 30) + break; + } + else { + misses++; + if (misses > 20) + break; + } + } + + // Choose dominating offset, if dominating enough + pair offset(0,0); + int maxVal = 10; // Require at least 10 hits + for(map< pair, int>::iterator it = offsetCount.begin(); it != offsetCount.end(); ++it) { + if (it->second > maxVal) { + maxVal = it->second; + offset = it->first; + } + } + + int maxOffsetY=max(GetPageY()-clientRC.bottom, 0); + int maxOffsetX=max(GetPageX()-clientRC.right, 0); + int noy = OffsetY - offset.second; + int nox = OffsetX - offset.first; + if ((offset.first != 0 && nox>0 && nox0 && noyhasTimer) + continue; //Ignore + + int x = shownStrings[k]->xp - OffsetX; + int y = shownStrings[k]->yp - OffsetY; + const string &str = shownStrings[k]->text; +#ifdef DEBUGRENDER + //OutputDebugString((itos(k) + ":" + itos(shownStrings[k]->xp) + "," + itos(shownStrings[k]->yp) + "," + str + "\n").c_str()); +#endif + map, ScreenStringInfo>::iterator res = screenXYToString.find(make_pair(x,y)); + if (res != screenXYToString.end()) { + res->second.reached = true; + if (str != res->second.str) { + if (res->second.rc.bottom >= 0 && res->second.rc.top <= clientRC.bottom) { + changedStrings.push_back(k); + invalidRect.top = min(invalidRect.top, res->second.rc.top); + invalidRect.bottom = max(invalidRect.bottom, res->second.rc.bottom); + invalidRect.left = min(invalidRect.left, res->second.rc.left); + invalidRect.right = max(invalidRect.right, res->second.rc.right); + } + } + } + else + changedStrings.push_back(k); + } + + RECT rc; + GetClientRect(hWndTarget, &rc); + int BoundYup = OffsetY; + int BoundYdown = OffsetY+rc.bottom; + for (list::iterator it = Rectangles.begin(); it != Rectangles.end(); ++it) { + if (it->rc.top <= BoundYdown && it->rc.bottom >= BoundYup) { + RECT rect_rc = it->rc; + OffsetRect(&rect_rc, -OffsetX, -OffsetY); + + map, ScreenStringInfo>::iterator res = screenXYToString.find(make_pair(rect_rc.left, rect_rc.top)); + bool add = false; + if (res != screenXYToString.end()) { + res->second.reached = true; + if (!EqualRect(&rect_rc, &res->second.rc)) { + add = true; + invalidRect.top = min(invalidRect.top, res->second.rc.top); + invalidRect.bottom = max(invalidRect.bottom, res->second.rc.bottom); + invalidRect.left = min(invalidRect.left, res->second.rc.left); + invalidRect.right = max(invalidRect.right, res->second.rc.right); + } + } + else + add = true; + + if (add) { + invalid = true; + invalidRect.top = min(invalidRect.top, rect_rc.top); + invalidRect.bottom = max(invalidRect.bottom, rect_rc.bottom); + invalidRect.left = min(invalidRect.left, rect_rc.left); + invalidRect.right = max(invalidRect.right, rect_rc.right); + } + } + } + + for (map, ScreenStringInfo>::iterator it = screenXYToString.begin(); it != screenXYToString.end(); ++it) { + if (!it->second.reached) { + invalid = true; + invalidRect.top = min(invalidRect.top, it->second.rc.top); + invalidRect.bottom = max(invalidRect.bottom, it->second.rc.bottom); + invalidRect.left = min(invalidRect.left, it->second.rc.left); + invalidRect.right = max(invalidRect.right, it->second.rc.right); + } + } + + screenXYToString.clear(); + stringToScreenXY.clear(); + + if (snapshotMaxXY.second != MaxY - OffsetY) { + // We added (or removed) a row. Add result to list is typical case. + int currentMaxP = (MaxY - OffsetY); + int oldMaxP = snapshotMaxXY.second; + bool bottomVisible = ((currentMaxP < clientRC.bottom + 15) && currentMaxP > -15) || + ((oldMaxP < clientRC.bottom + 15) && oldMaxP > -15); + if (bottomVisible && !highContrast && oldMaxP != currentMaxP) { + invalid = true; + invalidRect.top = min(invalidRect.top, oldMaxP-15); + invalidRect.top = min(invalidRect.top, currentMaxP-15); + + invalidRect.bottom = max(invalidRect.bottom, oldMaxP+15); + invalidRect.bottom = max(invalidRect.bottom, currentMaxP+15); + + invalidRect.left = 0; + invalidRect.right = clientRC.right; + #ifdef DEBUGRENDER + OutputDebugString("Extend Y\n"); + #endif + } + updateScroll = true; + } + + if (snapshotMaxXY.first != MaxX) { + // This almost never happens + invalidRect = clientRC; + invalid = true; + updateScroll; + } + + if (updateScroll) { + bool hc = highContrast; + highContrast = false; + updateScrollInfo(hWndTarget, *this, clientRC.bottom, clientRC.right); // No throw + highContrast = hc; + } + if (changedStrings.empty() && !invalid) { + #ifdef DEBUGRENDER + //breakRender = true; + OutputDebugString("*** NO CHANGE\n"); + #endif + + return; + } + + for (size_t k = 0; k< changedStrings.size(); k++) { + TextInfo &ti = *shownStrings[changedStrings[k]]; + invalidRect.top = min(invalidRect.top, ti.textRect.top); + invalidRect.bottom = max(invalidRect.bottom, ti.textRect.bottom); + invalidRect.left = min(invalidRect.left, ti.textRect.left); + invalidRect.right = max(invalidRect.right, ti.textRect.right); + } + + + if (invalidRect.bottom<0 || invalidRect.right < 0 + || invalidRect.top > clientRC.bottom || invalidRect.left > clientRC.right) { + + #ifdef DEBUGRENDER + //breakRender = true; + OutputDebugString("*** EMPTY CHANGE\n"); + #endif + + return; + } + + if (hWndTarget) { + //InvalidateRect(hWndTarget, &invalidRect, true); + //UpdateWindow(hWndTarget); + HDC hDC = GetDC(hWndTarget); + IntersectClipRect(hDC, invalidRect.left, invalidRect.top, invalidRect.right, invalidRect.bottom); + //debugDrawColor = RGB((30*counterRender)%256,0,0); + draw(hDC, clientRC, invalidRect); + //debugDrawColor = 0; + + ReleaseDC(hWndTarget, hDC); + } +} + + +void gdioutput::removeString(string id) +{ + list::iterator it; + for (it=TL.begin(); it != TL.end(); ++it) { + if (it->id==id) { + HDC hDC=GetDC(hWndTarget); + //TextOut( + RECT rc; + rc.left=it->xp; + rc.top=it->yp; + + DrawText(hDC, it->text.c_str(), -1, &rc, DT_CALCRECT|DT_NOPREFIX); + SelectObject(hDC, GetStockObject(NULL_PEN)); + SelectObject(hDC, Background); + Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom); + ReleaseDC(hWndTarget, hDC); + TL.erase(it); + shownStrings.clear(); + return; + } + } +} + +bool gdioutput::selectFirstItem(const string &id) +{ + list::iterator it; + for(it=LBI.begin(); it != LBI.end(); ++it) + if (it->id==id) { + bool ret; + if (it->IsCombo) + ret = SendMessage(it->hWnd, CB_SETCURSEL, 0,0)>=0; + else + ret = SendMessage(it->hWnd, LB_SETCURSEL, 0,0)>=0; + getSelectedItem(*it); + it->original = it->text; + it->originalIdx = it->data; + } + + return false; +} + +void gdioutput::setWindowTitle(const string &title) +{ + if (title.length()>0) { + string titlea=MakeDash(title + " - MeOS"); + wstring titlew = toWide(titlea); + SetWindowTextW(hWndAppMain, titlew.c_str()); + } + else SetWindowText(hWndAppMain, "MeOS"); +} + +void gdioutput::setWaitCursor(bool wait) +{ + if (wait) + SetCursor(LoadCursor(NULL, IDC_WAIT)); + else + SetCursor(LoadCursor(NULL, IDC_ARROW)); +} + +struct FadeInfo +{ + TextInfo ti; + DWORD Start; + DWORD End; + HWND hWnd; + COLORREF StartC; + COLORREF EndC; +}; + +void TextFader(void *f) +{ + FadeInfo *fi=(FadeInfo *)f; + HDC hDC=GetDC(fi->hWnd); + + SelectObject(hDC, GetStockObject(DEFAULT_GUI_FONT)); + SetBkMode(hDC, TRANSPARENT); + + double p=0; + + double r1=GetRValue(fi->StartC); + double g1=GetGValue(fi->StartC); + double b1=GetBValue(fi->StartC); + + double r2=GetRValue(fi->EndC); + double g2=GetGValue(fi->EndC); + double b2=GetBValue(fi->EndC); + + while(p<1) + { + p=double(GetTickCount()-fi->Start)/double(fi->End-fi->Start); + + if (p>1) p=1; + + p=1-(p-1)*(p-1); + + int red=int((1-p)*r1+(p)*r2); + int green=int((1-p)*g1+(p)*g2); + int blue=int((1-p)*b1+(p)*b2); + //int green=int((p-1)*GetGValue(fi->StartC)+(p)*GetGValue(fi->EndC)); + //int blue=int((p-1)*GetBValue(fi->StartC)+(p)*GetBValue(fi->EndC)); + + SetTextColor(hDC, RGB(red, green, blue)); + TextOut(hDC, fi->ti.xp, fi->ti.yp, fi->ti.text.c_str(), fi->ti.text.length()); + Sleep(30); + //char bf[10]; + //fi->ti.text=fi->ti.text+itoa(red, bf, 16); + } + + ReleaseDC(fi->hWnd, hDC); + delete fi; +} + +void gdioutput::fadeOut(string Id, int ms) +{ + list::iterator it; + for(it=TL.begin(); it != TL.end(); ++it){ + if (it->id==Id){ + FadeInfo *fi=new FadeInfo; + fi->Start=GetTickCount(); + fi->End=fi->Start+ms; + fi->ti=*it; + fi->StartC=RGB(0, 0, 0); + fi->EndC=GetSysColor(COLOR_WINDOW); + fi->hWnd=hWndTarget; + _beginthread(TextFader, 0, fi); + TL.erase(it); + return; + } + } +} + +void gdioutput::RenderString(TextInfo &ti, HDC hDC) +{ + if (skipTextRender(ti.format)) + return; + + if (ti.hasTimer && ti.xp == 0) + return; + + HDC hThis=0; + + if (!hDC){ + assert(hWndTarget!=0); + hDC=hThis=GetDC(hWndTarget); + } + RECT rc; + rc.left=ti.xp-OffsetX; + rc.top=ti.yp-OffsetY; + rc.right = rc.left; + rc.bottom = rc.top; + + formatString(ti, hDC); + int format=ti.format&0xFF; + + if (format != 10 && (breakLines&ti.format) == 0){ + if (ti.xlimit==0){ + if (ti.format&textRight) { + DrawText(hDC, ti.text.c_str(), ti.text.length(), &rc, DT_CALCRECT|DT_NOPREFIX); + int dx = rc.right - rc.left; + ti.realWidth = dx; + rc.right-=dx; + rc.left-=dx; + ti.textRect=rc; + DrawText(hDC, ti.text.c_str(), ti.text.length(), &rc, DT_RIGHT|DT_NOCLIP|DT_NOPREFIX); + } + else if (ti.format&textCenter) { + DrawText(hDC, ti.text.c_str(), ti.text.length(), &rc, DT_CENTER|DT_CALCRECT|DT_NOPREFIX); + int dx = rc.right - rc.left; + ti.realWidth = dx; + rc.right-=dx/2; + rc.left-=dx/2; + ti.textRect=rc; + DrawText(hDC, ti.text.c_str(), ti.text.length(), &rc, DT_CENTER|DT_NOCLIP|DT_NOPREFIX); + } + else{ + DrawText(hDC, ti.text.c_str(), ti.text.length(), &rc, DT_LEFT|DT_CALCRECT|DT_NOPREFIX); + ti.textRect=rc; + ti.realWidth = rc.right - rc.left; + DrawText(hDC, ti.text.c_str(), ti.text.length(), &rc, DT_LEFT|DT_NOCLIP|DT_NOPREFIX); + } + } + else{ + DrawText(hDC, ti.text.c_str(), ti.text.length(), &rc, DT_CALCRECT|DT_NOPREFIX); + ti.realWidth = rc.right - rc.left; + if (ti.format&textRight) { + rc.right = rc.left + ti.xlimit - (rc.bottom - rc.top)/2; + DrawText(hDC, ti.text.c_str(), ti.text.length(), &rc, DT_RIGHT|DT_NOPREFIX); + } + else if (ti.format&textCenter) { + rc.right = rc.left + ti.xlimit - (rc.bottom - rc.top)/2; + DrawText(hDC, ti.text.c_str(), ti.text.length(), &rc, DT_CENTER|DT_NOPREFIX); + } + else { + rc.right=rc.left+ti.xlimit; + DrawText(hDC, ti.text.c_str(), -1, &rc, DT_LEFT|DT_NOPREFIX); + } + ti.textRect=rc; + } + } + else { + memset(&rc, 0, sizeof(rc)); + int width = scaleLength( (breakLines&ti.format) ? ti.xlimit : 450 ); + rc.right = width; + int dx = (breakLines&ti.format) ? 0 : scaleLength(20); + ti.realWidth = width + dx; + DrawText(hDC, ti.text.c_str(), ti.text.length(), &rc, DT_CALCRECT|DT_LEFT|DT_NOPREFIX|DT_WORDBREAK); + ti.textRect=rc; + ti.textRect.right+=ti.xp+dx; + ti.textRect.left+=ti.xp; + ti.textRect.top+=ti.yp; + ti.textRect.bottom+=ti.yp+dx; + + if (ti.format == 10) { + DWORD c=GetSysColor(COLOR_INFOBK); + double red=GetRValue(c); + double green=GetGValue(c); + double blue=GetBValue(c); + + double blue1=min(255., blue*0.8); + double green1=min(255., green*1.05); + double red1=min(255., red*1.05); + + TRIVERTEX vert[2]; + vert [0] .x = ti.xp-OffsetX; + vert [0] .y = ti.yp-OffsetY; + vert [0] .Red = 0xff00&DWORD(red1*256); + vert [0] .Green = 0xff00&DWORD(green1*256); + vert [0] .Blue = 0xff00&DWORD(blue1*256); + vert [0] .Alpha = 0x0000; + + vert [1] .x = ti.xp+rc.right+dx-OffsetX; + vert [1] .y = ti.yp+rc.bottom+dx-OffsetY; + vert [1] .Red = 0xff00&DWORD(red*256); + vert [1] .Green = 0xff00&DWORD(green*256); + vert [1] .Blue = 0xff00&DWORD(blue*256); + vert [1] .Alpha = 0x0000; + + GRADIENT_RECT gr[1]; + gr[0].UpperLeft=0; + gr[0].LowerRight=1; + + GradientFill(hDC,vert, 2, gr, 1,GRADIENT_FILL_RECT_H); + SelectObject(hDC, GetStockObject(NULL_BRUSH)); + SelectObject(hDC, GetStockObject(DC_PEN)); + SetDCPenColor(hDC, RGB(DWORD(red*0.5), + DWORD(green*0.5), + DWORD(blue*0.5))); + + Rectangle(hDC, vert[0].x, vert[0].y, vert[1].x, vert[1].y); + + SetDCPenColor(hDC, RGB(DWORD(min(255., red*1.1)), + DWORD(min(255., green*1.2)), + DWORD(min(255., blue)))); + POINT pt; + MoveToEx(hDC, vert[0].x-1, vert[1].y, &pt); + LineTo(hDC, vert[0].x-1, vert[0].y-1); + LineTo(hDC, vert[1].x, vert[0].y-1); + + SetDCPenColor(hDC, RGB(DWORD(min(255., red*0.4)), + DWORD(min(255., green*0.4)), + DWORD(min(255., blue*0.4)))); + + MoveToEx(hDC, vert[1].x+0, vert[0].y, &pt); + LineTo(hDC, vert[1].x+0, vert[1].y+0); + LineTo(hDC, vert[0].x, vert[1].y+0); + + } + dx/=2; + rc.top=ti.yp+dx-OffsetY; + rc.left=ti.xp+dx-OffsetX; + rc.bottom+=ti.yp+dx-OffsetY; + rc.right=ti.xp+dx+width-OffsetX; + + SetTextColor(hDC, GetSysColor(COLOR_INFOTEXT)); + DrawText(hDC, ti.text.c_str(), ti.text.length(), &rc, DT_LEFT|DT_NOPREFIX|DT_WORDBREAK); + } + + if (hThis) + ReleaseDC(hWndTarget, hDC); +} + +void gdioutput::RenderString(TextInfo &ti, const string &text, HDC hDC) +{ + if (skipTextRender(ti.format)) + return; + + RECT rc; + rc.left=ti.xp-OffsetX; + rc.top=ti.yp-OffsetY; + rc.right = rc.left; + rc.bottom = rc.top; + + int format=ti.format&0xFF; + assert(format!=10); + formatString(ti, hDC); + + if (ti.xlimit==0){ + if (ti.format&textRight) { + DrawText(hDC, text.c_str(), text.length(), &rc, DT_CALCRECT|DT_NOPREFIX); + int dx=rc.right-rc.left; + rc.right-=dx; + rc.left-=dx; + ti.textRect=rc; + DrawText(hDC, text.c_str(), text.length(), &rc, DT_RIGHT|DT_NOCLIP|DT_NOPREFIX); + } + else if (ti.format&textCenter) { + DrawText(hDC, text.c_str(), text.length(), &rc, DT_CENTER|DT_CALCRECT|DT_NOPREFIX); + int dx=rc.right-rc.left; + rc.right-=dx/2; + rc.left-=dx/2; + ti.textRect=rc; + DrawText(hDC, text.c_str(), text.length(), &rc, DT_CENTER|DT_NOCLIP|DT_NOPREFIX); + } + else{ + DrawText(hDC, text.c_str(), text.length(), &rc, DT_LEFT|DT_CALCRECT|DT_NOPREFIX); + ti.textRect=rc; + DrawText(hDC, text.c_str(), text.length(), &rc, DT_LEFT|DT_NOCLIP|DT_NOPREFIX); + } + } + else{ + if (ti.format&textRight) { + DrawText(hDC, text.c_str(), text.length(), &rc, DT_LEFT|DT_CALCRECT|DT_NOPREFIX); + rc.right = rc.left + ti.xlimit; + ti.textRect = rc; + DrawText(hDC, text.c_str(), text.length(), &rc, DT_RIGHT|DT_NOPREFIX); + } + else { + DrawText(hDC, text.c_str(), text.length(), &rc, DT_LEFT|DT_CALCRECT|DT_NOPREFIX); + rc.right=rc.left+ti.xlimit; + DrawText(hDC, text.c_str(), text.length(), &rc, DT_LEFT|DT_NOPREFIX); + ti.textRect=rc; + } + } +} + +void gdioutput::resetLast() const { + lastFormet = -1; + lastActive = false; + lastHighlight = false; + lastColor = -1; + lastFont.clear(); +} + +void gdioutput::getFontInfo(const TextInfo &ti, FontInfo &fi) const { + if (ti.font.empty()) { + fi.name = 0; + fi.bold = fi.normal = fi.italic = 0; + } + else { + fi.name = &ti.font; + getFont(ti.font).getInfo(fi); + } +} + + +void gdioutput::formatString(const TextInfo &ti, HDC hDC) const +{ + int format=ti.format&0xFF; + + if (lastFormet == format && + lastActive == ti.active && + lastHighlight == ti.highlight && + lastColor == ti.color && + ti.font == lastFont) + return; + + if (ti.font.empty()) { + getCurrentFont().selectFont(hDC, format); + lastFont.clear(); + } + else { + getFont(ti.font).selectFont(hDC, format); + lastFont = ti.font; + } + + SetBkMode(hDC, TRANSPARENT); + + if (ti.active) + SetTextColor(hDC, RGB(255,0,0)); + else if (ti.highlight) + SetTextColor(hDC, RGB(64,64,128)); + else + SetTextColor(hDC, ti.color); +} + +void gdioutput::calcStringSize(TextInfo &ti, HDC hDC_in) const +{ + HDC hDC=hDC_in; + + if (!hDC) { + assert(hWndTarget!=0); + hDC=GetDC(hWndTarget); + } + RECT rc; + rc.left=ti.xp-OffsetX; + rc.top=ti.yp-OffsetY; + rc.right = rc.left; + rc.bottom = rc.top; + + resetLast(); + formatString(ti, hDC); + int format=ti.format&0xFF; + + if (format != 10 && (breakLines&ti.format) == 0) { + if (ti.xlimit==0){ + if (ti.format&textRight) { + DrawText(hDC, ti.text.c_str(), ti.text.length(), &rc, DT_CALCRECT|DT_NOPREFIX); + int dx=rc.right-rc.left; + ti.realWidth = dx; + rc.right-=dx; + rc.left-=dx; + ti.textRect=rc; + } + else if (ti.format&textCenter) { + DrawText(hDC, ti.text.c_str(), ti.text.length(), &rc, DT_CENTER|DT_CALCRECT|DT_NOPREFIX); + int dx=rc.right-rc.left; + ti.realWidth = dx; + rc.right-=dx/2; + rc.left-=dx/2; + ti.textRect=rc; + } + else{ + DrawText(hDC, ti.text.c_str(), ti.text.length(), &rc, DT_LEFT|DT_CALCRECT|DT_NOPREFIX); + ti.realWidth = rc.right - rc.left; + ti.textRect=rc; + } + } + else { + DrawText(hDC, ti.text.c_str(), ti.text.length(), &rc, DT_LEFT|DT_CALCRECT|DT_NOPREFIX); + ti.realWidth = rc.right - rc.left; + rc.right=rc.left+ti.xlimit; + ti.textRect=rc; + } + } + else { + memset(&rc, 0, sizeof(rc)); + rc.right = scaleLength( (breakLines&ti.format) ? ti.xlimit : 450 ); + int dx = (breakLines&ti.format) ? 0 : scaleLength(20); + ti.realWidth = rc.right + dx; + DrawText(hDC, ti.text.c_str(), ti.text.length(), &rc, DT_CALCRECT|DT_LEFT|DT_NOPREFIX|DT_WORDBREAK); + ti.textRect=rc; + ti.textRect.right+=ti.xp+dx; + ti.textRect.left+=ti.xp; + ti.textRect.top+=ti.yp; + ti.textRect.bottom+=ti.yp+dx; + } + + if (!hDC_in) + ReleaseDC(hWndTarget, hDC); +} + + +void gdioutput::updateScrollbars() const +{ + RECT rc; + GetClientRect(hWndTarget, &rc); + SendMessage(hWndTarget, WM_SIZE, 0, MAKELONG(rc.right, rc.bottom)); +} + + +void gdioutput::updateObjectPositions() +{ + { + list::iterator it; + for(it=BI.begin(); it != BI.end(); ++it) + { + //MoveWindow(it->hWnd, it-> + if (!it->AbsPos) + SetWindowPos(it->hWnd, 0, it->xp-OffsetX, it->yp-OffsetY, 0,0, SWP_NOSIZE|SWP_NOZORDER|SWP_NOCOPYBITS); + } + } + { + list::iterator it; + for(it=II.begin(); it != II.end(); ++it) + SetWindowPos(it->hWnd, 0, it->xp-OffsetX, it->yp-OffsetY, 0,0, SWP_NOSIZE|SWP_NOZORDER); + } + + { + list::iterator it; + for(it=LBI.begin(); it != LBI.end(); ++it) + SetWindowPos(it->hWnd, 0, it->xp-OffsetX, it->yp-OffsetY, 0,0, SWP_NOSIZE|SWP_NOZORDER); + + } +} + +void gdioutput::addInfoBox(string id, string text, int TimeOut, GUICALLBACK cb) +{ + InfoBox Box; + + Box.id=id; + Box.callBack=cb; + Box.text=lang.tl(text); + + if (TimeOut>0) + Box.TimeOut=GetTickCount()+TimeOut; + + IBox.push_back(Box); + refresh(); +} + +void gdioutput::drawBox(HDC hDC, InfoBox &Box, RECT &pos) +{ + SelectObject(hDC, GetStockObject(DEFAULT_GUI_FONT)); + SetBkMode(hDC, TRANSPARENT); + + //Calculate size. + RECT testrect; + + memset(&testrect, 0, sizeof(RECT)); + DrawText(hDC, Box.text.c_str(), Box.text.length(), &testrect, DT_CALCRECT|DT_LEFT|DT_NOPREFIX|DT_SINGLELINE); + + if (testrect.right>250 || Box.text.find_first_of('\n')!=string::npos) + { + testrect.right=250; + DrawText(hDC, Box.text.c_str(), Box.text.length(), &testrect, DT_CALCRECT|DT_LEFT|DT_NOPREFIX|DT_WORDBREAK); + } + else if (testrect.right<80) + testrect.right=80; + + pos.left=pos.right-(testrect.right+22); + pos.top=pos.bottom-(testrect.bottom+20); + + DWORD c=GetSysColor(COLOR_INFOBK); + double red=GetRValue(c); + double green=GetGValue(c); + double blue=GetBValue(c); + + double blue1=min(255., blue*1.1); + double green1=min(255., green*1.1); + double red1=min(255., red*1.1); + + TRIVERTEX vert[2]; + vert [0] .x = pos.left; + vert [0] .y = pos.top; + vert [0] .Red = 0xff00&DWORD(red*256); + vert [0] .Green = 0xff00&DWORD(green*256); + vert [0] .Blue = 0xff00&DWORD(blue*256); + vert [0] .Alpha = 0x0000; + + vert [1] .x = pos.right; + vert [1] .y = pos.bottom; + vert [1] .Red = 0xff00&DWORD(red1*256); + vert [1] .Green = 0xff00&DWORD(green1*256); + vert [1] .Blue = 0xff00&DWORD(blue1*256); + vert [1] .Alpha = 0x0000; + + GRADIENT_RECT gr[1]; + + gr[0].UpperLeft=0; + gr[0].LowerRight=1; + + //if (MaxY>500) + GradientFill(hDC,vert, 2, gr, 1,GRADIENT_FILL_RECT_V); + + SelectObject(hDC, GetStockObject(NULL_BRUSH)); + SelectObject(hDC, GetStockObject(BLACK_PEN)); + Rectangle(hDC, pos.left, pos.top, pos.right, pos.bottom); + Box.BoundingBox=pos; + //Close Box + RECT Close; + Close.top=pos.top+3; + Close.bottom=Close.top+11; + Close.right=pos.right-3; + Close.left=Close.right-11; + + Box.Close=Close; + drawCloseBox(hDC, Close, false); + + RECT tr=pos; + + tr.left+=10; + tr.right-=10; + tr.top+=15; + tr.bottom-=5; + + drawBoxText(hDC, tr, Box, false); + + Box.TextRect=tr; + +} + +void gdioutput::drawBoxes(HDC hDC, RECT &rc) +{ + RECT pos; + pos.right=rc.right; + pos.bottom=rc.bottom; + + list::iterator it=IBox.begin(); + int maxNumBox = 10; + while(it!=IBox.end() && --maxNumBox > 0) { + drawBox(hDC, *it, pos); + pos.bottom=pos.top; + ++it; + } +} + +void gdioutput::drawCloseBox(HDC hDC, RECT &Close, bool pressed) +{ + if (!pressed) { + SelectObject(hDC, GetStockObject(WHITE_BRUSH)); + SelectObject(hDC, GetStockObject(BLACK_PEN)); + } + else { + SelectObject(hDC, GetStockObject(LTGRAY_BRUSH)); + SelectObject(hDC, GetStockObject(BLACK_PEN)); + } + //Close Box + Rectangle(hDC, Close.left, Close.top, Close.right, Close.bottom); + + MoveToEx(hDC, Close.left+2, Close.top+2, 0); + LineTo(hDC, Close.right-2, Close.bottom-2); + + MoveToEx(hDC, Close.right-2, Close.top+2, 0); + LineTo(hDC, Close.left+2, Close.bottom-2); +} + +void gdioutput::drawBoxText(HDC hDC, RECT &tr, InfoBox &Box, bool highligh) +{ + SelectObject(hDC, GetStockObject(DEFAULT_GUI_FONT)); + SetBkMode(hDC, TRANSPARENT); + + if (highligh) { + SetTextColor(hDC, 0x005050FF); + } + else { + SetTextColor(hDC, GetSysColor(COLOR_INFOTEXT)); + } + + DrawText(hDC, Box.text.c_str(), Box.text.length(), &tr, DT_LEFT|DT_NOPREFIX|DT_WORDBREAK); +} + +bool gdioutput::RemoveFirstInfoBox(const string &id) +{ + list::iterator it=IBox.begin(); + + while(it!=IBox.end()) { + if (it->id==id) { + IBox.erase(it); + return true; + } + ++it; + } + return false; +} + + +string gdioutput::getTimerText(int zeroTime, int format) +{ + TextInfo temp; + temp.zeroTime=0; + //memset(&temp, 0, sizeof(TextInfo)); + temp.format=format; + return getTimerText(&temp, 1000*zeroTime); +} + +string gdioutput::getTimerText(TextInfo *tit, DWORD T) +{ + int rt=(int(T)-int(tit->zeroTime))/1000; + int tenth = (abs(int(T)-int(tit->zeroTime))/100)%10; + string text; + + int t=abs(rt); + char bf[16]; + + if (tit->format & timeSeconds) { + if (tit->format & timeWithTenth) + sprintf_s(bf, 16, "%d.%d", t, tenth); + else + sprintf_s(bf, 16, "%d", t); + } + else if ((tit->format & timeWithTenth) && rt < 3600) { + sprintf_s(bf, 16, "%02d:%02d.%d", t/60, t%60, tenth); + } + else if (rt>=3600 || (tit->format&fullTimeHMS)) + sprintf_s(bf, 16, "%02d:%02d:%02d", t/3600, (t/60)%60, t%60); + else + sprintf_s(bf, 16, "%d:%02d", (t/60), t%60); + + if (rt>0 || ((tit->format&fullTimeHMS) && rt>=0) ) + if (tit->format&timerCanBeNegative) + text = string("+") + bf; + else + text = bf; + else if (rt<0) + if (tit->format&timerCanBeNegative) + text = string("-")+bf; + else if (tit->format&timerIgnoreSign) + text = bf; + else + text="-"; + + return text; +} + +void gdioutput::CheckInterfaceTimeouts(DWORD T) +{ + list::iterator it=IBox.begin(); + + while (it!=IBox.end()) { + if (it->TimeOut && it->TimeOutHasCapture || it->HasTCapture) + ReleaseCapture(); + + InvalidateRect(hWndTarget, &(it->BoundingBox), true); + IBox.erase(it); + it=IBox.begin(); + } + else ++it; + } + + list::iterator tit = TL.begin(); + vector timeout; + if (hasAnyTimer) { + bool anyChange = false; + while(tit!=TL.end()){ + if (tit->hasTimer){ + string text = tit->xp > 0 ? getTimerText(&*tit, T) : ""; + if (tit->timeOut && T>DWORD(tit->timeOut)){ + tit->timeOut=0; + if (tit->callBack || tit->hasEventHandler()) + timeout.push_back(*tit); + } + if (text != tit->text) { + RECT rc=tit->textRect; + tit->text=text; + calcStringSize(*tit); + + rc.right=max(tit->textRect.right, rc.right); + rc.bottom=max(tit->textRect.bottom, rc.bottom); + + anyChange = true; + //InvalidateRecthWndTarget, &rc, true); + } + } + ++tit; + } + + if (anyChange) { + int w, h; + getTargetDimension(w, h); + HDC hDC = GetDC(hWndTarget); + HBITMAP btm = CreateCompatibleBitmap(hDC, w, h); + HDC memDC = CreateCompatibleDC (hDC); + HGDIOBJ hOld = SelectObject(memDC, btm); + RECT rc; + rc.top = 0; + rc.left = 0; + rc.bottom = h; + rc.right = w; + RECT area = rc; + drawBackground(memDC, rc); + draw(memDC, rc, area); + BitBlt(hDC, 0, 0, w, h, memDC, 0,0, SRCCOPY); + SelectObject(memDC, hOld); + DeleteObject(btm); + DeleteDC(memDC); + ReleaseDC(hWndTarget, hDC); + } + } + + for (size_t k = 0; k < timeout.size(); k++) { + if (!timeout[k].handleEvent(*this, GUI_TIMEOUT)) + timeout[k].callBack(this, GUI_TIMEOUT, &timeout[k]); + } +} + +bool gdioutput::removeControl(const string &id) +{ + list::iterator it=BI.begin(); + + while (it!=BI.end()) { + if (it->id==id) { + DestroyWindow(it->hWnd); + biByHwnd.erase(it->hWnd); + BI.erase(it); + return true; + } + ++it; + } + + list::iterator lit=LBI.begin(); + + while (lit!=LBI.end()) { + if (lit->id==id) { + DestroyWindow(lit->hWnd); + lbiByHwnd.erase(lit->hWnd); + if (lit->writeLock) + hasCleared = true; + LBI.erase(lit); + return true; + } + ++lit; + } + + list::iterator iit=II.begin(); + + while (iit!=II.end()) { + if (iit->id==id) { + DestroyWindow(iit->hWnd); + iiByHwnd.erase(iit->hWnd); + II.erase(iit); + return true; + } + ++iit; + } + return false; +} + +bool gdioutput::hideControl(const string &id) +{ + list::iterator it=BI.begin(); + + while (it!=BI.end()) { + if (it->id==id) { + ShowWindow(it->hWnd, SW_HIDE); + return true; + } + ++it; + } + + list::iterator lit=LBI.begin(); + + while (lit!=LBI.end()) { + if (lit->id==id) { + ShowWindow(lit->hWnd, SW_HIDE); + return true; + } + ++lit; + } + + list::iterator iit=II.begin(); + + while (iit!=II.end()) { + if (iit->id==id) { + ShowWindow(iit->hWnd, SW_HIDE); + return true; + } + ++iit; + } + return false; +} + + +void gdioutput::setRestorePoint() +{ + setRestorePoint(""); +} + + +void gdioutput::setRestorePoint(const string &id) +{ + RestoreInfo ri; + + ri.id = id; + + ri.nLBI = LBI.size(); + ri.nBI = BI.size(); + ri.nII = II.size(); + ri.nTL = TL.size(); + ri.nRect = Rectangles.size(); + ri.nTooltip = toolTips.size(); + ri.nTables = Tables.size(); + ri.nHWND = FocusList.size(); + ri.nData = DataInfo.size(); + + ri.sCX=CurrentX; + ri.sCY=CurrentY; + ri.sMX=MaxX; + ri.sMY=MaxY; + ri.sOX=OffsetX; + ri.sOY=OffsetY; + + ri.onClear = onClear; + ri.postClear = postClear; + restorePoints[id]=ri; +} + +void gdioutput::restoreInternal(const RestoreInfo &ri) +{ + int toolRemove=toolTips.size()-ri.nTooltip; + while (toolRemove>0 && toolTips.size()>0) { + ToolInfo &info=toolTips.back(); + if (hWndToolTip) { + SendMessage(hWndToolTip, TTM_DELTOOL, 0, (LPARAM) &info.ti); + } + toolTips.pop_back(); + toolRemove--; + } + + int lbiRemove=LBI.size()-ri.nLBI; + while (lbiRemove>0 && LBI.size()>0) { + ListBoxInfo &lbi=LBI.back(); + lbi.callBack = 0; // Avoid kill focus event here + lbi.setHandler(0); + + DestroyWindow(lbi.hWnd); + if (lbi.writeLock) + hasCleared = true; + lbiByHwnd.erase(lbi.hWnd); + LBI.pop_back(); + lbiRemove--; + } + int tlRemove=TL.size()-ri.nTL; + + while (tlRemove>0 && TL.size()>0) { + TL.pop_back(); + tlRemove--; + } + itTL=TL.begin(); + // Clear cache of shown strings + shownStrings.clear(); + + int biRemove=BI.size()-ri.nBI; + while (biRemove>0 && BI.size()>0) { + ButtonInfo &bi=BI.back(); + + DestroyWindow(bi.hWnd); + biByHwnd.erase(bi.hWnd); + BI.pop_back(); + biRemove--; + } + + int iiRemove=II.size()-ri.nII; + + while (iiRemove>0 && II.size()>0) { + InputInfo &ii=II.back(); + ii.callBack = 0; // Avoid kill focus event here + ii.setHandler(0); + DestroyWindow(ii.hWnd); + iiByHwnd.erase(ii.hWnd); + II.pop_back(); + iiRemove--; + } + + int rectRemove=Rectangles.size()-ri.nRect; + + while (rectRemove>0 && Rectangles.size()>0) { + Rectangles.pop_back(); + rectRemove--; + } + + int hwndRemove=FocusList.size()-ri.nHWND; + while(hwndRemove>0 && FocusList.size()>0) { + FocusList.pop_back(); + hwndRemove--; + } + + while(Tables.size() > unsigned(ri.nTables)){ + Table *t=Tables.back().table; + Tables.back().table=0; + Tables.pop_back(); + t->hide(*this); + t->releaseOwnership(); + } + + int dataRemove=DataInfo.size()-ri.nData; + while(dataRemove>0 && DataInfo.size()>0) { + DataInfo.pop_front(); + dataRemove--; + } + + CurrentX=ri.sCX; + CurrentY=ri.sCY; + onClear = ri.onClear; + postClear = ri.postClear; +} + +void gdioutput::restore(const string &id, bool DoRefresh) +{ + if (restorePoints.count(id)==0) + return; + + const RestoreInfo &ri=restorePoints[id]; + + restoreInternal(ri); + + MaxX=ri.sMX; + MaxY=ri.sMY; + + if (DoRefresh) + refresh(); + + setOffset(ri.sOY, ri.sOY, false); +} + +void gdioutput::restoreNoUpdate(const string &id) +{ + if (restorePoints.count(id)==0) + return; + + const RestoreInfo &ri=restorePoints[id]; + + MaxX=ri.sMX; + MaxY=ri.sMY; + + restoreInternal(ri); +} + +void gdioutput::setPostClearCb(GUICALLBACK cb) +{ + postClear=cb; +} + + +void gdioutput::setOnClearCb(GUICALLBACK cb) +{ + onClear=cb; +} + +bool gdioutput::canClear() +{ + if (!onClear) + return true; + + try { + return onClear(this, GUI_CLEAR, 0)!=0; + } + catch(const std::exception &ex) { + if (isTestMode) + throw ex; + string msg(ex.what()); + alert(msg); + return true; + } +} + +int gdioutput::sendCtrlMessage(const string &id) +{ + for (list::iterator it=BI.begin(); it != BI.end(); ++it) { + if (id==it->id) { + if (it->handler) + return it->handleEvent(*this, GUI_BUTTON); + else if (it->callBack) + return it->callBack(this, GUI_BUTTON, &*it); //it may be destroyed here... + } + } + for(list::iterator it=Events.begin(); it != Events.end(); ++it){ + if (id==it->id) { + if (it->hasEventHandler()) + return it->handleEvent(*this, GUI_EVENT); + else if (it->callBack) + return it->callBack(this, GUI_EVENT, &*it); //it may be destroyed here... + } + } +#ifdef _DEBUG + throw meosException("Unknown command " +id); +#endif + return 0; +} + +void gdioutput::unregisterEvent(const string &id) +{ + list::iterator it; + for (it = Events.begin(); it != Events.end(); ++it) { + if ( id == it->id) { + Events.erase(it); + return; + } + } +} + +EventInfo &gdioutput::registerEvent(const string &id, GUICALLBACK cb) +{ + list::iterator it; + for (it = Events.begin(); it != Events.end(); ++it) { + if ( id == it->id) { + Events.erase(it); + break; + } + } + + EventInfo ei; + ei.id=id; + ei.callBack=cb; + + Events.push_front(ei); + return Events.front(); +} + +void flushEvent(const string &id, const string &origin, DWORD data, int extraData); + +DWORD gdioutput::makeEvent(const string &id, const string &origin, + DWORD data, int extraData, bool doflush) +{ + if (doflush) { +#ifndef MEOSDB + ::flushEvent(id, origin, data, extraData); +#else + throw std::exception("internal gdi/database error"); +#endif + } + else { + list::iterator it; + + for(it=Events.begin(); it != Events.end(); ++it){ + if (id==it->id && (it->callBack || it->hasEventHandler()) ) { + it->setData(origin, data); + if (extraData) { + it->setExtra(extraData); + } + if (it->handleEvent(*this, GUI_EVENT)) { + return 1; + } + else + return it->callBack(this, GUI_EVENT, &*it); //it may be destroyed here... + } + } + } + return -1; +} + + +RectangleInfo &RectangleInfo::changeDimension(gdioutput &gdi, int dx, int dy) { + rc.right += dx; + rc.bottom += dy; + int ex = gdi.scaleLength(5); + gdi.updatePos(rc.left, rc.top, rc.right-rc.left+ex, rc.bottom-rc.top+ex); + return *this; +} + +RectangleInfo &gdioutput::addRectangle(RECT &rc, GDICOLOR color, bool drawBorder, bool addFirst) { + RectangleInfo ri; + + ri.rc = rc; + if (color==colorDefault) + ri.color = GetSysColor(COLOR_INFOBK); + else if (color == colorWindowBar) { + ri.color = GetSysColor(COLOR_3DFACE); + } + else ri.color = color; + + ri.color2 = ri.color; + ri.drawBorder = drawBorder; + + if (hWndTarget && !manualUpdate) { + HDC hDC=GetDC(hWndTarget); + renderRectangle(hDC, 0, ri); + ReleaseDC(hWndTarget, hDC); + } + + int ex = scaleLength(5); + updatePos(rc.left, rc.top, rc.right-rc.left+ex, rc.bottom-rc.top+ex); + if (addFirst) { + Rectangles.push_front(ri); + return Rectangles.front(); + } + else { + Rectangles.push_back(ri); + return Rectangles.back(); + } +} + +RectangleInfo &gdioutput::getRectangle(const char *id) { + for (list::iterator it = Rectangles.begin(); it != Rectangles.end(); ++it) { + return *it; + } + string err = string("Internal Error, identifier not found: X#") + id; + throw std::exception(err.c_str()); +} + +void gdioutput::setOffset(int x, int y, bool update) +{ + int h,w; + getTargetDimension(w, h); + + int cdy = 0; + int cdx = 0; + + if (y!=OffsetY) { + int oldY = OffsetY; + OffsetY = y; + if (OffsetY < 0) + OffsetY = 0; + else if (OffsetY > MaxY) + OffsetY = MaxY; + //cdy=(oldY!=OffsetY); + cdy = oldY - OffsetY; + } + + if (x!=OffsetX) { + int oldX = OffsetX; + OffsetX = x; + if (OffsetX < 0) + OffsetX = 0; + else if (OffsetX > MaxX) + OffsetX = MaxX; + + //cdx=(oldX!=OffsetX); + cdx = oldX - OffsetX; + } + + if (cdx || cdy) { + updateScrollbars(); + updateObjectPositions(); + if (cdy) { + SCROLLINFO si; + memset(&si, 0, sizeof(si)); + + si.nPos=OffsetY; + si.fMask=SIF_POS; + SetScrollInfo(hWndTarget, SB_VERT, &si, true); + } + + if (cdx) { + SCROLLINFO si; + memset(&si, 0, sizeof(si)); + + si.nPos=OffsetX; + si.fMask=SIF_POS; + SetScrollInfo(hWndTarget, SB_HORZ, &si, true); + } + + if (update) { + //RECT ScrollArea, ClipArea; + //GetClientRect(hWndTarget, &ScrollArea); + //ClipArea = ScrollArea; + + /* ScrollArea.top=-gdi->getHeight()-100; + ScrollArea.bottom+=gdi->getHeight(); + ScrollArea.right=gdi->getWidth()-gdi->GetOffsetX()+15; + ScrollArea.left = -2000; + */ + ScrollWindowEx(hWndTarget, -cdx, cdy, + NULL, NULL, + (HRGN) NULL, (LPRECT) NULL, 0/*SW_INVALIDATE|SW_SMOOTHSCROLL|(1000*65536 )*/); + UpdateWindow(hWndTarget); + + } + } +} + +void gdioutput::scrollTo(int x, int y) +{ + int cx=x-OffsetX; + int cy=y-OffsetY; + + int h,w; + getTargetDimension(w, h); + + bool cdy=false; + bool cdx=false; + + if (cy<=(h/15) || cy>=(h-h/10)) { + int oldY=OffsetY; + OffsetY=y-h/2; + if (OffsetY<0) + OffsetY=0; + else if (OffsetY>MaxY) + OffsetY=MaxY; + + cdy=(oldY!=OffsetY); + } + + if (cx<=(w/15) || cx>=(w-w/8)) { + int oldX=OffsetX; + OffsetX=x-w/2; + if (OffsetX<0) + OffsetX=0; + else if (OffsetX>MaxX) + OffsetX=MaxX; + + cdx=(oldX!=OffsetX); + } + + if (cdx || cdy) { + updateScrollbars(); + updateObjectPositions(); + if (cdy) { + SCROLLINFO si; + memset(&si, 0, sizeof(si)); + + si.nPos=OffsetY; + si.fMask=SIF_POS; + SetScrollInfo(hWndTarget, SB_VERT, &si, true); + } + + if (cdx) { + SCROLLINFO si; + memset(&si, 0, sizeof(si)); + + si.nPos=OffsetX; + si.fMask=SIF_POS; + SetScrollInfo(hWndTarget, SB_HORZ, &si, true); + } + } +} + +void gdioutput::scrollToBottom() +{ + OffsetY=MaxY; + SCROLLINFO si; + memset(&si, 0, sizeof(si)); + + updateScrollbars(); + updateObjectPositions(); + si.nPos=OffsetY; + si.fMask=SIF_POS; + SetScrollInfo(hWndTarget, SB_VERT, &si, true); +} + +bool gdioutput::clipOffset(int PageX, int PageY, int &MaxOffsetX, int &MaxOffsetY) +{ + if (highContrast) + setHighContrastMaxWidth(); + + int oy=OffsetY; + int ox=OffsetX; + + MaxOffsetY=max(GetPageY()-PageY, 0); + MaxOffsetX=max(GetPageX()-PageX, 0); + + if (OffsetY<0) OffsetY=0; + else if (OffsetY>MaxOffsetY) + OffsetY=MaxOffsetY; + + if (OffsetX<0) OffsetX=0; + else if (OffsetX>MaxOffsetX) + OffsetX=MaxOffsetX; + + if (ox!=OffsetX || oy!=OffsetY){ + updateObjectPositions(); + return true; + + } + return false; +} + +//bool ::GetSaveFile(string &file, char *filter) +string gdioutput::browseForSave(const vector< pair > &filter, + const string &defext, int &filterIndex) +{ + if (isTestMode) { + if (!cmdAnswers.empty()) { + string ans = cmdAnswers.front(); + cmdAnswers.pop_front(); + if (ans.substr(0, 1) == "*") + return ans.substr(1); + } + throw meosException("Browse for file"); + } + + InitCommonControls(); + + char FileName[260]; + FileName[0]=0; + char sbuff[256]; + memset(sbuff,0, 256); + OPENFILENAME of; + string sFilter; + for (size_t k = 0; k< filter.size(); k++) + sFilter += (lang.tl(filter[k].first) + "¤" + filter[k].second + "¤"); + + sprintf_s(sbuff, 256, "%s", sFilter.c_str()); + + int sl=strlen(sbuff); + for(int m=0;m > &filter, + const string &defext) +{ + if (isTestMode) { + if (!cmdAnswers.empty()) { + string ans = cmdAnswers.front(); + cmdAnswers.pop_front(); + if (ans.substr(0, 1) == "*") + return ans.substr(1); + } + throw meosException("Browse for file"); + } + + InitCommonControls(); + + char FileName[260]; + FileName[0]=0; + char sbuff[256]; + memset(sbuff,0, 256); + OPENFILENAME of; + + string sFilter; + for (size_t k = 0; k< filter.size(); k++) + sFilter += (lang.tl(filter[k].first) + "¤" + filter[k].second + "¤"); + + sprintf_s(sbuff, 256, "%s", sFilter.c_str()); + + int sl=strlen(sbuff); + for(int m=0;mFree(pidl_new); + + // Free our task allocator + pMalloc->Release(); + + return InstPath; +} + + +bool gdioutput::openDoc(const char *doc) +{ + return (int)ShellExecute(hWndTarget, "open", doc, NULL, "", SW_SHOWNORMAL ) >32; +} + +void gdioutput::init(HWND hWnd, HWND hMain, HWND hTab) +{ + setWindow(hWnd); + hWndAppMain=hMain; + hWndTab=hTab; + + InitCommonControls(); + + hWndToolTip = CreateWindow(TOOLTIPS_CLASS, (LPSTR) NULL, TTS_ALWAYSTIP, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + NULL, (HMENU) NULL, (HINSTANCE)GetWindowLong(hWndTarget, GWL_HINSTANCE), NULL); +} + +ToolInfo &gdioutput::addToolTip(const string &tipId, const string &tip, HWND hWnd, RECT *rc) { + static ToolInfo dummy; + if (!hWndToolTip) + return dummy; + + toolTips.push_back(ToolInfo()); + ToolInfo &info = toolTips.back(); + TOOLINFOW &ti = info.ti; + info.tip = toWide(lang.tl(tip)); + + memset(&ti, 0, sizeof(ti)); + ti.cbSize = sizeof(TOOLINFO); + + if (hWnd != 0) { + ti.uFlags = TTF_IDISHWND; + info.id = int(hWnd); + ti.uId = (UINT) hWnd; + } + else { + ti.uFlags = TTF_SUBCLASS; + info.id = toolTips.size(); + ti.uId = info.id; + } + + ti.hwnd = hWndTarget; + ti.hinst = (HINSTANCE)GetWindowLong(hWndTarget, GWL_HINSTANCE); + info.name = tipId; + ti.lpszText = (LPWSTR)toolTips.back().tip.c_str(); + + if (rc != 0) + ti.rect = *rc; + + SendMessage(hWndToolTip, TTM_ADDTOOLW, 0, (LPARAM) &ti); + + if (tip.find('\n') != string::npos || tip.length()>40) + SendMessage(hWndToolTip, TTM_SETMAXTIPWIDTH, 0, 250); + + return info; +} + +ToolInfo *gdioutput::getToolTip(const string &id) { + for (ToolList::reverse_iterator it = toolTips.rbegin(); it != toolTips.rend(); ++it) { + if (it->name == id) + return &*it; + } + return 0; +} + +ToolInfo &gdioutput::updateToolTip(const string &id, const string &tip) { + for (ToolList::reverse_iterator it = toolTips.rbegin(); it != toolTips.rend(); ++it) { + if (it->name == id && hWndToolTip) { + it->tip = toWide(lang.tl(tip)); + SendMessage(hWndToolTip, TTM_UPDATETIPTEXTW, 0, (LPARAM) &it->ti); + return *it; + } + } + BaseInfo &bi = getBaseInfo(id.c_str()); + return addToolTip(id, tip, bi.getControlWindow()); +} + +void gdioutput::selectTab(int Id) +{ + if (hWndTab) + TabCtrl_SetCurSel(hWndTab, Id); +} + +void gdioutput::getTargetDimension(int &x, int &y) const +{ + if (hWndTarget){ + RECT rc; + GetClientRect(hWndTarget, &rc); + x=rc.right; + y=rc.bottom; + } + else { + x=0; + y=0; + } +} + +Table &gdioutput::getTable() const { + if (Tables.empty()) + throw std::exception("No table defined"); + + return *const_cast(Tables.back().table); +} + +static int gdiTableCB(gdioutput *gdi, int type, void *data) +{ + if (type == GUI_BUTTON) { + ButtonInfo bi = *static_cast(data); + //gdi->tableCB(bi, static_cast
(bi.getExtra())); + gdi->tableCB(bi, &gdi->getTable()); + } + return 0; +} + +void gdioutput::tableCB(ButtonInfo &bu, Table *t) +{ + #ifndef MEOSDB + + if (bu.id=="tblPrint") { + t->keyCommand(*this, KC_PRINT); + } + else if (bu.id=="tblColumns") { + disableTables(); + if (Tables.empty()) + return; + + restore("tblRestore"); + int ybase = Tables.back().yp; + addString("", ybase, 20, boldLarge, "Välj kolumner"); + ybase += scaleLength(30); + addString("", ybase, 20, 0, "Välj kolumner för tabellen X.#"+ t->getTableName()); + ybase += getLineHeight()*2; + + addListBox(20, ybase, "tblColSel", 180, 450, 0, "", "", true); + const int btnHeight = getButtonHeight()+scaleLength(5); + vector cols = t->getColumns(); + set sel; + + for (size_t k=0; kgetTableId()); + + addButton(xp, ybase+btnHeight*4, "tblOK", "OK", gdiTableCB).setExtra(t->getTableId()); + addButton(xp, ybase+btnHeight*5, "tblCancel", "Avbryt", gdiTableCB); + + if (toolbar) + toolbar->hide(); + + refresh(); + } + else if (bu.id=="tblAll") { + set sel; + sel.insert(-1); + setSelection("tblColSel", sel); + } + else if (bu.id=="tblNone") { + set sel; + setSelection("tblColSel", sel); + } + else if (bu.id=="tblAuto") { + restore("tblRestore", false); + t->autoSelectColumns(); + t->autoAdjust(*this); + enableTables(); + refresh(); + } + else if (bu.id=="tblOK") { + set sel; + getSelection("tblColSel", sel); + restore("tblRestore", false); + t->clearCellSelection(this); + t->selectColumns(sel); + t->autoAdjust(*this); + enableTables(); + refresh(); + } + else if (bu.id=="tblReset") { + t->clearCellSelection(this); + t->resetColumns(); + t->autoAdjust(*this); + t->updateDimension(*this); + refresh(); + } + else if (bu.id=="tblUpdate") { + t->keyCommand(*this, KC_REFRESH); + } + else if (bu.id=="tblCancel") { + restore("tblRestore", true); + enableTables(); + refresh(); + } + else if (bu.id == "tblCopy") { + t->keyCommand(*this, KC_COPY); + } + else if (bu.id == "tblPaste") { + t->keyCommand(*this, KC_PASTE); + } + else if (bu.id == "tblRemove") { + t->keyCommand(*this, KC_DELETE); + } + else if (bu.id == "tblInsert") { + t->keyCommand(*this, KC_INSERT); + } + + #endif +} + +void gdioutput::enableTables() +{ + useTables=true; +#ifndef MEOSDB + if (!Tables.empty()) { + Table *t = Tables.front().table; + if (toolbar == 0) + toolbar = new Toolbar(*this); +/* RECT rc; + rc.top = 10; + rc.bottom = 100; + rc.left = 100; + rc.right = 200; + addToolTip("Hej hopp!", 0, &rc); +*/ + toolbar->setData(t); + + string tname = string("table") + itos(t->canDelete()) + itos(t->canInsert()) + itos(t->canPaste()); + if (!toolbar->isLoaded(tname)) { + toolbar->reset(); + toolbar->addButton("tblColumns", 1, 2, "Välj vilka kolumner du vill visa"); + toolbar->addButton("tblPrint", 0, STD_PRINT, "Skriv ut tabellen (X)#Ctrl+P"); + toolbar->addButton("tblUpdate", 1, 0, "Uppdatera alla värden i tabellen (X)#F5"); + toolbar->addButton("tblReset", 1, 4, "Återställ tabeldesignen och visa allt"); + toolbar->addButton("tblCopy", 0, STD_COPY, "Kopiera selektionen till urklipp (X)#Ctrl+C"); + if (t->canPaste()) + toolbar->addButton("tblPaste", 0, STD_PASTE, "Klistra in data från urklipp (X)#Ctrl+V"); + if (t->canDelete()) + toolbar->addButton("tblRemove", 1, 1, "Ta bort valda rader från tabellen (X)#Del"); + if (t->canInsert()) + toolbar->addButton("tblInsert", 1, 3, "Lägg till en ny rad i tabellen (X)#Ctrl+I"); + toolbar->createToolbar(tname, "Tabellverktyg"); + } + else { + toolbar->show(); + } + } +#endif +} + +void gdioutput::processToolbarMessage(const string &id, void *data) { + if (hasCommandLock()) + return; + string msg; + string cmd; + if (getRecorder().recording()) { + Table *tbl = (Table *)data; + cmd = "tableCmd(\"" + id + "\"); //" + tbl->getTableName(); + } + try { + ButtonInfo bi; + bi.id = id; + tableCB(bi, (Table *)data); + getRecorder().record(cmd); + } + catch(std::exception &ex) { + msg = ex.what(); + if (msg.empty()) + msg="Ett okänt fel inträffade."; + } + catch(...) { + msg = "Ett okänt fel inträffade."; + } + + if (!msg.empty()) + alert(msg); +} + +#ifndef MEOSDB + +HWND gdioutput::getToolbarWindow() const { + if (!toolbar) + return 0; + return toolbar->getFloater(); +} + +bool gdioutput::hasToolbar() const { + if (!toolbar) + return false; + return toolbar->isVisible(); +} + +void gdioutput::activateToolbar(bool active) { + if (!toolbar) + return; + toolbar->activate(active); +} +#else + HWND gdioutput::getToolbarWindow() const { + return 0; + } + + bool gdioutput::hasToolbar() const { + return false; + } +#endif + + + +void gdioutput::disableTables() +{ + useTables=false; + + for(list::iterator bit=BI.begin(); bit != BI.end();) { + if (bit->id.substr(0, 3)=="tbl" && bit->getExtra()!=0) { + string id = bit->id; + ++bit; + removeControl(id); + } + else + ++bit; + } + +} + +void gdioutput::addTable(Table *t, int x, int y) +{ + TableInfo ti; + ti.table = t; + ti.xp = x; + ti.yp = y; + t->setPosition(x,y, MaxX, MaxY); + + if (t->hasAutoSelect()) + t->autoSelectColumns(); + t->autoAdjust(*this); + + ti.table->addOwnership(); + Tables.push_back(ti); + + //updatePos(x, y, dx + TableXMargin, dy + TableYMargin); + setRestorePoint("tblRestore"); + + enableTables(); + updateScrollbars(); +} + +void gdioutput::pasteText(const char *id) +{ + list::iterator it; + for (it=II.begin(); it != II.end(); ++it) { + if (it->id==id) { + SendMessage(it->hWnd, WM_PASTE, 0,0); + return; + } + } +} + +char *gdioutput::getExtra(const char *id) const { + return getBaseInfo(id).getExtra(); +} + +int gdioutput::getExtraInt(const char *id) const { + return getBaseInfo(id).getExtraInt(); +} + +bool gdioutput::hasEditControl() const +{ + return !II.empty() || (Tables.size()>0 && Tables.front().table->hasEditControl()); +} + +void gdioutput::enableEditControls(bool enable) +{ + set TCheckControls; + for (list::iterator it=BI.begin(); it != BI.end(); ++it) { + if (it->isEditControl) { + EnableWindow(it->hWnd, enable); + if (it->isCheckbox) { + TCheckControls.insert("T" + it->id); + } + } + } + + for (list::iterator it=TL.begin(); it != TL.end(); ++it) { + if (TCheckControls.count(it->id)) { + enableCheckBoxLink(*it, enable); + } + } + + + for (list::iterator it=II.begin(); it != II.end(); ++it) { + if (it->isEditControl) + EnableWindow(it->hWnd, enable); + } + + for( list::iterator it=LBI.begin(); it != LBI.end(); ++it) { + if (it->isEditControl) + EnableWindow(it->hWnd, enable); + } +} + +void gdioutput::closeWindow() +{ + PostMessage(hWndTarget, WM_CLOSE, 0, 0); +} + +InputInfo &InputInfo::setPassword(bool pwd) { + LONG style = GetWindowLong(hWnd, GWL_STYLE); + if (pwd) + style |= ES_PASSWORD; + else + style &= ~ES_PASSWORD; + SetWindowLong(hWnd, GWL_STYLE, style); + SendMessage(hWnd, EM_SETPASSWORDCHAR, 183, 0); + return *this; +} + +int gdioutput::setHighContrastMaxWidth() { + + RECT rc; + GetClientRect(hWndTarget, &rc); + + if (lockRefresh) + return rc.bottom; + +#ifdef DEBUGRENDER + OutputDebugString("Set high contrast\n"); +#endif + + double w = GetPageX(); + double s = rc.right / w; + if (!highContrast || (fabs(s-1.0) > 1e-3 && (s * scale) >= 1.0) ) { + lockRefresh = true; + try { + highContrast = true; + scaleSize(s); + refresh(); + lockRefresh = false; + } + catch (...) { + lockRefresh = false; + throw; + } + } + return rc.bottom; +} + +double static acc = 0; + +void gdioutput::setAutoScroll(double speed) { + if (autoSpeed == 0 && speed != 0) { + SetTimer(hWndTarget, 1001, 20, 0); + autoPos = OffsetY; + } + else if (speed == 0 && autoSpeed != 0) { + KillTimer(hWndTarget, 1001); + } + + if (speed == -1) + autoSpeed = -autoSpeed; + else + autoSpeed = speed; + + autoCounter = - M_PI_2; + acc = 0; +} + +void gdioutput::getAutoScroll(double &speed, double &pos) const { + RECT rc; + GetClientRect(hWndTarget, &rc); + double height = rc.bottom; + + double s = autoSpeed * (1 + height/1000 + sin(autoCounter)/max(1.0, 500/height)); + + autoCounter += M_PI/75.0; + if (autoCounter > M_PI) + autoCounter -= 2*M_PI; + + acc += 0.3/30; + if (acc>0.8) + acc = 0.8; + + speed = (lastSpeed * (1.0-acc) + s * acc); + lastSpeed = speed; + pos = autoPos; +} + +void gdioutput::storeAutoPos(double pos) { + autoPos = pos; +} + +void gdioutput::setFullScreen(bool useFullScreen) { + SetWindowLong(hWndTarget, GWL_STYLE, WS_POPUP|WS_BORDER); + ShowWindow(hWndTarget, SW_MAXIMIZE); + UpdateWindow(hWndTarget); + fullScreen = true; +} + +bool gdioutput::hasCommandLock() const { + if (commandLock) + return true; + + if (commandUnlockTime > 0) { + DWORD t = GetTickCount(); + if (commandUnlockTime < (commandUnlockTime + 500) && + t < (commandUnlockTime+500)) { + commandUnlockTime = 0; + return true; + } + } + + return false; +} + +void gdioutput::setCommandLock() const { + commandLock = true; +} + +void gdioutput::liftCommandLock() const { + commandUnlockTime = GetTickCount(); + commandLock = false; +} + +int gdioutput::getLineHeight(gdiFonts font, const char *face) const { + TextInfo ti; + ti.xp = 0; + ti.yp = 0; + ti.format = font; + ti.text = "&abc_M|!I"; + if (face) + ti.font = face; + calcStringSize(ti); + return (11*(ti.textRect.bottom - ti.textRect.top))/10; +} + +GDIImplFontSet::GDIImplFontSet() : charSet(-1) { + Huge = 0; + Large = 0; + Medium = 0; + Small = 0; + pfLarge = 0; + pfMedium = 0; + pfMediumPlus = 0; + pfSmall = 0; + pfSmallItalic = 0; + pfItalic = 0; + pfItalicMediumPlus = 0; + pfMono = 0; +} + +GDIImplFontSet::~GDIImplFontSet() { + deleteFonts(); +} + +void GDIImplFontSet::deleteFonts() +{ + if (Huge) + DeleteObject(Huge); + Huge = 0; + + if (Large) + DeleteObject(Large); + Large = 0; + + if (Medium) + DeleteObject(Medium); + Medium = 0; + + if (Small) + DeleteObject(Small); + Small = 0; + + if (pfLarge) + DeleteObject(pfLarge); + pfLarge = 0; + + if (pfMedium) + DeleteObject(pfMedium); + pfMedium = 0; + + if (pfMediumPlus) + DeleteObject(pfMediumPlus); + pfMediumPlus = 0; + + if (pfSmall) + DeleteObject(pfSmall); + pfSmall = 0; + + if (pfMono) + DeleteObject(pfMono); + pfMono = 0; + + + if (pfSmallItalic) + DeleteObject(pfSmallItalic); + pfSmallItalic = 0; + + if (pfItalicMediumPlus) + DeleteObject(pfItalicMediumPlus); + pfItalicMediumPlus = 0; + + if (pfItalic) + DeleteObject(pfItalic); + pfItalic = 0; +} + +float GDIImplFontSet::baseSize(int format, float scale) { + format &= 0xFF; + if (format==0 || format==10) { + return 14 * scale; + } + else if (format==fontMedium){ + return 14 * scale; + } + else if (format==1) { + return 14.0001f * scale; //Bold + } + else if (format==boldLarge){ + return 24.0001f * scale; + } + else if (format==boldHuge){ + return 34.0001f * scale; + } + else if (format==boldSmall){ + return 11.0001f * scale; + } + else if (format==fontLarge){ + return 24 * scale; + } + else if (format==fontMediumPlus){ + return 18 * scale; + } + else if (format==fontSmall){ + return 11 * scale; + } + else if (format==italicSmall){ + return 11 * scale; + } + else if (format==italicText){ + return 14 * scale; + } + else if (format == monoText){ + return 14 * scale; + } + else if (format==italicMediumPlus){ + return 18 * scale; + } + else { + return 10 * scale; + } +} + +int gdioutput::getCharSet() const { + if (fontEncoding == Russian) + return RUSSIAN_CHARSET; + else if (fontEncoding == EastEurope) + return EASTEUROPE_CHARSET; + else + return ANSI_CHARSET; +} + +void GDIImplFontSet::init(double scale, int charSet_, const string &font, const string &gdiName_) +{ + charSet = charSet_; + deleteFonts(); + gdiName = gdiName_; + + Huge=CreateFont(int(scale*34), 0, 0, 0, FW_BOLD, false, false, false, charSet, + OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH|FF_ROMAN, font.c_str()); + + Large=CreateFont(int(scale*24), 0, 0, 0, FW_BOLD, false, false, false, charSet, + OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH|FF_ROMAN, font.c_str()); + + Medium=CreateFont(int(scale*14), 0, 0, 0, FW_BOLD, false, false, false, charSet, + OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH|FF_ROMAN, font.c_str()); + + Small=CreateFont(int(scale*11), 0, 0, 0, FW_BOLD, false, false, false, charSet, + OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH|FF_ROMAN, font.c_str()); + + pfLarge=CreateFont(int(scale*24), 0, 0, 0, FW_NORMAL, false, false, false, charSet, + OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH|FF_ROMAN, font.c_str()); + + pfMedium=CreateFont(int(scale*14), 0, 0, 0, FW_NORMAL, false, false, false, charSet, + OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH|FF_ROMAN, font.c_str()); + + pfMediumPlus=CreateFont(int(scale*18), 0, 0, 0, FW_NORMAL, false, false, false, charSet, + OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH|FF_ROMAN, font.c_str()); + + pfSmall=CreateFont(int(scale*11), 0, 0, 0, FW_NORMAL, false, false, false, charSet, + OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH|FF_ROMAN, font.c_str()); + + pfSmallItalic = CreateFont(int(scale*11), 0, 0, 0, FW_NORMAL, true, false, false, charSet, + OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH|FF_ROMAN, font.c_str()); + + pfItalic = CreateFont(int(scale*14), 0, 0, 0, FW_NORMAL, true, false, false, charSet, + OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH|FF_ROMAN, font.c_str()); + + pfMono = CreateFont(int(scale*12), 0, 0, 0, FW_NORMAL, false, false, false, charSet, + OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH|FF_MODERN, "Lucida Console"); + + pfItalicMediumPlus = CreateFont(int(scale*18), 0, 0, 0, FW_NORMAL, true, false, false, charSet, + OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH|FF_ROMAN, font.c_str()); +} + +void GDIImplFontSet::getInfo(FontInfo &fi) const { + fi.normal = pfMedium; + fi.bold = Medium; + fi.italic = pfItalic; +} + +void GDIImplFontSet::selectFont(HDC hDC, int format) const { + if (format==0 || format==10) { + SelectObject(hDC, pfMedium); + } + else if (format==fontMedium){ + SelectObject(hDC, pfMedium); + } + else if (format==1){ + SelectObject(hDC, Medium); + } + else if (format==boldLarge){ + SelectObject(hDC, Large); + } + else if (format==boldHuge){ + SelectObject(hDC, Huge); + } + else if (format==boldSmall){ + SelectObject(hDC, Small); + } + else if (format==fontLarge){ + SelectObject(hDC, pfLarge); + } + else if (format==fontMediumPlus){ + SelectObject(hDC, pfMediumPlus); + } + else if (format==fontSmall){ + SelectObject(hDC, pfSmall); + } + else if (format==italicSmall){ + SelectObject(hDC, pfSmallItalic); + } + else if (format==italicText){ + SelectObject(hDC, pfItalic); + } + else if (format==italicMediumPlus){ + SelectObject(hDC, pfItalicMediumPlus); + } + else if (format == monoText) { + SelectObject(hDC, pfMono); + } + else { + SelectObject(hDC, GetStockObject(DEFAULT_GUI_FONT)); + } +} + + +HFONT GDIImplFontSet::getFont(int format) const { + format = format & 31; + if (format==0 || format==10) { + return pfMedium; + } + else if (format==fontMedium){ + return pfMedium; + } + else if (format==1){ + return Medium; + } + else if (format==boldLarge){ + return Large; + } + else if (format==boldHuge){ + return Huge; + } + else if (format==boldSmall){ + return Small; + } + else if (format==fontLarge){ + return pfLarge; + } + else if (format==fontMediumPlus){ + return pfMediumPlus; + } + else if (format==fontSmall){ + return pfSmall; + } + else if (format==italicSmall){ + return pfSmallItalic; + } + else if (format==italicText){ + return pfItalic; + } + else if (format==italicMediumPlus){ + return pfItalicMediumPlus; + } + else if (format == monoText) { + return pfMono; + } + else { + return (HFONT)GetStockObject(DEFAULT_GUI_FONT); + } +} + + + +const GDIImplFontSet &gdioutput::getCurrentFont() const { + if (currentFontSet == 0) { + map::const_iterator res = fonts.find(currentFont); + if (res == fonts.end()) + throw meosException("Font not defined: " + currentFont); + currentFontSet = &res->second; + } + + return *currentFontSet; +} + +const GDIImplFontSet &gdioutput::getFont(const string &font) const { + map::const_iterator res = fonts.find(font); + if (res == fonts.end()) { + return const_cast(this)->loadFont(font); + throw meosException("Font not defined: " + currentFont); + } + return res->second; +} + +int CALLBACK enumFontProc(const LOGFONT* logFont, const TEXTMETRIC *metric, DWORD id, LPARAM lParam) { + if (logFont->lfFaceName[0] == '@') + return 1; + + if (metric->tmAveCharWidth <= 0) + return 1; + + vector &enumFonts = *(vector *)(lParam); + /*string we = "we: " + itos(logFont->lfWeight); + string wi = "wi: " + itos(metric->tmAveCharWidth); + string he = "he: " + itos(metric->tmHeight); + string info = string(logFont->lfFaceName) + ", " + we + ", " + wi + ", " + he;*/ + enumFonts.push_back(GDIImplFontEnum()); + GDIImplFontEnum &f = enumFonts.back(); + f.face = logFont->lfFaceName; + f.height = metric->tmHeight; + f.width = metric->tmAveCharWidth; + f.relScale = ((double(metric->tmHeight) / double(metric->tmAveCharWidth)) * 14.0/36.0); + return 1; +} + +void gdioutput::getEnumeratedFonts(vector< pair > &output) const { + if (enumeratedFonts.empty()) { + HDC hDC = GetDC(hWndTarget); +// EnumFontFamilies(hDC, NULL, enumFontProc, LPARAM(&enumeratedFonts)); + LOGFONT logFont; + memset(&logFont, 0, sizeof(LOGFONT)); + logFont.lfCharSet = getCharSet(); + EnumFontFamiliesEx(hDC, &logFont, enumFontProc, LPARAM(&enumeratedFonts), 0); + ReleaseDC(hWndTarget, hDC); + } + output.resize(enumeratedFonts.size()); + for (size_t k = 0; k avgWidthCache.size()) + throw meosException("Internal font error"); + + if (avgWidthCache[font] == 0) { + TextInfo ti; + ti.xp = 0; + ti.yp = 0; + ti.format = font; + ti.text = "Goliat Meze 1234:5678"; + ti.font = gdiName; + gdi.calcStringSize(ti); + avgWidthCache[font] = double(ti.textRect.right) / double(ti.text.length()); + + } + return avgWidthCache[font]; +} + +const string &gdioutput::getFontName(int id) { + + return _EmptyString; +} + +GDIImplFontEnum::GDIImplFontEnum() { + relScale = 1.0; +} + +GDIImplFontEnum::~GDIImplFontEnum() { +} + +void gdioutput::setEncoding(FontEncoding encoding) { + if (encoding != fontEncoding) { + enumeratedFonts.clear(); + fonts.clear(); + fontEncoding = encoding; + } +} + +FontEncoding gdioutput::getEncoding() const { + return fontEncoding; +} + +FontEncoding interpetEncoding(const string &enc) { + if (enc == "RUSSIAN") + return Russian; + else if (enc == "EASTEUROPE") + return EastEurope; + else if (enc == "HEBREW") + return Hebrew; + else + return ANSI; +} + +const wstring &gdioutput::toWide(const string &input) const { + wstring &output = StringCache::getInstance().wget(); + int cp = 1252; + switch(getEncoding()) { + case Russian: + cp = 1251; + break; + case EastEurope: + cp = 1250; + break; + case Hebrew: + cp = 1255; + break; + } + + output.resize(input.size()+1, 0); + MultiByteToWideChar(cp, MB_PRECOMPOSED, input.c_str(), -1, &output[0], output.size() * sizeof(wchar_t)); + return output; +} + +const string &gdioutput::toUTF8(const string &input) const { + return toUTF8(toWide(input)); +} + +const string &gdioutput::toUTF8(const wstring &winput) const { + string &output = StringCache::getInstance().get(); + size_t alloc = winput.length()*2; + output.resize(alloc); + WideCharToMultiByte(CP_UTF8, 0, winput.c_str(), winput.length()+1, (char *)output.c_str(), alloc, 0, 0); + output.resize(strlen(output.c_str())); + return output; +} + +void gdioutput::setListDescription(const string &desc) { + listDescription = desc; +} + +InputInfo &InputInfo::setFont(gdioutput &gdi, gdiFonts font) { + SendMessage(hWnd, WM_SETFONT, (WPARAM) gdi.getCurrentFont().getFont(font), 0); + return *this; +} + +void gdioutput::copyToClipboard(const string &html, bool convertToUTF8, const string &txt) const { + + if (OpenClipboard(getHWND()) != false) { + EmptyClipboard(); + + string htmlUTF; + size_t len = html.length() + 1; + const char *output = html.c_str(); + if (convertToUTF8) { + htmlUTF = toUTF8(html); + len = htmlUTF.length() + 1; + output = htmlUTF.c_str(); + } + + const char cbd[]= + "Version:0.9\n" + "StartHTML:%08u\n" + "EndHTML:%08u\n" + "StartFragment:%08u\n" + "EndFragment:%08u\n"; + + char head[256]; + sprintf_s(head, cbd, 1,0,0,0); + + int offset=strlen(head); + + //Fill header with relevant information + int ho_start = offset; + int ho_end = offset + len; + sprintf_s(head, cbd, offset,offset+len,ho_start,ho_end); + + HANDLE hMem=GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, offset+len); + LPVOID data=GlobalLock(hMem); + + memcpy(LPSTR(data), head, offset); + memcpy(LPSTR(data)+offset, output, len); + + GlobalUnlock(hMem); + + // Text format + HANDLE hMemText = 0; + HANDLE hMemTextWide = 0; + + if (txt.length() > 0) { + hMemText = GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, txt.length()+1); + LPVOID dataText=GlobalLock(hMemText); + memcpy(LPSTR(dataText), txt.c_str() , txt.length()+1); + GlobalUnlock(hMemText); + } + else { + // HTML table to text + ostringstream result; + bool started = false; + bool newline = false; + bool dowrite = false; + for (size_t k = 0; k + 3 < html.size(); k++) { + if (html[k] == '<') { + if (html[k+1] == 't') { + if (html[k+2] == 'r') { + newline = true; + if (started) + result << "\r\n"; + } + else if (html[k+2] == 'd') { + if (!newline) + result << "\t"; + started = true; + newline = false; + dowrite = true; + } + } + else if (html[k+1] == '/') { + if (html[k+2] == 't' && html[k+3] == 'd') { + dowrite = false; + } + } + while (k < html.size() && html[k] != '>') + k++; + } + else { + if (dowrite) + result << html[k]; + } + } + + string atext = decodeXML(result.str()); +/* result.flush(); + + for (size_t k = 0; k < atext.size(); k++) { + if (atext[k] == '&') { + size_t m = 0; + while ((k+m) < atext.size() && atext[k+m] != ';') + m++; + + if ((k+m) < atext.size() && atext[k+m] == ';') { + string cmd = atext.substr(k, m-k); + if (cmd == "nbsp") + result << " "; + else if (cmd == "amp") + result << " "; + else if (cmd == "lt") + result << "<"; + else if (cmd == "gt") + result << ">"; + else if (cmd == "quot") + result << "\""; + + k += m; + } + } + else + result << atext[k]; + + } + + atext = result.str(); +*/ + if (atext.size() > 0) { + wstring atextw; + int osize = atext.size(); + atextw.resize(osize + 1, 0); + size_t siz = atextw.size(); + MultiByteToWideChar(CP_UTF8, 0, atext.c_str(), -1, &atextw[0], siz * sizeof(wchar_t)); + hMemTextWide = GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, siz * sizeof(wchar_t)); + LPVOID dataText = GlobalLock(hMemTextWide); + memcpy(LPSTR(dataText), atextw.c_str(), siz * sizeof(wchar_t)); + GlobalUnlock(hMemTextWide); + } + } + UINT CF_HTML = RegisterClipboardFormat("HTML format"); + SetClipboardData(CF_HTML, hMem); + + if (hMemText != 0) + SetClipboardData(CF_TEXT, hMemText); + if (hMemTextWide != 0) { + SetClipboardData(CF_UNICODETEXT, hMemTextWide); + } + CloseClipboard(); + } +} + +Recorder &gdioutput::getRecorder() { + if (recorder.first == 0) { + recorder.first = new Recorder(); + recorder.second = true; + } + return *recorder.first; +} + +void gdioutput::initRecorder(Recorder *rec) { + if (recorder.second) + delete recorder.first; + + recorder.first = rec; + recorder.second = false; +} + +string gdioutput::dbPress(const string &id, int extra) { + bool notEnabled = false; + for (list::iterator it=BI.begin(); it != BI.end(); ++it) { + if (id==it->id && (extra == -65536 || extra == it->getExtraInt())) { + + if (!IsWindowEnabled(it->hWnd)) { + notEnabled = true; + continue; + } + + if (it->isCheckbox) { + check(id, !isChecked(id)); + } + else if(!it->callBack && !it->handler) + throw meosException("Button " + id + " is not active."); + + string val = it->text; + if (it->handler) + it->handleEvent(*this, GUI_BUTTON); + else if (it->callBack) + it->callBack(this, GUI_BUTTON, &*it); //it may be destroyed here... + return val; + } + } + if (notEnabled) + throw meosException("Button " + id + " is not active."); + + throw meosException("Unknown command " + id + "."); +} + +string gdioutput::dbPress(const string &id, const char *extra) { + string eid = extra ? extra : ""; + for (list::iterator it=BI.begin(); it != BI.end(); ++it) { + if (id==it->id && (!extra || (it->isExtraString() && eid == it->getExtra()))) { + + if (!IsWindowEnabled(it->hWnd)) + throw meosException("Button " + id + " is not active."); + + if (it->isCheckbox) { + check(id, !isChecked(id)); + } + else if(!it->callBack && !it->handler) + throw meosException("Button " + id + " is not active."); + + string val = it->text; + if (it->handler) + it->handleEvent(*this, GUI_BUTTON); + else if (it->callBack) + it->callBack(this, GUI_BUTTON, &*it); //it may be destroyed here... + return val; + } + } + throw meosException("Unknown command " + id + "/" + eid +"."); +} + + +string gdioutput::dbSelect(const string &id, int data) { + + for (list::iterator it = LBI.begin(); it != LBI.end(); ++it) { + if (id==it->id) { + if (!IsWindowEnabled(it->hWnd)) + throw meosException("Selection " + id + " is not active."); + if (it->multipleSelection) { + map::const_iterator res = it->data2Index.find(data); + if (res != it->data2Index.end()) + SendMessage(it->hWnd, LB_SETSEL, true, res->second); + else + throw meosException("List " + id + " does not contain value " + itos(data) + "."); + } + else { + if (!selectItemByData(id, data)) + throw meosException("List " + id + " does not contain value " + itos(data) + "."); + } + UpdateWindow(it->hWnd); + string res = it->text; + internalSelect(*it); + return res; + } + } + throw meosException("Unknown selection " + id + "."); +} + +void gdioutput::internalSelect(ListBoxInfo &bi) { + bi.syncData(); + if (bi.callBack || bi.handler) { + setWaitCursor(true); + hasCleared = false; + try { + bi.writeLock = true; + if (bi.handler) + bi.handleEvent(*this, GUI_LISTBOX); + else + bi.callBack(this, GUI_LISTBOX, &bi); //it may be destroyed here... Then hasCleared is set. + } + catch(...) { + if (!hasCleared) + bi.writeLock = false; + setWaitCursor(false); + throw; + } + if (!hasCleared) + bi.writeLock = false; + setWaitCursor(false); + } +} + +void gdioutput::dbInput(const string &id, const string &text) { + for (list::iterator it = LBI.begin(); it != LBI.end(); ++it) { + if (id==it->id) { + if (!IsWindowEnabled(it->hWnd) || !it->IsCombo) + throw meosException("Selection " + id + " is not active."); + + SendMessage(it->hWnd, CB_SETCURSEL, -1, 0); + SetWindowText(it->hWnd, text.c_str()); + it->text = text; + it->data = -1; + if (it->handler) + it->handleEvent(*this, GUI_COMBO); + else if (it->callBack) + it->callBack(this, GUI_COMBO, &*it); //it may be destroyed here... + return; + } + } + + for (list::iterator it = II.begin(); it != II.end(); ++it) { + if (id == it->id) { + if (!IsWindowEnabled(it->hWnd)) + throw meosException("Input " + id + " is not active."); + + it->text = text; + SetWindowText(it->hWnd, text.c_str()); + if (it->handler) + it->handleEvent(*this, GUI_INPUT); + else if (it->callBack) + it->callBack(this, GUI_INPUT, &*it); + return; + } + } + + throw meosException("Unknown input " + id + "."); +} + +void gdioutput::dbCheck(const string &id, bool state) { + +} + +string gdioutput::dbClick(const string &id, int extra) { + for (list::iterator it = TL.begin(); it != TL.end(); ++it) { + if (it->id == id && (extra == -65536 || it->getExtraInt() == extra)) { + if (it->callBack || it->hasEventHandler()) { + string res = it->text; + if (!it->handleEvent(*this, GUI_LINK)) + it->callBack(this, GUI_LINK, &*it); + return res; + } + else + throw meosException("Link " + id + " is not active."); + } + } + + throw meosException("Unknown link " + id + "."); +} + +void gdioutput::dbDblClick(const string &id, int data) { + for (list::iterator it = LBI.begin(); it != LBI.end(); ++it) { + if (id==it->id) { + if (!IsWindowEnabled(it->hWnd)) + throw meosException("Selection " + id + " is not active."); + selectItemByData(id, data); + if (it->handler) + it->handleEvent(*this, GUI_LISTBOXSELECT); + else if (it->callBack) + it->callBack(this, GUI_LISTBOXSELECT, &*it); //it may be destroyed here... + return; + } + } + throw meosException("Unknown selection " + id + "."); +} + +// Add the next answer for a dialog popup +void gdioutput::dbPushDialogAnswer(const string &answer) { + cmdAnswers.push_back(answer); +} + +void gdioutput::clearDialogAnswers(bool checkEmpty) { + if (!cmdAnswers.empty()) { + string front = cmdAnswers.front(); + cmdAnswers.clear(); + if (checkEmpty) + throw meosException("Pending answer: X#" + front); + } +} + +int gdioutput::dbGetStringCount(const string &str, bool subString) const { + int count = 0; + for (list::const_iterator it = TL.begin(); it != TL.end(); ++it) { + if (subString == false) { + if (it->text == str) + count++; + } + else { + if (it->text.find(str) != string::npos) + count++; + } + } + return count; +} + diff --git a/code/gdioutput.h b/code/gdioutput.h new file mode 100644 index 0000000..eb0bdd7 --- /dev/null +++ b/code/gdioutput.h @@ -0,0 +1,654 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +// gdioutput.h: interface for the gdioutput class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_GDIOUTPUT_H__396F60F8_679F_498A_B759_DF8F6F346A4A__INCLUDED_) +#define AFX_GDIOUTPUT_H__396F60F8_679F_498A_B759_DF8F6F346A4A__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + + +#include +#include +#include +#include +#include +#include + +class Toolbar; + +class gdioutput; +class oEvent; +typedef oEvent *pEvent; + +struct PrinterObject; + +class GDIImplFontEnum; +class GDIImplFontSet; + +class Table; +class FixedTabs; + +struct PageInfo; +struct RenderedPage; + +typedef int (*GUICALLBACK)(gdioutput *gdi, int type, void *data); + +enum GDICOLOR; +enum KeyCommandCode; +enum gdiFonts; +#include "gdistructures.h" + + +#define START_YP 30 +#define NOTIMEOUT 0x0AAAAAAA + +typedef list ToolList; + +enum FontEncoding { + ANSI, Russian, EastEurope, Hebrew +}; + +FontEncoding interpetEncoding(const string &enc); + +struct FontInfo { + const string *name; + HFONT normal; + HFONT bold; + HFONT italic; +}; + +class Recorder; + +class gdioutput { +protected: + string tag; + // Database error state warning + bool dbErrorState; + // Flag set to true when clearPage is called. + bool hasCleared; + bool useTables; + FontEncoding fontEncoding; + // Set to true when in test mode + bool isTestMode; + + int getCharSet() const; + + bool highContrast; + + void deleteFonts(); + void constructor(double _scale); + + void updateStringPosCache(); + vector shownStrings; + + void enableCheckBoxLink(TextInfo &ti, bool enable); + + //void CalculateCS(TextInfo &text); + //void printPage(PrinterObject &po, int StartY, int &EndY, bool calculate); + void printPage(PrinterObject &po, const PageInfo &pageInfo, RenderedPage &page); + bool startDoc(PrinterObject &po); + + bool getSelectedItem(ListBoxInfo &lbi); + bool doPrint(PrinterObject &po, PageInfo &pageInfo, pEvent oe); + + PrinterObject *po_default; + + void restoreInternal(const RestoreInfo &ri); + + void drawCloseBox(HDC hDC, RECT &Close, bool pressed); + + void setFontCtrl(HWND hWnd); + + list TL; + + //True if textlist has increasing y-values so + //that we can optimize rendering. + bool renderOptimize; + //Stored iterator used to optimize rendering + //by avoiding to loop through complete TL. + list::iterator itTL; + + list BI; + stdext::hash_map biByHwnd; + + list II; + stdext::hash_map iiByHwnd; + + list LBI; + stdext::hash_map lbiByHwnd; + + list DataInfo; + list Events; + list Rectangles; + list Tables; + list timers; + + Toolbar *toolbar; + ToolList toolTips; + + map restorePoints; + + GUICALLBACK onClear; + GUICALLBACK postClear; + + list IBox; + + list FocusList; + struct FucusInfo { + bool wasTabbed; + HWND hWnd; + FucusInfo() : wasTabbed(false), hWnd(false) {} + FucusInfo(HWND wnd) : wasTabbed(false), hWnd(wnd) {} + }; + + FucusInfo currentFocus; + + int lineHeight; + HWND hWndTarget; + HWND hWndAppMain; + HWND hWndToolTip; + HWND hWndTab; + + HBRUSH Background; + + map fonts; + const GDIImplFontSet &getCurrentFont() const; + const GDIImplFontSet &getFont(const string &font) const; + const GDIImplFontSet &loadFont(const string &font); + mutable const GDIImplFontSet *currentFontSet; + + int MaxX; + int MaxY; + int CurrentX; + int CurrentY; + int SX; + int SY; + + int Direction; + + int OffsetY; //Range 0 -- MaxY + int OffsetX; //Range 0 -- MaxX + + //Set to true if we should not update window during "addText" operations + bool manualUpdate; + + LRESULT ProcessMsgWrp(UINT iMessage, LPARAM lParam, WPARAM wParam); + void getWindowText(HWND hWnd, string &text); + double scale; + HFONT getGUIFont() const; + + void resetLast() const; + mutable int lastFormet; + mutable bool lastActive; + mutable bool lastHighlight; + mutable DWORD lastColor; + mutable string lastFont; + + void initCommon(double scale, const string &font); + + void processButtonMessage(ButtonInfo &bi, DWORD wParam); + void processEditMessage(InputInfo &bi, DWORD wParam); + void processComboMessage(ListBoxInfo &bi, DWORD wParam); + void processListMessage(ListBoxInfo &bi, DWORD wParam); + + void doEnter(); + void doEscape(); + bool doUpDown(int direction); + + FixedTabs *tabs; + + string currentFont; + vector< GDIImplFontEnum > enumeratedFonts; + + double autoSpeed; + double autoPos; + mutable double lastSpeed; + mutable double autoCounter; + + bool lockRefresh; + bool fullScreen; + bool hideBG; + mutable bool commandLock; + mutable DWORD commandUnlockTime; + + bool hasCommandLock() const; + void setCommandLock() const; + void liftCommandLock() const; + + struct ScreenStringInfo { + RECT rc; + string str; + bool reached; + + ScreenStringInfo(const RECT &r, const string &s) { + rc = r; + str = s; + reached = false; + } + }; + + string listDescription; + + mutable map, ScreenStringInfo> screenXYToString; + mutable map > stringToScreenXY; + mutable pair snapshotMaxXY; + bool hasAnyTimer; + + friend class InputInfo; + friend class TestMeOS; + + // Recorder, the second member is true if the recorder is owned and should be deleted + pair recorder; +public: + + void initRecorder(Recorder *rec); + Recorder &getRecorder(); + string dbPress(const string &id, int extra); + string dbPress(const string &id, const char *extra); + + string dbSelect(const string &id, int data); + void dbInput(const string &id, const string &test); + void dbCheck(const string &id, bool state); + string dbClick(const string &id, int extra); + void dbDblClick(const string &id, int data); + + // Add the next answer for a dialog popup + void dbPushDialogAnswer(const string &answer); + mutable list cmdAnswers; + + int dbGetStringCount(const string &str, bool subString) const; + + // Ensure list of stored answers is empty + void clearDialogAnswers(bool checkEmpty); + + void internalSelect(ListBoxInfo &bi); + + bool isTest() const {return isTestMode;} + const string &getTag() const {return tag;} + bool hasTag(const string &t) const {return tag == t;} + const wstring &toWide(const string &input) const; + + const string &toUTF8(const string &input) const; + const string &toUTF8(const wstring &input) const; + + void setEncoding(FontEncoding encoding); + FontEncoding getEncoding() const; + + void getFontInfo(const TextInfo &ti, FontInfo &fi) const; + + /** Return true if rendering text should be skipped for + this format. */ + static bool skipTextRender(int format); + + const list &getTL() const {return TL;} + + void getEnumeratedFonts(vector< pair > &output) const; + const string &getFontName(int id); + double getRelativeFontScale(gdiFonts font, const char *fontFace) const; + + bool isFullScreen() const {return fullScreen;} + void setFullScreen(bool useFullScreen); + void setAutoScroll(double speed); + void getAutoScroll(double &speed, double &pos) const; + void storeAutoPos(double pos); + int getAutoScrollDir() const {return (autoSpeed > 0 ? 1:-1);} + int setHighContrastMaxWidth(); + void hideBackground(bool hide) {hideBG = hide;} + HWND getToolbarWindow() const; + bool hasToolbar() const; + void activateToolbar(bool active); + + void processToolbarMessage(const string &id, void *data); + + void synchronizeListScroll(const string &id1, const string &id2); + + FixedTabs &getTabs(); + + // True if up/down is locked, i.e, don't move page + bool lockUpDown; + + + double getScale() const {return scale;} + void enableEditControls(bool enable); + + bool hasEditControl() const; + + void setFont(int size, const string &font, FontEncoding encoding); + + int getButtonHeight() const; + int scaleLength(int input) const {return int(scale*input + 0.5);} + + // Fill in current printer settings + void fetchPrinterSettings(PrinterObject &po) const; + + void tableCB(ButtonInfo &bu, Table *t); + + char *getExtra(const char *id) const; + int getExtraInt(const char *id) const; + + void enableTables(); + void disableTables(); + + void pasteText(const char *id); + + bool writeHTML(const wstring &file, const string &title, int refreshTimeOut) const; + bool writeTableHTML(const wstring &file, const string &title, int refreshTimeOut) const; + bool writeTableHTML(ostream &fout, + const string &title, + bool simpleFormat, + int refreshTimeOut) const; + + void print(pEvent oe, Table *t=0, bool printMeOSHeader=true, bool noMargin=false); + void print(PrinterObject &po, pEvent oe, bool printMeOSHeader=true, bool noMargin=false); + void printSetup(PrinterObject &po); + void destroyPrinterDC(PrinterObject &po); + + void setSelection(const string &id, const set &selection); + void getSelection(const string &id, set &selection); + + HWND getTarget() const {return hWndTarget;} + HWND getMain() const {return hWndAppMain;} + + string browseForFolder(const string &folderStart, const char *descr); + void scrollToBottom(); + void scrollTo(int x, int y); + void setOffset(int x, int y, bool update); + + void selectTab(int Id); + + void addTable(Table *table, int x, int y); + Table &getTable() const; //Get the (last) table. If needed, add support for named tables... + + ToolInfo &addToolTip(const string &id, const string &tip, HWND hWnd, RECT *rc=0); + ToolInfo *getToolTip(const string &id); + ToolInfo &updateToolTip(const string &id, const string &tip); + + HWND getToolTip(){return hWndToolTip;} + + void init(HWND hWnd, HWND hMainApp, HWND hTab); + bool openDoc(const char *doc); + string browseForSave(const vector< pair > &filter, + const string &defext, int &FilterIndex); + string browseForOpen(const vector< pair > &filter, + const string &defext); + + bool clipOffset(int PageX, int PageY, int &MaxOffsetX, int &MaxOffsetY); + RectangleInfo &addRectangle(RECT &rc, GDICOLOR Color = GDICOLOR(-1), + bool DrawBorder = true, bool addFirst = false); + + RectangleInfo &getRectangle(const char *id); + + DWORD makeEvent(const string &id, const string &origin, + DWORD data, int extraData, bool flushEvent); + + void unregisterEvent(const string &id); + EventInfo ®isterEvent(const string &id, GUICALLBACK cb); + + int sendCtrlMessage(const string &id); + bool canClear(); + void setOnClearCb(GUICALLBACK cb); + void setPostClearCb(GUICALLBACK cb); + + void restore(const string &id="", bool DoRefresh=true); + + /// Restore, but do not update client area size, + /// position, zoom, scrollbars, and do not refresh + void restoreNoUpdate(const string &id); + + void setRestorePoint(); + void setRestorePoint(const string &id); + + bool removeControl(const string &id); + bool hideControl(const string &id); + + void CheckInterfaceTimeouts(DWORD T); + bool RemoveFirstInfoBox(const string &id); + void drawBoxText(HDC hDC, RECT &tr, InfoBox &Box, bool highligh); + void drawBoxes(HDC hDC, RECT &rc); + void drawBox(HDC hDC, InfoBox &Box, RECT &pos); + void addInfoBox(string id, string text, int TimeOut=0, GUICALLBACK cb=0); + HWND getHWND() const {return hWndTarget;} + void updateObjectPositions(); + void drawBackground(HDC hDC, RECT &rc); + void renderRectangle(HDC hDC, RECT *clipRegion, const RectangleInfo &ri); + + void updateScrollbars() const; + + void SetOffsetY(int oy){OffsetY=oy;} + void SetOffsetX(int ox){OffsetX=ox;} + int GetPageY(){return max(MaxY, 100)+60;} + int GetPageX(){return max(MaxX, 100)+100;} + int GetOffsetY(){return OffsetY;} + int GetOffsetX(){return OffsetX;} + + void RenderString(TextInfo &ti, const string &text, HDC hDC); + void RenderString(TextInfo &ti, HDC hDC=0); + void calcStringSize(TextInfo &ti, HDC hDC=0) const; + void formatString(const TextInfo &ti, HDC hDC) const; + + static string getTimerText(TextInfo *tit, DWORD T); + static string getTimerText(int ZeroTime, int format); + + + void fadeOut(string Id, int ms); + void setWaitCursor(bool wait); + void setWindowTitle(const string &title); + bool selectFirstItem(const string &name); + void removeString(string Id); + void refresh() const; + void refreshFast() const; + + void takeShownStringsSnapshot(); + void refreshSmartFromSnapshot(bool allowMoveOffset); + + void dropLine(double lines=1){CurrentY+=int(lineHeight*lines); MaxY=max(MaxY, CurrentY);} + int getCX() const {return CurrentX;} + int getCY() const {return CurrentY;} + int getWidth() const {return MaxX;} + int getHeight() const {return MaxY;} + void getTargetDimension(int &x, int &y) const; + + void setCX(int cx){CurrentX=cx;} + void setCY(int cy){CurrentY=cy;} + int getLineHeight() const {return lineHeight;} + int getLineHeight(gdiFonts font, const char *face) const; + + BaseInfo *setInputFocus(const string &id, bool select=false); + InputInfo *getInputFocus(); + + void enableInput(const char *id, bool acceptMissing = false) {setInputStatus(id, true, acceptMissing);} + void disableInput(const char *id, bool acceptMissing = false) {setInputStatus(id, false, acceptMissing);} + void setInputStatus(const char *id, bool status, bool acceptMissing = false); + void setInputStatus(const string &id, bool status, bool acceptMissing = false) + {setInputStatus(id.c_str(), status, acceptMissing);} + + void setTabStops(const string &Name, int t1, int t2=-1); + void setData(const string &id, DWORD data); + void setData(const string &id, void *data); + void *getData(const string &id) const; + + void autoRefresh(bool flag) {manualUpdate = !flag;} + + bool getData(const string &id, DWORD &data) const; + bool hasData(const char *id) const; + + int getItemDataByName(const char *id, const char *name) const; + bool selectItemByData(const char *id, int data); + void removeSelected(const char *id); + + bool selectItemByData(const string &id, int data) { + return selectItemByData(id.c_str(), data); + } + + enum AskAnswer {AnswerNo = 0, AnswerYes = 1, AnswerCancel = 2}; + bool ask(const string &s); + AskAnswer askCancel(const string &s); + + void alert(const string &msg) const; + void fillDown(){Direction=1;} + void fillRight(){Direction=0;} + void fillNone(){Direction=-1;} + void newColumn(){CurrentY=START_YP; CurrentX=MaxX+10;} + void newRow(){CurrentY=MaxY; CurrentX=10;} + + void pushX(){SX=CurrentX;} + void pushY(){SY=CurrentY;} + void popX(){CurrentX=SX;} + void popY(){CurrentY=SY;} + + bool updatePos(int x, int y, int width, int height); + void adjustDimension(int width, int height); + + /** Return a selected item*/ + bool getSelectedItem(const string &id, ListBoxInfo &lbi); + + /** Return the selected data in first, second indicates if data was available*/ + pair getSelectedItem(const string &id); + pair getSelectedItem(const char *id); + + bool addItem(const string &id, const string &text, size_t data = 0); + bool addItem(const string &id, const vector< pair > &items); + void filterOnData(const string &id, const stdext::hash_set &filter); + + bool clearList(const string &id); + + bool hasField(const string &id) const; + const string &getText(const char *id, bool acceptMissing = false) const; + BaseInfo &getBaseInfo(const char *id) const; + + int getTextNo(const char *id, bool acceptMissing = false) const; + int getTextNo(const string &id, bool acceptMissing = false) const + {return getTextNo(id.c_str(), acceptMissing);} + + const string &getText(const string &id, bool acceptMissing = false) const + {return getText(id.c_str(), acceptMissing);} + + // Insert text and notify "focusList" + bool insertText(const string &id, const string &text); + + void copyToClipboard(const string &html, bool convertToUTF8, + const string &txt) const; + + BaseInfo *setTextTranslate(const char *id, const string &text, bool update=false); + BaseInfo *setTextTranslate(const char *id, const char *text, bool update=false); + BaseInfo *setTextTranslate(const string &id, const string &text, bool update=false); + + BaseInfo *setText(const char *id, const string &text, bool update=false); + BaseInfo *setText(const char *id, int number, bool update=false); + BaseInfo *setTextZeroBlank(const char *id, int number, bool update=false); + BaseInfo *setText(const string &id, const string &text, bool update=false) + {return setText(id.c_str(), text, update);} + BaseInfo *setText(const string &id, int number, bool update=false) + {return setText(id.c_str(), number, update);} + + void clearPage(bool autoRefresh, bool keepToolbar = false); + + void TabFocus(int direction=1); + void Enter(); + void Escape(); + bool UpDown(int direction); + void keyCommand(KeyCommandCode code); + + LRESULT ProcessMsg(UINT iMessage, LPARAM lParam, WPARAM wParam); + void setWindow(HWND hWnd){hWndTarget=hWnd;} + + void scaleSize(double scale); + + ButtonInfo &addButton(const string &id, const string &text, GUICALLBACK cb = 0, const string &tooltip=""); + + ButtonInfo &addButton(int x, int y, const string &id, const string &text, + GUICALLBACK cb = 0, const string &tooltop=""); + ButtonInfo &addButton(int x, int y, int w, const string &id, const string &text, + GUICALLBACK cb, const string &tooltop, bool AbsPos, bool hasState); + + ButtonInfo &addCheckbox(const string &id, const string &text, GUICALLBACK cb=0, bool Checked=true, const string &Help=""); + ButtonInfo &addCheckbox(int x, int y, const string &id, const string &text, GUICALLBACK cb=0, bool Checked=true, const string &Help="", bool AbsPos=false); + bool isChecked(const string &id); + void check(const string &id, bool state, bool keepOriginalState = false); + + bool isInputChanged(const string &exclude); + + InputInfo &addInput(const string &id, const string &text="", int length=16, GUICALLBACK cb=0, const string &Explanation="", const string &tooltip=""); + InputInfo &addInput(int x, int y, const string &id, const string &text, int length, GUICALLBACK cb=0, const string &Explanation="", const string &tooltip=""); + + InputInfo *replaceSelection(const char *id, const string &text); + + InputInfo &addInputBox(const string &id, int width, int height, const string &text, + GUICALLBACK cb, const string &Explanation); + + InputInfo &addInputBox(const string &id, int x, int y, int width, int height, + const string &text, GUICALLBACK cb, const string &Explanation); + + ListBoxInfo &addListBox(const string &id, int width, int height, GUICALLBACK cb=0, const string &Explanation="", const string &tooltip="", bool multiple=false); + ListBoxInfo &addListBox(int x, int y, const string &id, int width, int height, GUICALLBACK cb=0, const string &Explanation="", const string &tooltip="", bool multiple=false); + + ListBoxInfo &addSelection(const string &id, int width, int height, GUICALLBACK cb=0, const string &Explanation="", const string &tooltip=""); + ListBoxInfo &addSelection(int x, int y, const string &id, int width, int height, GUICALLBACK cb=0, const string &Explanation="", const string &tooltip=""); + + ListBoxInfo &addCombo(const string &id, int width, int height, GUICALLBACK cb=0, const string &Explanation="", const string &tooltip=""); + ListBoxInfo &addCombo(int x, int y, const string &id, int width, int height, GUICALLBACK cb=0, const string &Explanation="", const string &tooltip=""); + // Grows a listbox, selection, combo in X-direction to fit current contents. Returns true if changed. + bool autoGrow(const char *id); + + void setListDescription(const string &desc); + + TextInfo &addString(const string &id, int format, const string &text, GUICALLBACK cb=0); + TextInfo &addString(const string &id, int yp, int xp, int format, const string &text, + int xlimit=0, GUICALLBACK cb=0, const char *fontFace = 0); + TextInfo &addString(const char *id, int format, const string &text, GUICALLBACK cb=0); + TextInfo &addString(const char *id, int yp, int xp, int format, const string &text, + int xlimit=0, GUICALLBACK cb=0, const char *fontFace = 0); + // Untranslated versions + TextInfo &addStringUT(int yp, int xp, int format, const string &text, + int xlimit=0, GUICALLBACK cb=0, const char *fontFace = 0); + TextInfo &addStringUT(int format, const string &text, GUICALLBACK cb=0); + + TextInfo &addTimer(int yp, int xp, int format, DWORD ZeroTime, + int xlimit=0, GUICALLBACK cb=0, int TimeOut=NOTIMEOUT, const char *fontFace = 0); + TextInfo &addTimeout(int TimeOut, GUICALLBACK cb); + + void removeTimeoutMilli(const string &id); + TimerInfo &addTimeoutMilli(int timeOut, const string &id, GUICALLBACK cb); + void timerProc(TimerInfo &timer, DWORD timeout); + + void draw(HDC hDC, RECT &windowArea, RECT &drawArea); + + void closeWindow(); + + void setDBErrorState(bool state); + + friend int TablesCB(gdioutput *gdi, int type, void *data); + friend class Table; + friend gdioutput *createExtraWindow(const string &tag, const string &title, int max_x, int max_y); + + gdioutput(const string &tag, double _scale, FontEncoding encoding); + gdioutput(double _scale, FontEncoding encoding, HWND hWndTarget, const PrinterObject &defprn); + virtual ~gdioutput(); +}; + +#endif // !defined(AFX_GDIOUTPUT_H__396F60F8_679F_498A_B759_DF8F6F346A4A__INCLUDED_) diff --git a/code/gdistructures.h b/code/gdistructures.h new file mode 100644 index 0000000..c77b194 --- /dev/null +++ b/code/gdistructures.h @@ -0,0 +1,402 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#ifndef GDI_STRUCTURES +#define GDI_STRUCTURES + +#include +#include "guihandler.h" + +class BaseInfo +{ +protected: + void *extra; + GuiHandler *handler; + bool dataString; +public: + + bool hasEventHandler() const { + return handler != 0; + } + + bool handleEvent(gdioutput &gdi, GuiEventType type) { + if (handler) { + handler->handle(gdi, *this, type); + return true; + } + return false; + } + + BaseInfo():extra(0), dataString(false), handler(0) {} + virtual ~BaseInfo() {} + string id; + + virtual HWND getControlWindow() const = 0; + + virtual void refresh() { + InvalidateRect(getControlWindow(), 0, true); + } + + BaseInfo &setExtra(const char *e) {extra=(void *)e; dataString = true; return *this;} + + BaseInfo &setExtra(int e) {extra = (void *)(e); return *this;} + BaseInfo &setExtra(size_t e) {extra = (void *)(e); return *this;} + + bool isExtraString() const {return dataString;} + char *getExtra() const {assert(extra == 0 || dataString); return (char *)extra;} + int getExtraInt() const {return int(extra);} + size_t getExtraSize() const {return size_t(extra);} + + GuiHandler &getHandler() const; + BaseInfo &setHandler(const GuiHandler *h) {handler = const_cast(h); return *this;} + +}; + +class RestoreInfo : public BaseInfo +{ +public: + int nLBI; + int nBI; + int nII; + int nTL; + int nRect; + int nHWND; + int nData; + + int sCX; + int sCY; + int sMX; + int sMY; + int sOX; + int sOY; + + int nTooltip; + int nTables; + + GUICALLBACK onClear; + GUICALLBACK postClear; + + HWND getControlWindow() const {throw std::exception("Unsupported");} +}; + +class RectangleInfo : public BaseInfo +{ +private: + DWORD color; + DWORD color2; + bool drawBorder; + DWORD borderColor; + RECT rc; + + bool border3D; +public: + const RECT &getRect() const {return rc;} + RectangleInfo(): color(0), color2(0), borderColor(0), border3D(false), drawBorder(false) {memset(&rc, 0, sizeof(RECT));} + RectangleInfo &setColor(GDICOLOR c) {color = c; return *this;} + RectangleInfo &setColor2(GDICOLOR c) {color2 = c; return *this;} + RectangleInfo &set3D(bool is3d) {border3D = is3d; return *this;} + RectangleInfo &setBorderColor(GDICOLOR c) {borderColor = c; return *this;} + friend class gdioutput; + friend struct PageInfo; + + RectangleInfo &changeDimension(gdioutput &gdi, int dx, int dy); + + HWND getControlWindow() const {throw std::exception("Unsupported");} +}; + + +class TableInfo : public BaseInfo +{ +public: + TableInfo():xp(0), yp(0), table(0) {} + int xp; + int yp; + Table *table; + + HWND getControlWindow() const {throw std::exception("Unsupported");} +}; + + +class TextInfo : public BaseInfo +{ +public: + + TextInfo():format(0), color(0), xlimit(0), hasTimer(false), + hasCapture(false), callBack(0), highlight(false), + active(false), lineBreakPrioity(0), + absPrintX(0), absPrintY(0), realWidth(0) { + textRect.left = 0; textRect.right = 0; + textRect.top = 0; textRect.bottom = 0; + } + + TextInfo &setColor(GDICOLOR c) {color = c; return *this;} + TextInfo &changeFont(const string &fnt) {font = fnt; return *this;} //Note: size not updated + + int getHeight() {return int(textRect.bottom-textRect.top);} + gdiFonts getGdiFont() const {return gdiFonts(format & 0xFF);} + // Sets absolute print coordinates in [mm] + TextInfo &setAbsPrintPos(int x, int y) { + absPrintX = x; absPrintY = y; return *this; + } + string text; + string font; + + int xp; + int yp; + + int format; + DWORD color; + int xlimit; + int lineBreakPrioity; + int absPrintX; + int absPrintY; + + bool hasTimer; + DWORD zeroTime; + DWORD timeOut; + + bool hasCapture; + GUICALLBACK callBack; + RECT textRect; + int realWidth; // The calculated actual width of the string in pixels + bool highlight; + bool active; + + + HWND getControlWindow() const {throw std::exception("Unsupported");} +}; + +class ButtonInfo : public BaseInfo +{ +private: + bool originalState; + bool isEditControl; + bool checked; + bool *updateLastData; + void synchData() const {if (updateLastData) *updateLastData = checked;} + +public: + ButtonInfo(): callBack(0), hWnd(0), AbsPos(false), fixedRightTop(false), + flags(0), storedFlags(0), originalState(false), isEditControl(false), + isCheckbox(false), checked(false), updateLastData(0) {} + + ButtonInfo &isEdit(bool e) {isEditControl=e; return *this;} + + int xp; + int yp; + int width; + string text; + HWND hWnd; + bool AbsPos; + bool fixedRightTop; + int flags; + int storedFlags; + bool isCheckbox; + bool isDefaultButton() const {return (flags&1)==1;} + bool isCancelButton() const {return (flags&2)==2;} + + ButtonInfo &setSynchData(bool *variable) {updateLastData = variable; return *this;} + + + void moveButton(gdioutput &gdi, int xp, int yp); + void getDimension(gdioutput &gdi, int &w, int &h); + + ButtonInfo &setDefault(); + ButtonInfo &setCancel() {flags|=2, storedFlags|=2; return *this;} + ButtonInfo &fixedCorner() {fixedRightTop = true; return *this;} + GUICALLBACK callBack; + friend class gdioutput; + + HWND getControlWindow() const {return hWnd;} +}; + +enum gdiFonts; +class InputInfo : public BaseInfo +{ +public: + InputInfo(); + string text; + + bool changed() const {return text!=original;} + void ignore(bool ig) {ignoreCheck=ig;} + InputInfo &isEdit(bool e) {isEditControl=e; return *this;} + InputInfo &setBgColor(GDICOLOR c) {bgColor = c; return *this;} + InputInfo &setFgColor(GDICOLOR c) {fgColor = c; return *this;} + InputInfo &setFont(gdioutput &gdi, gdiFonts font); + GDICOLOR getBgColor() const {return bgColor;} + GDICOLOR getFgColor() const {return fgColor;} + + InputInfo &setPassword(bool pwd); + + HWND getControlWindow() const {return hWnd;} + + InputInfo &setSynchData(string *variable) {updateLastData = variable; return *this;} + + int getX() const {return xp;} + int getY() const {return yp;} + int getWidth() const {return int(width);} +private: + HWND hWnd; + GUICALLBACK callBack; + void synchData() const {if (updateLastData) *updateLastData = text;} + string *updateLastData; + int xp; + int yp; + double width; + double height; + + GDICOLOR bgColor; + GDICOLOR fgColor; + bool isEditControl; + bool writeLock; + string original; + string focusText; // Test when got focus + bool ignoreCheck; // True if changed-state should be ignored + friend class gdioutput; +}; + +class ListBoxInfo : public BaseInfo +{ +public: + ListBoxInfo() : hWnd(0), callBack(0), IsCombo(false), index(-1), + writeLock(false), ignoreCheck(false), isEditControl(true), + originalProc(0), lbiSync(0), multipleSelection(false), + xp(0), yp(0), width(0), height(0), data(0), lastTabStop(0), + updateLastData(0) {} + string text; + size_t data; + int index; + bool changed() const {return text!=original;} + void ignore(bool ig) {ignoreCheck=ig;} + ListBoxInfo &isEdit(bool e) {isEditControl=e; return *this;} + HWND getControlWindow() const {return hWnd;} + + void copyUserData(ListBoxInfo &userLBI) const; + ListBoxInfo &setSynchData(int *variable) {updateLastData = variable; return *this;} + int getWidth() const {return int(width);} + int getX() const {return xp;} + int getY() const {return yp;} + bool isCombo() const {return IsCombo;} +private: + void syncData() const {if (updateLastData) *updateLastData = data;} + bool IsCombo; + int *updateLastData; + + GUICALLBACK callBack; + + int xp; + int yp; + double width; + double height; + HWND hWnd; + int lastTabStop; + + bool multipleSelection; + bool isEditControl; + bool writeLock; + string original; + int originalIdx; + bool ignoreCheck; // True if changed-state should be ignored + + map data2Index; + + // Synchronize with other list box + WNDPROC originalProc; + ListBoxInfo *lbiSync; + + friend LRESULT CALLBACK GetMsgProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam); + friend class gdioutput; +}; + +class DataStore +{ +public: + string id; + void *data; +}; + +class EventInfo : public BaseInfo +{ +private: + string origin; + DWORD data; + KeyCommandCode keyEvent; +public: + KeyCommandCode getKeyCommand() const {return keyEvent;} + DWORD getData() const {return data;} + void setKeyCommand(KeyCommandCode kc) {keyEvent = kc;} + void setData(const string &origin_, DWORD d) {origin = origin_, data = d;} + const string &getOrigin() {return origin;} + EventInfo(); + GUICALLBACK callBack; + + HWND getControlWindow() const {throw std::exception("Unsupported");} +}; + +class TimerInfo : public BaseInfo +{ +private: + DWORD data; + gdioutput *parent; + TimerInfo(gdioutput *gdi, GUICALLBACK cb) : parent(gdi), callBack(cb) {} + +public: + BaseInfo &setExtra(void *e) {return BaseInfo::setExtra((const char *)e);} + + GUICALLBACK callBack; + friend class gdioutput; + friend void CALLBACK gdiTimerProc(HWND hWnd, UINT a, UINT_PTR ptr, DWORD b); + + HWND getControlWindow() const {throw std::exception("Unsupported");} +}; + + +class InfoBox : public BaseInfo +{ +public: + InfoBox() : callBack(0), HasCapture(0), HasTCapture(0), TimeOut(0) {} + string text; + GUICALLBACK callBack; + + RECT TextRect; + RECT Close; + RECT BoundingBox; + + bool HasCapture; + bool HasTCapture; + + DWORD TimeOut; + + HWND getControlWindow() const {throw std::exception("Unsupported");} +}; + +typedef list TIList; + +struct ToolInfo { + string name; + TOOLINFOW ti; + wstring tip; + int id; +}; + + +#endif diff --git a/code/generalresult.cpp b/code/generalresult.cpp new file mode 100644 index 0000000..aa0bcfa --- /dev/null +++ b/code/generalresult.cpp @@ -0,0 +1,1297 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ +#include "stdafx.h" + +#include +#include "generalresult.h" +#include "oEvent.h" +#include "meos_util.h" +#include "oListInfo.h" +#include "meosexception.h" +#include "localizer.h" + +GeneralResultCtr::GeneralResultCtr(const char *tagIn, const string &nameIn, GeneralResult *ptrIn) { + name = nameIn; + tag = tagIn; + ptr = ptrIn; +} + +GeneralResultCtr::GeneralResultCtr(string &file, DynamicResult *ptrIn) { + ptr = ptrIn; + name = ptrIn->getName(false); + tag = ptrIn->getTag(); + fileSource = file; +} + +GeneralResultCtr::~GeneralResultCtr() { + delete ptr; + ptr = 0; +} + +GeneralResultCtr::GeneralResultCtr(const GeneralResultCtr &ctr) { + ptr = ctr.ptr; + name = ctr.name; + tag = ctr.tag; + fileSource = ctr.fileSource; + ctr.ptr = 0; +} + +void GeneralResultCtr::operator=(const GeneralResultCtr &ctr) { + if (this == &ctr) + return; + delete ptr; + name = ctr.name; + ptr = ctr.ptr; + ctr.ptr = 0; +} + +bool GeneralResultCtr::isDynamic() const { + return !fileSource.empty(); +} + +GeneralResult::GeneralResult(void) { + context = 0; +} + +GeneralResult::~GeneralResult(void) { +} + +void GRINSTANCE() { + vector a; + vector b; + GeneralResult gr; + gr.sort(a, SortByFinishTime); + gr.sort(b, SortByFinishTime); +} + +void GeneralResult::setContext(const oListParam *contextIn) { + context = contextIn; +} + +void GeneralResult::clearContext() { + context = 0; +} + +int GeneralResult::getListParamTimeToControl() const { + if (context) + return context->useControlIdResultTo; + else + return 0; // No context in method editor +} + +int GeneralResult::getListParamTimeFromControl() const { + if (context) + return context->useControlIdResultFrom; + else + return 0; // No context in method editor +} + +struct GRSortInfo { + int principalSort; + int score; + oAbstractRunner *tr; + + bool operator<(const GRSortInfo &other) const { + if (principalSort != other.principalSort) + return principalSort < other.principalSort; + else if (score != other.score) + return score < other.score; + + const string &as = tr->getBib(); + const string &bs = other.tr->getBib(); + if (as != bs) + return compareBib(as, bs); + else + return tr->getName() < other.tr->getName(); + } +}; + +void GeneralResult::calculateTeamResults(vector &teams, oListInfo::ResultType resType, bool sortTeams, int inputNumber) const { + if (teams.empty()) + return; + prepareCalculations(*teams[0]->oe, true, inputNumber); + + //bool classSort = resType == oListInfo::Global ? false : true; + vector teamScore(teams.size()); + for (size_t k = 0; k < teams.size(); k++) { + if (resType == oListInfo::Classwise) { + teamScore[k].principalSort = teams[k]->Class ? teams[k]->Class->getSortIndex() * 50000 + + teams[k]->Class->getId() : 0; + } + else + teamScore[k].principalSort = 0; + + prepareCalculations(*teams[k]); + teams[k]->tmpResult.runningTime = teams[k]->getStartTime(); //XXX + teams[k]->tmpResult.runningTime = deduceTime(*teams[k]); + teams[k]->tmpResult.status = deduceStatus(*teams[k]); + teams[k]->tmpResult.points = deducePoints(*teams[k]); + + teamScore[k].score = score(*teams[k], teams[k]->tmpResult.status, + teams[k]->tmpResult.runningTime, + teams[k]->tmpResult.points); + + storeOutput(teams[k]->tmpResult.outputTimes, + teams[k]->tmpResult.outputNumbers); + + teamScore[k].tr = teams[k]; + + } + + ::sort(teamScore.begin(), teamScore.end()); + int place = 1; + int iPlace = 1; + int leadtime = 0; + for (size_t k = 0; k < teamScore.size(); k++) { + if (k>0 && teamScore[k-1].principalSort != teamScore[k].principalSort) { + place = 1; + iPlace = 1; + } + else if (k>0 && teamScore[k-1].score != teamScore[k].score) { + place = iPlace; + } + + if (teamScore[k].tr->tmpResult.status == StatusOK) { + teamScore[k].tr->tmpResult.place = place; + iPlace++; + if (place == 1) { + leadtime = teamScore[k].tr->tmpResult.runningTime; + teamScore[k].tr->tmpResult.timeAfter = 0; + } + else { + teamScore[k].tr->tmpResult.timeAfter = teamScore[k].tr->tmpResult.runningTime - leadtime; + } + } + else { + teamScore[k].tr->tmpResult.place = 0; + teamScore[k].tr->tmpResult.timeAfter = 0; + } + } + + if (sortTeams) { + for (size_t k = 0; k < teamScore.size(); k++) { + teams[k] = (oTeam *)teamScore[k].tr; + } + } +} + +void GeneralResult::sortTeamMembers(vector &runners) const { + vector runnerScore(runners.size()); + for (size_t k = 0; k < runners.size(); k++) { + runnerScore[k].principalSort = 0; + runnerScore[k].score = runners[k]->tmpResult.internalScore; + //runnerScore[k].score = score(*runners[k], runners[k]->tmpResult.status, + // runners[k]->tmpResult.runningTime, + // runners[k]->tmpResult.points); + + runnerScore[k].tr = runners[k]; + } + + ::sort(runnerScore.begin(), runnerScore.end()); + + for (size_t k = 0; k < runners.size(); k++) { + runners[k] = pRunner(runnerScore[k].tr); + } +} + +template void GeneralResult::sort(vector &rt, SortOrder so) const { + PrincipalSort ps = ClassWise; + + if (so == CourseResult) + ps = CourseWise; + + else if (so == SortByName || so == SortByFinishTimeReverse || + so == SortByFinishTime || so == SortByStartTime) + ps = None; + + vector< pair > arr(rt.size()); + const int maxT = 3600 * 100; + for(size_t k = 0; k < rt.size(); k++) { + arr[k].first = 0; + if (ps == ClassWise) + arr[k].first = rt[k]->getClassRef() ? rt[k]->getClassRef()->getSortIndex() : 0; + else if (ps == CourseWise) { + oRunner *r = dynamic_cast(rt[k]); + arr[k].first = r && r->getCourse(false) ? r->getCourse(false)->getId() : 0; + } + arr[k].second = rt[k]; + int ord = 0; + const oAbstractRunner::TempResult &tr = rt[k]->getTempResult(0); + if (so == SortByFinishTime || so == ClassFinishTime) { + ord = tr.getFinishTime(); + if (ord == 0 || tr.getStatus()>1) + ord = maxT; + } + else if (so == SortByFinishTimeReverse) { + ord = tr.getFinishTime(); + if (ord == 0 || tr.getStatus()>1) + ord = maxT; + else + ord = maxT - ord; + } + else if (so == SortByStartTime || so == ClassStartTime || + so == ClassStartTimeClub) { + ord = tr.getStartTime(); + } + + arr[k].first = arr[k].first * maxT * 10 + ord; + } + + stable_sort(arr.begin(), arr.end()); + + for(size_t k = 0; k < rt.size(); k++) { + rt[k] = (T*)arr[k].second; + } +} + +void GeneralResult::calculateIndividualResults(vector &runners, oListInfo::ResultType resType, bool sortRunners, int inputNumber) const { + + if (runners.empty()) + return; + prepareCalculations(*runners[0]->oe, false, inputNumber); + //bool classSort = resType == oListInfo::Global ? false : true; + vector runnerScore(runners.size()); + for (size_t k = 0; k < runners.size(); k++) { + const oRunner *r = runners[k]; + if (resType == oListInfo::Classwise) { + runnerScore[k].principalSort = r->Class ? r->Class->getSortIndex() * 50000 + + r->Class->getId() : 0; + } + else if (resType == oListInfo::Legwise) { + runnerScore[k].principalSort = r->Class ? r->Class->getSortIndex() * 50000 + + r->Class->getId() : 0; + + int ln = r->getLegNumber(); + const oTeam *pt = r->getTeam(); + if (pt) { + const oClass *tcls = pt->getClassRef(); + if (tcls && tcls->getClassType() == oClassRelay) { + int dummy; + tcls->splitLegNumberParallel(r->getLegNumber(), ln, dummy); + } + } + runnerScore[k].principalSort = runnerScore[k].principalSort * 50 + ln; + } + else + runnerScore[k].principalSort = 0; + + int from = getListParamTimeFromControl(); + if (from <= 0) { + runners[k]->tmpResult.startTime = r->getStartTime(); + } + else { + int rt; + RunnerStatus stat; + runners[k]->getSplitTime(from, stat, rt); + if (stat == StatusOK) + runners[k]->tmpResult.startTime = runners[k]->getStartTime() + rt; + else + runners[k]->tmpResult.startTime = runners[k]->getStartTime(); + } + prepareCalculations(*runners[k]); + runners[k]->tmpResult.runningTime = deduceTime(*runners[k], runners[k]->tmpResult.startTime); + runners[k]->tmpResult.status = deduceStatus(*runners[k]); + runners[k]->tmpResult.points = deducePoints(*runners[k]); + + runnerScore[k].score = score(*runners[k], runners[k]->tmpResult.status, + runners[k]->tmpResult.runningTime, + runners[k]->tmpResult.points, false); + + storeOutput(runners[k]->tmpResult.outputTimes, + runners[k]->tmpResult.outputNumbers); + + runnerScore[k].tr = runners[k]; + + } + + ::sort(runnerScore.begin(), runnerScore.end()); + int place = 1; + int iPlace = 1; + int leadtime = 0; + for (size_t k = 0; k < runnerScore.size(); k++) { + if (k>0 && runnerScore[k-1].principalSort != runnerScore[k].principalSort) { + place = 1; + iPlace = 1; + } + else if (k>0 && runnerScore[k-1].score != runnerScore[k].score) { + place = iPlace; + } + + if (runnerScore[k].tr->tmpResult.status == StatusOK) { + runnerScore[k].tr->tmpResult.place = place; + iPlace++; + if (place == 1) { + leadtime = runnerScore[k].tr->tmpResult.runningTime; + runnerScore[k].tr->tmpResult.timeAfter = 0; + } + else { + runnerScore[k].tr->tmpResult.timeAfter = runnerScore[k].tr->tmpResult.runningTime - leadtime; + } + } + else { + runnerScore[k].tr->tmpResult.place = 0; + runnerScore[k].tr->tmpResult.timeAfter = 0; + } + } + + if (sortRunners) { + for (size_t k = 0; k < runnerScore.size(); k++) { + runners[k] = (oRunner *)runnerScore[k].tr; + } + } +} + +void GeneralResult::prepareCalculations(oEvent &oe, bool prepareForTeam, int inputNumber) const { +} + +void GeneralResult::prepareCalculations(oTeam &team) const { + int nr = team.getNumRunners(); + for (int j = 0; j < nr; j++) { + pRunner r = team.getRunner(j); + if (r) { + prepareCalculations(*r); + r->tmpResult.runningTime = deduceTime(*r, r->getStartTime()); //XXX + r->tmpResult.status = deduceStatus(*r); + r->tmpResult.place = 0;//XXX? + r->tmpResult.timeAfter = 0;//XXX? + r->tmpResult.points = deducePoints(*r); + r->tmpResult.internalScore = score(*r, r->tmpResult.status, + r->tmpResult.runningTime, + r->tmpResult.points, true); + + storeOutput(r->tmpResult.outputTimes, + r->tmpResult.outputNumbers); + } + } +} + +void GeneralResult::prepareCalculations(oRunner &runner) const { + int from = getListParamTimeFromControl(); + runner.tmpResult.startTime = runner.getStartTime(); + + if (from>0) { + int rt; + RunnerStatus stat; + runner.getSplitTime(from, stat, rt); + if (stat == StatusOK) + runner.tmpResult.startTime += rt; + } +} + +void GeneralResult::storeOutput(vector ×, vector &numbers) const { +} + +int GeneralResult::score(oTeam &team, RunnerStatus st, int rt, int points) const { + return (100*RunnerStatusOrderMap[st] + team.getNumShortening()) * 900000 + rt; +} + +RunnerStatus GeneralResult::deduceStatus(oTeam &team) const { + return team.getStatus(); +} + +int GeneralResult::deduceTime(oTeam &team) const { + return team.getRunningTime(); +} + +int GeneralResult::deducePoints(oTeam &team) const { + return team.getRogainingPoints(false); +} + +int GeneralResult::score(oRunner &runner, RunnerStatus st, int time, int points, bool asTeamMember) const { + if (asTeamMember) { + return runner.getLegNumber(); + } + else + return (RunnerStatusOrderMap[st]*100 + runner.getNumShortening()) * 900000 + time; +} + +RunnerStatus GeneralResult::deduceStatus(oRunner &runner) const { + return runner.getStatus(); +} + +int GeneralResult::deduceTime(oRunner &runner, int startTime) const { + return runner.getRunningTime(); +} + +int GeneralResult::deducePoints(oRunner &runner) const { + return runner.getRogainingPoints(false); +} + +int ResultAtControl::score(oTeam &team, RunnerStatus st, int time, int points) const { + return GeneralResult::score(team, st, time, points); +} + +RunnerStatus ResultAtControl::deduceStatus(oTeam &team) const { + return GeneralResult::deduceStatus(team); +} + +int ResultAtControl::deduceTime(oTeam &team) const { + return GeneralResult::deduceTime(team); +} + +int ResultAtControl::deducePoints(oTeam &team) const { + return GeneralResult::deducePoints(team); +} + +int ResultAtControl::score(oRunner &runner, RunnerStatus st, int time, int points, bool asTeamMember) const { + if (asTeamMember) + return runner.getLegNumber(); + const int TK = 3600 * 100; + if (st == StatusOK) + return time; + else + return TK + st; +} + +RunnerStatus TotalResultAtControl::deduceStatus(oRunner &runner) const { + RunnerStatus singleStat = ResultAtControl::deduceStatus(runner); + if (singleStat != StatusOK) + return singleStat; + + RunnerStatus inputStatus = StatusOK; + if (runner.getTeam() && getListParamTimeFromControl() <= 0) { + // Only use input time when start time is used + const pTeam t = runner.getTeam(); + if (runner.getLegNumber()>0 && t->getClassRef()) { + // Find base leg + int legIx = runner.getLegNumber(); + const pClass cls = t->getClassRef(); + while (legIx > 0 && (cls->isParallel(legIx) || cls->isOptional(legIx))) + legIx--; + if (legIx > 0) + inputStatus = t->getLegStatus(legIx-1, true); + } + else { + inputStatus = t->getInputStatus(); + } + } + else { + inputStatus = runner.getInputStatus(); + } + + return inputStatus; // Single status is OK. +} + +int TotalResultAtControl::deduceTime(oRunner &runner, int startTime) const { + int singleTime = ResultAtControl::deduceTime(runner, startTime); + + if (singleTime == 0) + return 0; + + int inputTime = 0; + if (runner.getTeam() && getListParamTimeFromControl() <= 0) { + // Only use input time when start time is used + const pTeam t = runner.getTeam(); + if (runner.getLegNumber()>0 && t->getClassRef()) { + // Find base leg + int legIx = runner.getLegNumber(); + const pClass cls = t->getClassRef(); + while (legIx > 0 && (cls->isParallel(legIx) || cls->isOptional(legIx))) + legIx--; + if (legIx > 0) + inputTime = t->getLegRunningTime(legIx-1, true); + } + else { + inputTime = t->getInputTime(); + } + } + else { + inputTime = runner.getInputTime(); + } + + return singleTime + inputTime; +} + +int TotalResultAtControl::score(oRunner &runner, RunnerStatus st, int time, int points, bool asTeamMember) const { + if (asTeamMember) + return runner.getLegNumber(); + const int TK = 3600 * 100; + RunnerStatus inputStatus = StatusOK; + + if (runner.getTeam()) { + const pTeam t = runner.getTeam(); + if (runner.getLegNumber()>0) { + inputStatus = t->getLegStatus(runner.getLegNumber()-1, true); + } + else { + inputStatus = t->getInputStatus(); + } + } + else { + inputStatus = runner.getInputStatus(); + } + + if (st != StatusUnknown) + st = max(inputStatus, st); + + if (st == StatusOK) { + return time; + } + else + return TK + st; +} + +RunnerStatus ResultAtControl::deduceStatus(oRunner &runner) const { + int fc = getListParamTimeToControl(); + if (fc > 0) { + RunnerStatus stat; + int rt; + runner.getSplitTime(fc, stat, rt); + return stat; + } + RunnerStatus st = runner.getStatus(); + if (st == StatusUnknown && runner.getRunningTime() > 0) + return StatusOK; + return st; +} + +int ResultAtControl::deduceTime(oRunner &runner, int startTime) const { + int fc = getListParamTimeToControl(); + + if (fc > 0) { + RunnerStatus stat; + int rt; + runner.getSplitTime(fc, stat, rt); + + if (stat == StatusOK) + return runner.getStartTime() + rt - startTime; + } + else if (runner.getFinishTime() > 0) { + return runner.getFinishTime() - startTime; + } + + return 0; +} + +int ResultAtControl::deducePoints(oRunner &runner) const { + return 0; +} + +int DynamicResult::instanceCount = 0; +map DynamicResult::symb2Method; +map > DynamicResult::method2SymbName; + +DynamicResult::DynamicResult() { + builtIn = false; + readOnly = false; + isCompiled = false; + methods.resize(_Mlast); + instanceCount++; + + if (method2SymbName.empty()) { + addSymbol(MDeduceRStatus, "RunnerStatus", "Status calculation for runner"); + addSymbol(MDeduceRTime, "RunnerTime", "Time calculation for runner"); + addSymbol(MDeduceRPoints, "RunnerPoints", "Point calculation for runner"); + addSymbol(MRScore, "RunnerScore", "Result score calculation for runner"); + + addSymbol(MDeduceTStatus, "TeamStatus", "Status calculation for team"); + addSymbol(MDeduceTTime, "TeamTime", "Time calculation for team"); + addSymbol(MDeduceTPoints, "TeamPoints", "Point calculation for team"); + addSymbol(MTScore, "TeamScore", "Result score calculation for team"); + } +} + +DynamicResult::DynamicResult(const DynamicResult &resIn) { + instanceCount++; + isCompiled = false; + name = resIn.name; + tag = resIn.tag; + readOnly = false; + + description = resIn.description; + origin = resIn.origin; + timeStamp = resIn.timeStamp; + annotation = resIn.annotation; + builtIn = resIn.builtIn; + methods.resize(_Mlast); + for (size_t k = 0; k < methods.size(); k++) { + methods[k].source = resIn.methods[k].source; + methods[k].description = resIn.methods[k].description; + } +} + +void DynamicResult::operator=(const DynamicResult &resIn) { + isCompiled = false; + name = resIn.name; + tag = resIn.tag; + description = resIn.description; + origin = resIn.origin; + timeStamp = resIn.timeStamp; + annotation = resIn.annotation; + readOnly = resIn.readOnly; + builtIn = resIn.builtIn; + methods.resize(_Mlast); + for (size_t k = 0; k < methods.size(); k++) { + methods[k].source = resIn.methods[k].source; + methods[k].description = resIn.methods[k].description; + methods[k].pn = 0; + } + +} + +void DynamicResult::addSymbol(DynamicMethods method, const char *symb, const char *name) { + if (method2SymbName.count(method) || symb2Method.count(symb)) + throw meosException("Method symbol used"); + method2SymbName[method] = make_pair(symb, name); + symb2Method[symb] = method; +} + +DynamicResult::~DynamicResult() { + instanceCount--; + if (instanceCount == 0) { + method2SymbName.clear(); + symb2Method.clear(); + } +} + +DynamicResult::MethodInfo::MethodInfo() { + pn = 0; +} + +DynamicResult::MethodInfo::~MethodInfo() { +} + +const ParseNode *DynamicResult::getMethod(DynamicMethods method) const { + return methods[method].pn; +} + +const string &DynamicResult::getMethodSource(DynamicMethods method) const { + return methods[method].source; +} + +void DynamicResult::setMethodSource(DynamicMethods method, const string &source) { + methods[method].source = source; + methods[method].pn = 0; + methods[method].pn = parser.parse(source); +} + +RunnerStatus DynamicResult::toStatus(int status) const { + switch (status) { + case StatusUnknown: + return StatusUnknown; + case StatusOK: + return StatusOK; + case StatusMP: + return StatusMP; + case StatusDNF: + return StatusDNF; + case StatusDNS: + return StatusDNS; + case StatusNotCompetiting: + return StatusNotCompetiting; + case StatusDQ: + return StatusDQ; + case StatusMAX: + return StatusMAX; + default: + throw meosException("Unknown status code X#" + itos(status)); + } +} + +int DynamicResult::score(oTeam &team, RunnerStatus st, int time, int points) const { + if (getMethod(MTScore)) { + parser.addSymbol("ComputedTime", time); + parser.addSymbol("ComputedStatus", st); + parser.addSymbol("ComputedPoints", points); + return getMethod(MTScore)->evaluate(parser); + } + else if (getMethodSource(MTScore).empty()) + return GeneralResult::score(team, st, time, points); + else throw meosException("Syntax error"); +} + +RunnerStatus DynamicResult::deduceStatus(oTeam &team) const { + if (getMethod(MDeduceTStatus)) + return toStatus(getMethod(MDeduceTStatus)->evaluate(parser)); + else if (getMethodSource(MDeduceTStatus).empty()) + return GeneralResult::deduceStatus(team); + else throw meosException("Syntax error"); +} + +int DynamicResult::deduceTime(oTeam &team) const { + if (getMethod(MDeduceTTime)) + return getMethod(MDeduceTTime)->evaluate(parser); + else if (getMethodSource(MDeduceTTime).empty()) + return GeneralResult::deduceTime(team); + else throw meosException("Syntax error"); +} + +int DynamicResult::deducePoints(oTeam &team) const { + if (getMethod(MDeduceTPoints)) + return getMethod(MDeduceTPoints)->evaluate(parser); + else if (getMethodSource(MDeduceTPoints).empty()) + return GeneralResult::deducePoints(team); + else throw meosException("Syntax error"); +} + +int DynamicResult::score(oRunner &runner, RunnerStatus st, int time, int points, bool asTeamMember) const { + if (getMethod(MRScore)) { + parser.addSymbol("ComputedTime", time); + parser.addSymbol("ComputedStatus", st); + parser.addSymbol("ComputedPoints", points); + return getMethod(MRScore)->evaluate(parser); + } + else if (getMethodSource(MRScore).empty()) + return GeneralResult::score(runner, st, time, points, asTeamMember); + else throw meosException("Syntax error"); +} + +RunnerStatus DynamicResult::deduceStatus(oRunner &runner) const { + if (getMethod(MDeduceRStatus)) + return toStatus(getMethod(MDeduceRStatus)->evaluate(parser)); + else if (getMethodSource(MDeduceRStatus).empty()) + return GeneralResult::deduceStatus(runner); + else throw meosException("Syntax error"); +} + +int DynamicResult::deduceTime(oRunner &runner, int startTime) const { + if (getMethod(MDeduceRTime)) + return getMethod(MDeduceRTime)->evaluate(parser); + else if (getMethodSource(MDeduceRTime).empty()) + return GeneralResult::deduceTime(runner, startTime); + else throw meosException("Syntax error"); +} + +int DynamicResult::deducePoints(oRunner &runner) const { + if (getMethod(MDeduceRPoints)) + return getMethod(MDeduceRPoints)->evaluate(parser); + else if (getMethodSource(MDeduceRPoints).empty()) + return GeneralResult::deducePoints(runner); + else throw meosException("Syntax error"); + +} + +void DynamicResult::save(const string &file) const { + xmlparser xml(0); + xml.openOutput(file.c_str(), true); + save(xml); + xml.closeOut(); +} + +extern oEvent *gEvent; + +void DynamicResult::save(xmlparser &xml) const { + xml.startTag("MeOSResultCalculationSet"); + xml.write("Name", name); + xml.write("Tag", tag); + xml.write("Description", description); + if (origin.empty()) + origin = gEvent->getName() + " (" + getLocalDate() + ")"; + xml.write("Origin", origin); + xml.write("Date", getLocalTime()); +// xml.write("Tag", tag); +// xml.write("UID", getUniqueId()); + + for (map::const_iterator it = symb2Method.begin(); it != symb2Method.end(); ++it) { + if (!methods[it->second].source.empty()) { + xml.startTag("Rule", "name", it->first); + xml.write("Description", methods[it->second].description); + xml.write("Method", methods[it->second].source); + xml.endTag(); + } + } + xml.endTag(); +} + +void DynamicResult::clear() { + parser.clear(); + for (size_t k = 0; k < methods.size(); k++) { + methods[k].pn = 0; + methods[k].source.clear(); + methods[k].description.clear(); + } +} + +void DynamicResult::load(const string &file) { + xmlparser xml(0); + xml.read(file.c_str()); + xmlobject xDef = xml.getObject("MeOSResultCalculationSet"); + load(xDef); +} + +void DynamicResult::load(const xmlobject &xDef) { + if (!xDef) + throw meosException("Ogiltigt filformat"); + + clear(); + + xDef.getObjectString("Name", name); + xDef.getObjectString("Description", description); + xDef.getObjectString("Tag", tag); + + xDef.getObjectString("Origin", origin); + xDef.getObjectString("Date", timeStamp); + //xDef.getObjectString("UID", uniqueIndex); + xmlList rules; + xDef.getObjects("Rule", rules); + for (size_t k = 0; k < rules.size(); k++) { + string rn; + rules[k].getObjectString("name", rn); + map::const_iterator res = symb2Method.find(rn); + if (res == symb2Method.end()) + throw meosException("Unknown result rule X.#" + rn); + + rules[k].getObjectString("Description", methods[res->second].description); + rules[k].getObjectString("Method", methods[res->second].source); + } +} + +void DynamicResult::compile(bool forceRecompile) const { + if (isCompiled) + return; + + for (size_t k = 0; k < methods.size(); k++) { + methods[k].pn = 0; + } + parser.clear(); + + pair err; + for (size_t k = 0; k < methods.size(); k++) { + if (!methods[k].source.empty()) { + try { + methods[k].pn = parser.parse(methods[k].source); + } + catch (const meosException &ex) { + if (err.first.empty()) { + err.first = method2SymbName[DynamicMethods(k)].second; + err.second = lang.tl(ex.what()); + } + } + } + } + if (!err.first.empty()) { + throw meosException("Error in result module X, method Y (Z)#" + name + "#" + err.first + "#" + err.second); + } +} + +void DynamicResult::getMethodTypes(vector< pair > &mt) const { + mt.clear(); + for (map >::const_iterator it = method2SymbName.begin(); it != method2SymbName.end(); ++it) + mt.push_back(make_pair(it->first, it->second.second)); + + return; +} + +void DynamicResult::declareSymbols(DynamicMethods m, bool clear) const { + if (clear) + parser.clearSymbols(); + const bool isRunner = m == MRScore || + m == MDeduceRPoints || + m == MDeduceRStatus || + m == MDeduceRTime; + + parser.declareSymbol("Status", "Runner/team status", false); + parser.declareSymbol("Start", "Runner/team start time", false); + parser.declareSymbol("Finish", "Runner/team finish time", false); + parser.declareSymbol("Time", "Runner/team running time", false); + parser.declareSymbol("Place", "Runner/team place", false); + parser.declareSymbol("Points", "Runner/team rogaining points", false); + parser.declareSymbol("PointReduction", "Automatic rogaining point reduction", false); + parser.declareSymbol("PointOvertime", "Runner/team rogaining overtime", false); + parser.declareSymbol("PointGross", "Rogaining points before automatic reduction", false); + + parser.declareSymbol("PointAdjustment", "Runner/team rogaining points adjustment", false); + parser.declareSymbol("TimeAdjustment", "Runner/team time adjustment", false); + + parser.declareSymbol("TotalStatus", "Runner/team total status", false); + parser.declareSymbol("TotalTime", "Runner/team total running time", false); + parser.declareSymbol("TotalPlace", "Runner/team total place", false); + + parser.declareSymbol("InputStatus", "Runner/team input status", false); + parser.declareSymbol("InputTime", "Runner/team input running time", false); + parser.declareSymbol("InputPlace", "Runner/team input place", false); + parser.declareSymbol("InputPoints", "Runner/team input points", false); + + parser.declareSymbol("Fee", "Runner/team fee", false); + + parser.declareSymbol("ClubId", "Club id number", false); + parser.declareSymbol("DistrictId", "District id number", false); + parser.declareSymbol("Bib", "Nummerlapp", false); + + parser.declareSymbol("InputNumber", "User input number", false); + parser.declareSymbol("Shorten", "Number of shortenings", false); + + if (isRunner) { + parser.declareSymbol("CardPunches", "Runner's card, punch codes", true); + parser.declareSymbol("CardTimes", "Runner's card, punch times", true); + parser.declareSymbol("CardControls", "Runner's card, matched control ids (-1 for unmatched punches)", true); + + parser.declareSymbol("Course", "Runner's course", true); + parser.declareSymbol("CourseLength", "Length of course", false); + + parser.declareSymbol("SplitTimes", "Runner's split times", true); + parser.declareSymbol("SplitTimesAccumulated", "Runner's total running time to control", true); + + parser.declareSymbol("LegTimeDeviation", "Deviation +/- from expected time on course leg", true); + parser.declareSymbol("LegTimeAfter", "Time after leg winner", true); + parser.declareSymbol("LegPlace", "Place on course leg", true); + parser.declareSymbol("Leg", "Leg number in team, zero indexed", false); + parser.declareSymbol("BirthYear", "Year of birth", false); + } + else { + parser.declareSymbol("RunnerStatus", "Status for each team member", true); + parser.declareSymbol("RunnerTime", "Running time for each team member", true); + parser.declareSymbol("RunnerStart", "Start time for each team member", true); + parser.declareSymbol("RunnerFinish", "Finish time for each team member", true); + parser.declareSymbol("RunnerPoints", "Rogaining points for each team member", true); + + parser.declareSymbol("RunnerCardPunches", "Punch codes for each team member", true, true); + parser.declareSymbol("RunnerCardTimes", "Punch times for each team member", true, true); + parser.declareSymbol("RunnerCardControls", "Matched control ids (-1 for unmatched) for each team member", true, true); + + parser.declareSymbol("RunnerCourse", "Runner's course", true, true); + parser.declareSymbol("RunnerSplitTimes", "Runner's split times", true, true); + + parser.declareSymbol("RunnerOutputTimes", "Runner's method output times", true, true); + parser.declareSymbol("RunnerOutputNumbers", "Runner's method output numbers", true, true); + } + + parser.declareSymbol("MaxTime", "Maximum allowed running time", false); + + parser.declareSymbol("StatusUnknown", "Status code for an unknown result", false); + parser.declareSymbol("StatusOK", "Status code for a valid result", false); + parser.declareSymbol("StatusMP", "Status code for a missing punch", false); + parser.declareSymbol("StatusDNF", "Status code for not finishing", false); + parser.declareSymbol("StatusDNS", "Status code for not starting", false); + parser.declareSymbol("StatusMAX", "Status code for a time over the maximum", false); + parser.declareSymbol("StatusDQ", "Status code for disqualification", false); + parser.declareSymbol("StatusNotCompetiting", "Status code for not competing", false); + + parser.declareSymbol("ShortestClassTime", "Shortest time in class", false); + + if (m == MRScore || m == MTScore) { + parser.declareSymbol("ComputedTime", "Time as computed by your time method", false); + parser.declareSymbol("ComputedPoints", "Points as computed by your point method", false); + parser.declareSymbol("ComputedStatus", "Status as computed by your status method", false); + } +} + +void DynamicResult::getSymbols(vector< pair > &symb) const { + parser.getSymbols(symb); +} + +void DynamicResult::getSymbolInfo(int ix, string &name, string &desc) const { + parser.getSymbolInfo(ix, name, desc); +} + +void DynamicResult::prepareCalculations(oEvent &oe, bool prepareForTeam, int inputNumber) const { + compile(false); + oe.calculateResults(oEvent::RTClassResult); + oe.calculateResults(oEvent::RTTotalResult); + + declareSymbols(MRScore, true); + if (prepareForTeam) { + declareSymbols(MTScore, false); + vector t; + oe.getTeams(0, t, false); + for (size_t k = 0; k < t.size(); k++) + t[k]->resetResultCalcCache(); + + oe.calculateTeamResults(false); + oe.calculateTeamResults(true); + } + parser.addSymbol("StatusUnknown", StatusUnknown); + parser.addSymbol("StatusOK", StatusOK); + parser.addSymbol("StatusMP", StatusMP); + parser.addSymbol("StatusDNF", StatusDNF); + parser.addSymbol("StatusDNS", StatusDNS); + parser.addSymbol("StatusMAX", StatusMAX); + parser.addSymbol("StatusDQ", StatusDQ); + parser.addSymbol("StatusNotCompetiting", StatusNotCompetiting); + + parser.addSymbol("MaxTime", oe.getMaximalTime()); + parser.addSymbol("InputNumber", inputNumber); +} + +void DynamicResult::prepareCommon(oAbstractRunner &runner) const { + parser.clearVariables(); + int st = runner.getStatus(); + int ft = runner.getFinishTime(); + if (st == StatusUnknown && ft>0) + st = StatusOK; + parser.addSymbol("Status", st); + parser.addSymbol("Start", runner.getStartTime()); + parser.addSymbol("Finish", ft); + parser.addSymbol("Time", runner.getRunningTime()); + parser.addSymbol("Place", runner.getPlace()); + parser.addSymbol("Points", runner.getRogainingPoints(false)); + parser.addSymbol("PointReduction", runner.getRogainingReduction()); + parser.addSymbol("PointOvertime", runner.getRogainingOvertime()); + parser.addSymbol("PointGross", runner.getRogainingPointsGross()); + + parser.addSymbol("PointAdjustment", runner.getPointAdjustment()); + parser.addSymbol("TimeAdjustment", runner.getTimeAdjustment()); + + parser.addSymbol("TotalStatus", runner.getTotalStatus()); + parser.addSymbol("TotalTime", runner.getTotalRunningTime()); + parser.addSymbol("TotalPlace", runner.getTotalPlace()); + + parser.addSymbol("InputStatus", runner.getInputStatus()); + parser.addSymbol("InputTime", runner.getInputTime()); + parser.addSymbol("InputPlace", runner.getInputPlace()); + parser.addSymbol("InputPoints", runner.getInputPoints()); + parser.addSymbol("Shorten", runner.getNumShortening()); + + parser.addSymbol("Fee", runner.getDCI().getInt("Fee")); + + const pClub pc = runner.getClubRef(); + if (pc) { + parser.addSymbol("ClubId", pc->getId()); + parser.addSymbol("DistrictId", pc->getDCI().getInt("District")); + } + else { + parser.addSymbol("ClubId", 0); + parser.addSymbol("DistrictId", 0); + } + parser.addSymbol("Bib", atoi(runner.getBib().c_str())); +} + +void DynamicResult::prepareCalculations(oTeam &team) const { + GeneralResult::prepareCalculations(team); + prepareCommon(team); + int nr = team.getNumRunners(); + vector status(nr), time(nr), start(nr), finish(nr), points(nr); + vector< vector > runnerOutputTimes(nr); + vector< vector > runnerOutputNumbers(nr); + + for (int k = 0; k < nr; k++) { + pRunner r = team.getRunner(k); + if (r) { + oAbstractRunner::TempResult &res = r->getTempResult(); + status[k] = res.getStatus(); + time[k] = res.getRunningTime(); + if (time[k] > 0 && status[k] == StatusUnknown) + status[k] = StatusOK; + start[k] = res.getStartTime(); + finish[k] = res.getFinishTime(); + points[k] = res.getPoints(); + runnerOutputTimes[k] = res.outputTimes; + runnerOutputNumbers[k] = res.outputNumbers; + } + } + parser.removeSymbol("CardControls"); + parser.removeSymbol("CardPunches"); + parser.removeSymbol("CardTimes"); + parser.removeSymbol("Course"); + parser.removeSymbol("CourseLength"); + parser.removeSymbol("LegPlace"); + parser.removeSymbol("LegTimeAfter"); + parser.removeSymbol("LegTimeDeviation"); + parser.removeSymbol("Leg"); + parser.removeSymbol("SplitTimes"); + parser.removeSymbol("SplitTimesAccumulated"); + parser.removeSymbol("LegTimeDeviation"); + parser.removeSymbol("BirthYear"); + + parser.addSymbol("RunnerOutputNumbers", runnerOutputNumbers); + parser.addSymbol("RunnerOutputTimes", runnerOutputTimes); + + parser.addSymbol("RunnerStatus", status); + parser.addSymbol("RunnerTime", time); + parser.addSymbol("RunnerStart", start); + parser.addSymbol("RunnerFinish", finish); + parser.addSymbol("RunnerPoints", points); + + parser.addSymbol("RunnerCardPunches", team.getResultCache(oTeam::RCCCardPunches)); + parser.addSymbol("RunnerCardTimes", team.getResultCache(oTeam::RCCCardTimes)); + parser.addSymbol("RunnerCardControls", team.getResultCache(oTeam::RCCCardControls)); + + parser.addSymbol("RunnerCourse", team.getResultCache(oTeam::RCCCourse)); + parser.addSymbol("RunnerSplitTimes", team.getResultCache(oTeam::RCCSplitTime)); + + pClass cls = team.getClassRef(); + if (cls) { + int nl = max(1, cls->getNumStages()-1); + parser.addSymbol("ShortestClassTime", cls->getTotalLegLeaderTime(nl, false)); + + } +} + +void DynamicResult::prepareCalculations(oRunner &runner) const { + GeneralResult::prepareCalculations(runner); + prepareCommon(runner); + pCard pc = runner.getCard(); + if (pc) { + vector punches; + pc->getPunches(punches); + int np = 0; + for (size_t k = 0; k < punches.size(); k++) { + if (punches[k]->getTypeCode() >= 30) + np++; + } + vector times(np); + vector codes(np); + vector controls(np); + int ip = 0; + for (size_t k = 0; k < punches.size(); k++) { + if (punches[k]->getTypeCode() >= 30) { + times[ip] = punches[k]->getAdjustedTime(); + codes[ip] = punches[k]->getTypeCode(); + controls[ip] = punches[k]->isUsedInCourse() ? punches[k]->getControlId() : -1; + ip++; + } + } + parser.addSymbol("CardPunches", codes); + parser.addSymbol("CardTimes", times); + parser.addSymbol("CardControls", controls); + + pTeam t = runner.getTeam(); + if (t) { + int leg = runner.getLegNumber(); + t->setResultCache(oTeam::RCCCardTimes, leg, times); + t->setResultCache(oTeam::RCCCardPunches, leg, codes); + t->setResultCache(oTeam::RCCCardControls, leg, controls); + } + } + else { + vector e; + parser.addSymbol("CardPunches", e); + parser.addSymbol("CardTimes", e); + parser.addSymbol("CardControls", e); + } + + pCourse crs = runner.getCourse(true); + const vector &sp = runner.getSplitTimes(false); + + if (crs) { + vector eCrs; + vector eSplitTime; + vector eAccTime; + eCrs.reserve(crs->getNumControls()); + eSplitTime.reserve(crs->getNumControls()); + eAccTime.reserve(crs->getNumControls()); + int start = runner.getStartTime(); + int st = runner.getStartTime(); + for (int k = 0; k < crs->getNumControls(); k++) { + pControl ctrl = crs->getControl(k); + if (ctrl->isSingleStatusOK()) { + eCrs.push_back(ctrl->getFirstNumber()); + if (size_t(k) < sp.size()) { + if (sp[k].status == SplitData::OK) { + eAccTime.push_back(sp[k].time-start); + eSplitTime.push_back(sp[k].time-st); + st = sp[k].time; + } + else if (sp[k].status == SplitData::NoTime) { + eAccTime.push_back(st-start); + eSplitTime.push_back(0); + } + else if (sp[k].status == SplitData::Missing) { + eAccTime.push_back(0); + eSplitTime.push_back(-1); + } + } + } + } + if (runner.getFinishTime() > 0) { + eAccTime.push_back(runner.getFinishTime()-start); + eSplitTime.push_back(runner.getFinishTime()-st); + } + else if (!eAccTime.empty()) { + eAccTime.push_back(0); + eSplitTime.push_back(-1); + } + + parser.addSymbol("CourseLength", crs->getLength()); + parser.addSymbol("Course", eCrs); + parser.addSymbol("SplitTimes", eSplitTime); + parser.addSymbol("SplitTimesAccumulated", eAccTime); + pTeam t = runner.getTeam(); + if (t) { + int leg = runner.getLegNumber(); + t->setResultCache(oTeam::RCCCourse, leg, eCrs); + t->setResultCache(oTeam::RCCSplitTime, leg, eSplitTime); + } + } + else { + vector e; + parser.addSymbol("CourseLength", -1); + parser.addSymbol("Course", e); + parser.addSymbol("SplitTimes", e); + parser.addSymbol("SplitTimesAccumulated", e); + } + + pClass cls = runner.getClassRef(); + if (cls) { + int nl = runner.getLegNumber(); + parser.addSymbol("ShortestClassTime", cls->getBestLegTime(nl)); + } + vector delta; + vector place; + vector after; + runner.getSplitAnalysis(delta); + runner.getLegTimeAfter(after); + runner.getLegPlaces(place); + + parser.addSymbol("LegTimeDeviation", delta); + parser.addSymbol("LegTimeAfter", after); + parser.addSymbol("LegPlace", place); + parser.addSymbol("Leg", runner.getLegNumber()); + parser.addSymbol("BirthYear", runner.getBirthYear()); +} + +void DynamicResult::storeOutput(vector ×, vector &numbers) const { + parser.takeVariable("OutputTimes", times); + parser.takeVariable("OutputNumbers", numbers); +} + +int checksum(const string &str); + +long long DynamicResult::getHashCode() const { + long long hc = 1; + for (size_t k = 0; k < methods.size(); k++) { + hc = hc * 997 + checksum(methods[k].source); + } + return hc; +} + +string DynamicResult::undecorateTag(const string &inputTag) { + int ix = inputTag.rfind("-v"); + if (ix > 0 && ix != inputTag.npos) + return inputTag.substr(0, ix); + else + return inputTag; +} + +string DynamicResult::getName(bool withAnnotation) const { + if (annotation.empty() || !withAnnotation) + return name; + else + return name + " (" + annotation + ")"; +} + +void DynamicResult::debugDumpVariables(gdioutput &gdi, bool includeSymbols) const { + gdi.fillDown(); + gdi.dropLine(); + int c1 = gdi.getCX(); + int c2 = c1 + gdi.scaleLength(170); + if (includeSymbols) { + gdi.addString("", 1, "Symboler"); + parser.dumpSymbols(gdi, c1, c2); + gdi.dropLine(); + } + else { + gdi.addString("", 1, "Variabler"); + parser.dumpVariables(gdi, c1, c2); + gdi.dropLine(); + } +} diff --git a/code/generalresult.h b/code/generalresult.h new file mode 100644 index 0000000..75b3e6e --- /dev/null +++ b/code/generalresult.h @@ -0,0 +1,221 @@ +#pragma once + +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "oBase.h" +#include "parser.h" +#include "oListInfo.h" + +class oAbstractRunner; +class oTeam; +class oRunner; +struct oListParam; +class xmlparser; +class xmlobject; + +class GeneralResult +{ +private: + const oListParam *context; + +protected: + + enum PrincipalSort {None, ClassWise, CourseWise}; + + virtual PrincipalSort getPrincipalSort() const {return ClassWise;} + + virtual int score(oTeam &team, RunnerStatus st, int time, int points) const; + virtual RunnerStatus deduceStatus(oTeam &team) const; + virtual int deduceTime(oTeam &team) const; + virtual int deducePoints(oTeam &team) const; + + virtual int score(oRunner &runner, RunnerStatus st, int time, int points, bool asTeamMember) const; + virtual RunnerStatus deduceStatus(oRunner &runner) const; + virtual int deduceTime(oRunner &runner, int startTime) const; + virtual int deducePoints(oRunner &runner) const; + + virtual void prepareCalculations(oEvent &oe, bool prepareForTeam, int inputNumber) const; + virtual void prepareCalculations(oTeam &team) const; + virtual void prepareCalculations(oRunner &runner) const; + virtual void storeOutput(vector ×, vector &numbers) const; + + int getListParamTimeToControl() const; + int getListParamTimeFromControl() const; + +public: + + void setContext(const oListParam *context); + void clearContext(); + + void calculateTeamResults(vector &teams, oListInfo::ResultType resType, bool sortTeams, int inputNumber) const; + void calculateIndividualResults(vector &runners, oListInfo::ResultType resType, bool sortRunners, int inputNumber) const; + void sortTeamMembers(vector &runners) const; + + template void sort(vector &rt, SortOrder so) const; + + GeneralResult(void); + virtual ~GeneralResult(void); +}; + +class ResultAtControl : public GeneralResult { +protected: + int score(oTeam &team, RunnerStatus st, int time, int points) const; + RunnerStatus deduceStatus(oTeam &team) const; + int deduceTime(oTeam &team) const; + int deducePoints(oTeam &team) const; + + int score(oRunner &runner, RunnerStatus st, int time, int points, bool asTeamMember) const; + RunnerStatus deduceStatus(oRunner &runner) const; + int deduceTime(oRunner &runner, int startTime) const; + int deducePoints(oRunner &runner) const; +}; + +class TotalResultAtControl : public ResultAtControl { +protected: + int deduceTime(oRunner &runner, int startTime) const; + RunnerStatus deduceStatus(oRunner &runner) const; + int score(oRunner &runner, RunnerStatus st, int time, int points, bool asTeamMember) const; +}; + +class DynamicResult : public GeneralResult { +public: + + enum DynamicMethods { + MTScore, + MDeduceTStatus, + MDeduceTTime, + MDeduceTPoints, + + MRScore, + MDeduceRStatus, + MDeduceRTime, + MDeduceRPoints, + _Mlast + }; + +private: + + static map symb2Method; + static map > method2SymbName; + static int instanceCount; + + class MethodInfo { + string source; + mutable ParseNode *pn; + string description; + public: + friend class DynamicResult; + MethodInfo(); + ~MethodInfo(); + }; + + vector methods; + mutable bool isCompiled; + mutable Parser parser; + string name; + string tag; + string description; + string annotation; + mutable string origin; + string timeStamp; + bool builtIn; + mutable bool readOnly; + + + const ParseNode *getMethod(DynamicMethods method) const; + void addSymbol(DynamicMethods method, const char *symb, const char *name); + RunnerStatus toStatus(int status) const; + + void prepareCommon(oAbstractRunner &runner) const; + + static string getInternalPath(const string &tag); +public: + + void setReadOnly() const {readOnly = true;} + + bool isReadOnly() const {return readOnly;} + + const string &getTimeStamp() const {return timeStamp;} + + static string undecorateTag(const string &inputTag); + + long long getHashCode() const; + + void getSymbols(vector< pair > &symb) const; + void getSymbolInfo(int ix, string &name, string &desc) const; + + void declareSymbols(DynamicMethods m, bool clear) const; + + void prepareCalculations(oEvent &oe, bool prepareForTeam, int inputNumber) const; + void prepareCalculations(oTeam &team) const; + void prepareCalculations(oRunner &runner) const; + void storeOutput(vector ×, vector &numbers) const; + + int score(oTeam &team, RunnerStatus st, int time, int points) const; + RunnerStatus deduceStatus(oTeam &team) const; + int deduceTime(oTeam &team) const; + int deducePoints(oTeam &team) const; + + int score(oRunner &runner, RunnerStatus st, int time, int points, bool asTeamMember) const; + RunnerStatus deduceStatus(oRunner &runner) const; + int deduceTime(oRunner &runner, int startTime) const; + int deducePoints(oRunner &runner) const; + + DynamicResult(); + DynamicResult(const DynamicResult &resIn); + void operator=(const DynamicResult &ctr); + + ~DynamicResult(); + + bool hasMethod(DynamicMethods method) const {return getMethod(method) != 0;} + + + const string &getMethodSource(DynamicMethods method) const; + void setMethodSource(DynamicMethods method, const string &source); + + void getMethodTypes(vector< pair > &mt) const; + //const string &getMethodName(DynamicMethods method) const; + + const string &getTag() const {return tag;} + void setTag(const string &t) {tag = t;} + void setBuiltIn() {builtIn = true;} + bool isBuiltIn() const {return builtIn;} + string getName(bool withAnnotation) const; + void setName(const string &n) {name = n;} + void setAnnotation(const string &a) {annotation = a;} + const string &getDescription() const {return description;} + void setDescription(const string &n) {description = n;} + + void save(const string &file) const; + void save(xmlparser &xml) const; + + void load(const string &file); + void load(const xmlobject &xDef); + + void compile(bool forceRecompile) const; + + void debugDumpVariables(gdioutput &gdi, bool includeSymbols) const; + + void clear(); +}; + diff --git a/code/german.lng b/code/german.lng new file mode 100644 index 0000000..d6b52f7 --- /dev/null +++ b/code/german.lng @@ -0,0 +1,1027 @@ +%s m = %s m +%s meter = %s Meter +%s, block: %d = %s, Block: %d +X: Y. Tryck för att spara = X: Y. Zum Speichern Eingabetaste drücken +(lokalt) = (Lokal) +(okänd) stämplade vid = (Unbekannt) stempelte bei +(på server) = (am Server) +(sekunder) = (Sekunden) +Föregående = Vorhergehende +Lägg till = Hinzufügen +Lägg till alla = Alle hinzufügen +Lägg till stämpling = Stempel hinzufügen +ALLA( = Alle( +API-nyckel = API-Schlüssel +Adress = Adresse +Adress och kontakt = Adresse und Kontakt +Aktivera = Aktivieren +Alla deltagare måste ha ett namn = Alle Teilnehmer müssen einen Namen haben +Alla fakturor = Alle Rechnungen +Alla händelser = Alle Ereignisse +Alla lag måste ha ett namn = Alle Teams müssen einen Namen haben +Alla listor = Alle Listen +Alla lopp = Alle Läufe +Alla sträckor/lopp i separata filer = Alle Strecken/Läufe in seperaten Dateien +Alla typer = Alle Arten +Andel vakanser = Anteil an Vakantplätzen +Ange första nummerlappsnummer eller lämna blankt för inga nummerlappar = Erste Startnummer angeben; leer lassen wenn keine Startnummern verwendet werden +Ange om kontrollen fungerar och hur den ska användas = Gebe an ob der Posten funktioniert und wie er verwendet werden soll +Anm. avg. = Nenng. +Anm. avgift = Nenngeld +Anm. datum = Angemeldet am +Anmälda = Nennungen +Anmälda per distrikt = Nennungen nach Region/Bundesland +Anmälningar = Nennungen +Anmälningar (IOF (xml) eller OE-CSV) = Nennungen (IOF (xml) oder OE-CSV) +Anmälningsavgift = Nenngeld +Anmälningsläge = Schneller Eingabemodus +Anslut = Verbinden +Anslut till en server = Verbindung mit einem Server herstellen +Ansluten till = Verbunden mit +Ansluter till Internet = Verbindet mit Internet +Anslutna klienter = Verbundene Klienten +Anslutningar = Verbindungen +Anslutningsinställningar = Verbindungseinstellungen +Antal = Anzahl +Antal besökare X, genomsnittlig bomtid Y, största bomtid Z = Anzahl Besucher X, durchschnittliche Fehlerzeit Y, größte Fehlerzeit Z +Antal ignorerade: X = Anzahl ignorierte Nennungen: X +Antal importerade = Anzahl importiert +Antal kartor = Anzahl Karten +Antal klasser = Anzahl Kategorien +Antal löpare = Anzahl Läufer +Antal misslyckade: X = Anzahl fehlgeschlagen: X +Antal startande per block = Anzahl Starter pro Startblock +Antal startande per intervall (inklusive redan lottade) = Anzahl Starter pro Intervall (inklusive bereits geloste) +Antal sträckor = Streckenanzahl +Antal vakanser = Anzahl Vakantplätze +Antal: %d = Anzahl: %d +Antal: X = Anzahl: X +Antalet rader i urklipp får inte plats i selektionen = Die Anzahl der Zeilen in der Zwischenablage passt nicht in die Auswahl +Använd Eventor = Eventor verwenden +Använd banpool = Bahnenpool verwenden +Använd löpardatabasen = Läuferdatenbank verwenden +Använd speakerstöd = Speakerunterstützung verwenden +Använd stor font = Große Schrift verwenden +Användarnamn = Benutzername +Arrangör = Veranstalter +Att betala = Offen +Att betala: X = Offen: X +Automater = Dienste +Automatisera = Automatisch +Automatisk lottning = Automatische Auslosung +Automatisk utskrift = Automatischer Druck +Automatisk utskrift / export = Automatischer Druck / Export +Av MeOS: www.melin.nu/meos = von MeOS: www.melin.nu/meos +Avancerat = Erweitert +Avbryt = Abbrechen +Avgift = Gebühr +Avgifter = Gebühren +Avgiftshöjning (procent) = Gebührenerhöhung (Prozent) +Avgjorda klasser (prisutdelningslista) = Fertige Kategorien (Siegerehrungsliste) +Avgjorda placeringar - %s = Endgültige Platzierungen - %s +Avgörande händelser = Entscheidende Ereignisse +Avgörs kl = Entschieden um +Avläsning/radiotider = Auslesen/Funkposten +Avmarkera allt = Alles demarkieren +Avrundad tävlingsavgift = Wettkampfgebühr, gerundet +Avsluta = Beenden +Bana = Bahn +Bana %d = Bahn %d +Banan används och kan inte tas bort = Die Bahn ist in Verwendung und kann nicht gelöscht werden +Banan måste ha ett namn = Die Bahn muss einen Namen haben +Banmall = Bahnvorlage +Banor = Bahnen +Banor (antal kontroller) = Bahnen (Anzahl Posten) +Banor för %s, sträcka %d = Bahnen für %s, Strecke %d +Banpool = Bahnenpool +Banpool, gemensam start = Bahnenpool, Massenstart +Banpool, lottad startlista = Bahnenpool, geloste Startliste +Bantilldelning = Bahnzuordnung +Bantilldelning, individuell = Bahnzuordnung, Einzel +Bantilldelning, stafett = Bahnzuordnung, Staffel +Bantilldelningslista - %s = Zugeordnete Bahnen - %s +Basintervall (min) = Basisintervall (min) +Begränsa antal per klass = Limitiere Anzahl pro Kategorie +Begränsa per klass = Limitiere pro Kategorie +Begränsning, antal visade per klass = Max. Anzahl angezeigte pro Kategorie +Behandlar löpardatabasen = Läuferdatenbank wird verarbeitet +Behandlar tävlingsdata = Wettkampfdaten werden verarbeitet +Bekräfta att %s byter klass till %s = Bitte bestätige, dass %s zur Kategorie %s wechselt +Bekräfta att deltagaren har lämnat återbud = Bitte bestätige, dass sich dieser Läufer abgemeldet hat +Betalat = Bezahlt +Betalningsinformation = Bezahlungsinformationen + +Bevakar händelser i X = Beobachte Ereignisse in X +Bevakningsprioritering = Wähle Läufer zum Beobachten + +Block = Block +Bläddra = Blättern +Bomfritt lopp / underlag saknas = Fehlerfreier Lauf / Daten fehlen +Bommade kontroller = Posten mit Fehlern +Bomtid = Zeit verloren +Bricka = SI-Card +Bricka %d används redan av %s och kan inte tilldelas = SI-Card %d ist in Verwendung von %s und kann nicht zugeteilt werden +Brickan redan inläst = SI-Card wurde bereits eingelesen +Brickhyra = Leihgebühr +Brickor = SI-Cards +Bygg databaser = Erstelle Datenbanken +COM-Port = COM-Schnittstelle +Databasanslutning = Datenbankverbindung +Datorröst som läser upp förvarningar = Computerstimme liest Läufer bei Funkposten vor +Datum = Datum +Dela = Teilen +Deltagare = Teilnehmer +Deltagare %d = Teilnehmer %d +Deltagaren 'X' deltar i patrullklassen 'Y' men saknar patrull. Klassens start- och resultatlistor kan därmed bli felaktiga = 'X' startet in der Paarlaufkategorie 'Y', hat aber keinen Partner. Das Ergebnis in dieser Kategorie kann daher fehlerhaft sein +Deltagaren 'X' deltar i stafettklassen 'Y' men saknar lag. Klassens start- och resultatlistor kan därmed bli felaktiga = 'X' startet in der Staffelkategorie 'Y', hat aber kein Team. Das Ergebnis in dieser Kategorie kann daher fehlerhaft sein +Deltagaren 'X' saknar klass = 'X' ist keiner Kategorie zugeteilt +Destinationskatalog = Zielordner +Det här programmet levereras utan någon som helst garanti. Programmet är = Dieses Programm kommt ohne jegliche Garantie. +Direktanmälan = Direktanmeldung +Disk. = Disqu. +Distriktskod = Regionnummer +Du kan importera banor och klasser från OCADs exportformat = Bahnen und Kategorie können aus OCAD exportiert und in MeOS importiert werden +Du måste välja en klass = Es muss eine Kategorie ausgewählt werden +E-post = E-Mail +Efter = Rückstand +Efteranmälda (efter ordinarie) = Nachnennungen (hinten) +Efteranmälda (före ordinarie) = Nachnennungen (vorne) +Efteranmälda före ordinarie = Nachnennungen vorne +Egen listrubrik = Benutzerdefinierter Titel +Eget fönster = Neues Fenster +Ej lottade = Nicht geloste +Ej lottade, efter = Nicht geloste, hinten +Ej lottade, före = Nicht geloste, vorne +Ej start = Nicht Ang. +Ej tidtagning = Ohne Zeitnehmung +Ekonomisk sammanställning = Gebührenübersicht +Elit = Elite +Elitavgift = Elitegebühr +Elitklasser = Elitekategorien +En klubb kan inte slås ihop med sig själv = Ein Verein kann nicht mit sich selbst zusammengefügt werden +Endast en bana = Nur eine Bahn +Enhetstyp = Einheit +Eventorkoppling = Eventorverbindung +Export av resultat/sträcktider = Ergebnisse/Zwischenzeiten exportieren +Exportera = Exportieren +Exportera / Säkerhetskopiera = Exportieren / Sicherheitskopie erstellen +Exportera datafil = Daten exportieren +Exportera inställningar och löpardatabaser = Einstellungen und Datenbanken exportieren +Exportera löpardatabas = Läuferdatenbank exportieren +Exportera nu = Jetzt exportieren +Exportera resultat på fil = Ergebnisse exportieren und als Datei speichern +Exportera startlista på fil = Startliste exportieren und als Datei speichern +Exportera sträcktider = Zwischenzeiten exportieren +Exportera tävlingsdata = Wettkampfdaten exportieren +Externt Id = Externe ID +Extra = Extra +Extra stämplingar = Zusätzliche Stempel +Extralöparstafett = Staffel mit zusätzlichen Läufern auf einer Strecke +FAKTURA = RECHNUNG +FEL, inget svar = Fehler, keine Antwort +FEL: Porten kunde inte öppnas = Fehler: Schnittstelle konnte nicht geöffnet werden +Failed to generate card = Cardgenerierung fehlgeschlagen +Faktura = Rechnung +Faktura nr = Rechnungsnummer +Faktureras = Wird in Rechnung gestellt +Fakturor = Rechnungen +Fel: X = Fehler: X +Fel: hittar inte filen X = Fehler. Datei nicht gefunden 'X' +Felaktig kontroll = Falscher Posten +Felaktig nyckel = Falscher Schlüssel +Felaktig sträcka = Falsche Strecke +Felaktigt filformat = Ungültiges Dateiformat +Felst. = Fehlst. +Fil att exportera till = Datei zum Exportieren +Fil: X = Datei: X +Filnamn = Dateiname +Filnamn (OCAD banfil) = Dateinahme (OCAD Bahndatei) +Filnamn IOF (xml) med klubbar = Dateiname IOF (xml) mit Vereinen +Filnamn IOF (xml) med löpare = Dateiname IOF (xml) mit Läufern +Filnamnet får inte vara tomt = Der Dateiname darf nicht leer sein +Filtrering = Filterung +Flera banor = Mehrere Bahnen +Flera banor / stafett / patrull / banpool = Mehrere Bahnen / Staffel / Paarlauf / Bahnenpool +Flera banor/stafett = Mehrere Bahnen / Staffel +Formulärläge = Formularmodus +Fortsätt = Fortsetzen +Fri anmälningsimport = Freier Nennungsimport +Fria starttider = Freie Startzeiten +Från kontroll = Ab Posten +Till kontroll = Bis Posten +Funktioner = Funktionen +Födelseår = Geburtsjahr +För att ändra måltiden måste löparens målstämplingstid ändras = Um die Zielzeit zu ändern muss die Zielstempelzeit des Läufers geändert werden +För många kontroller = Zu viele Posten +Fördefinierade tävlingsformer = Vorgegebene Wettkampfformen +Fördela starttider = Startzeiten verteilen +Förhandsgranskning, import = Vorschau (Import) +Förhöjd avgift = Nachnenngebühr +Först-i-mål, gemensam = Massenstart +Först-i-mål, klassvis = Massenstart nach Kategorien +Första (ordinarie) start = Erster Start +Första ordinarie starttid = Erste (normale) Startzeit +Första start = Erste Startzeit +Första sträckan kan inte vara parallell = Die erste Strecke kann nicht parallel sein +Försöket misslyckades = Der Versuch ist fehlgeschlagen +Förvarning på (SI-kod): alla stämplingar = Vorwarnung bei (SI-Nummer): allen Stempeln +Förvarningsröst = Stimme bei Vorwarnung +Förväntad andel efteranmälda = Erwartete Anzahl Nachnennungen +Gata = Straße +Gemensam start = Massenstart +Generera = Erstellen +Generera testtävling = Testwettkampf erstellen +Genererad = Erstellt um +Geografisk fördelning = Geographische Verteilung +Godkänd API-nyckel = API-Schlüssel akzeptiert +Granska inmatning = Vorschau +Grund avg. = Grundgeb. +Grundavgift = Grundgebühr +Hantera brickor = SI-Cards verwalten +Hantera flera etapper = Mehrere Etappen verwalten +Hantera klubbar och ekonomi = Vereine und Startgelder verwalten +Hantera kvar-i-skogen = Fehlende Läufer verwalten +Hantera löparbrickor = SI-Cards verwalten +Hantera vakanser = Vakantplätze verwalten +Hemsida = Webseite +Hyravgift = Leihgebühr +Hyrbricka = Leihchip +Hyrbricksrapport = Leihchip Bericht +Hyrbricksrapport - %s = Geliehene SI-Cards - %s +Hyrd = geliehen +Hämta (efter)anmälningar från Eventor = Lade (Nach)nennungen von Eventor +Hämta data från Eventor = Lade Daten von Eventor (Schweden) +Hämta efteranmälningar = Lade Nachnennungen +Hämta löpardatabasen = Lade Läuferdatenbank +Hämta tävlingsdata = Lade Wettkampfdaten +Hämta tävlingsdata för X = Lade Wettkampfdaten für X +Hämtar anmälda = Nennungen werden geladen +Hämtar information om = Informationen werden geladen in +Hämtar klasser = Kategorien werden geladen +Hämtar klubbar = Vereine werden geladen +Hämtar löpardatabasen = Läuferdatenbank wird geladen +Hämtar tävling = Wettkampf wird geladen +Händelser = Ereignisse +Hög avgift = Nachnennungsgebühr +IP-adress eller namn på en MySQL-server = IP-Adresse oder MySQL-Servername +Importera = Importieren +Importera anmälningar = Nennungen importieren +Importera banor = Bahnen importieren +Importera banor/klasser = Bahnen/Kategorien importieren +Importera en tävling från fil = Wettkampf aus Datei importieren +Importera fil = Datei importieren +Importera från OCAD = Aus OCAD importieren +Importera från fil = Aus Datei importieren +Importera löpardatabas = Läuferdatenbank importieren +Importera löpare = Läufer importieren +Importera löpare och klubbar / distriktsregister = Läufer und Vereine importieren +Importera stämplingar = Stempel importieren +Importera tävling = Wettkampf importieren +Importera tävlingsdata = Wettkampfdaten importieren +Importerar OCAD csv-fil = OCAD CSV Datei wird importiert +Importerar OE2003 csv-fil = OE2003 CSV Datei wird importiert +Importerar OS2003 csv-fil = OS2003 CSV Datei wird importiert +Importerar anmälningar (IOF, xml) = Nennunen werden importiert (IOF, xml) +Importerar banor (IOF, xml) = Bahnen werden importiert (IOF, xml) +Importerar klasser (IOF, xml) = Kategorien werden importiert (IOF, xml) +Importerar klubbar (IOF, xml) = Vereine werden importiert (IOF, xml) +Importerar tävlingsdata (IOF, xml) = Wettkampfdaten werden importiert (IOF, xml) +Index = Index +Individuell = Individuell +Individuell resultatlista, alla lopp = Individuelle Ergebnisliste, alle Läufe +Individuell resultatlista, sammanställning av flera lopp = Individuelle Ergebnisliste, Zusammenfassung von mehreren Läufen +Individuell resultatlista, visst lopp = Individuelle Ergebnisliste, Lauf +Individuell resultatlista, visst lopp (STOR) = Individuelle Ergebnisliste, Lauf (GROSS) +Individuell startlista, visst lopp = Individuelle Startliste, Lauf +Individuella deltagare = Individuelle Teilnehmer +Info = Information +Inga deltagare = Keine Teilnehmer +Inga vakanser tillgängliga. Vakanser skapas vanligen vid lottning = Keine Vakantplätze verfügbar. Vakantplätze werden üblicherweise bei der Verlosung erstellt +Ingen = Keine +Ingen bana = Keine Bahn +Ingen klass = Keine Kategorie +Ingen löpare saknar bricka = Alle Läufer haben eine SI-Card +Inkommande = Eingehende +Inläst bricka ställd i kö = Eingelesene SI-Card ist in die Warteschlange gestellt worden +Inlästa brickor = Eingelesene SI-Cards +Inmatning av mellantider = Zwischenzeiten eingeben +Inspekterar klasser = Überprüfe Kategorien +Installera = Installieren +Inställningar = Einstellungen +Inställningar MeOS = MeOS Programmeinstellungen +Interaktiv inläsning = Interaktives Einlesen +Intervall = Intervall +Intervall (sekunder). Lämna blankt för att uppdatera när tävlingsdata ändras = Intervall (Sekunden). Freilassen um bei geänderten Wettkampfdaten zu aktualisieren +Intervallet måste anges på formen MM:SS = Intervall in der Form MM:SS angegeben +Jag sköter lottning själv = Ich lose selbst +Jaktstart = Jagdstart +Klart = Abgeschlossen +Klart. Antal importerade: X = Abgeschlossen. Anzahl Nennungen importiert: X +Klart. X deltagare importerade = Abgeschlossen. X Teilnehmer importiert +Klart. X lag importerade = Abgeschlossen. X Teams importiert +Klart. X patruller importerade = Abgeschlossen. X Paare importiert +Klart: alla klasser lottade = Abgechlossen: alle Kategorien ausgelost +Klart: inga klasser behövde lottas = Abgeschlossen: keine Kategorien mussten ausgelost werden +Klass = Kategorie +Klass %d = Kategorie %d +Klass att slå ihop = Kategorie zum Zusammenlegen +Klassbyte = Kategorie wechseln +Klassen 'X' har jaktstart/växling på första sträckan = Kategorie 'X' hat Jagdstart/Übergabe auf der ersten Strecke +Klassen används och kan inte tas bort = Kategorie in Verwendung und kann nicht gelöscht werden +Klassen måste ha ett namn = Kategorie muss einen Namen haben +Klassens bana = Bahn der Kategorie +Klasser = Kategorien +Klasser (IOF, xml) = Kategorien (IOF, xml) +Klassinställningar = Kategorie-Einstellungen +Klassnamn = Kategoriename +Klasstyp = Kategorieart +Klientnamn = Klientenname +Klistra in = Einfügen +Klistra in data från urklipp (X) = Aus Zwischenablage (X) einfügen +Klubb = Verein +Klubb att ta bort = Verein löschen +Klubb: X = Verein: X +KlubbId = Vereinsnummer +Klubbar = Vereine +Klubbar (IOF, xml) = Vereine (IOF, xml) +Klubblös = vereinslos +Klubbresultat = Vereins-Ergebnis +Klubbresultatlista = Vereins-Ergebnisliste +Klubbresultatlista - %s = Vereins-Ergebnisliste - %s +Klubbstartlista = Vereins-Startliste +Klubbstartlista - %s = Vereins-Startliste - %s +Klungstart = Gruppierter Start +Knyt löpare till sträckan = Läufer mit Strecke verknüpfen +Knyt löparna till banor från en pool vid målgång = Läufer mit Bahnen aus Bahnenpool beim Einlesen mit Bahnen verknüpfen +Kommunikation = Kommunikation +Kontant = Bar +Kontant betalning = Barbezahlung +Konto = Konto +Kontroll = Posten +Kontroll %s = Posten %s +Kontroll inför tävlingen = Test vor dem Wettkampf +Kontrollen används och kan inte tas bort = Posten in Verwendung und kann nicht gelöscht werden +Kontrollens ID-nummer = Postennummer +Kontroller = Posten +Kontrollnamn = Postenname +Kopiera länken till urklipp = Link zur Zwischenablage kopieren +Kopiera selektionen till urklipp (X) = Auswahl zur Zwischenablage (X) kopieren +Koppla ifrån = Verbindung trennen +Koppla ner databas = Verbindung zur Datenbank trennen +Kopplar ifrån SportIdent på = Verbindung zur Sportident-Einheit trennen bei +Kunde inte ansluta till Eventor = Konnte keine Verbindung zu Eventor herstellen +Kvar-i-skogen = Fehlende Läufer +Källkatalog = Quellordner +Kön = Geschlecht +Kör kontroll inför tävlingen = Führe einen Test vor dem Wettkampf durch +Ladda upp öppnad tävling på server = Wettkampf auf Server hochladen +Lag = Teams +Lag %d = Team %d +Lag: = Teams: +Laget 'X' saknar klass = Team 'X' hat keine Kategorie +Laget hittades inte = Team wurde nicht gefunden +Lagnamn = Teamname +Lagrade säkerhetskopior = Gespeicherte Sicherheitskopien +Lista = Liste +Lista av typ 'X' = Liste von Art 'X' +Lista med mellantider = Liste mit Zwischenzeiten +Lista med sträcktider = Liste mit Zwischenzeiten +Listor = Listen +Listor och sammanställningar = Listen und Berichte +Listval = Listenwahl +Ljudfiler, baskatalog = Audiodateien, Basisordner +Lokalt = Lokal +Lopp %d = Lauf %d +Lopp %s = Lauf %s +Lopp X = Lauf X +Lotta = Auslosen +Lotta flera klasser = Mehrere Kategorien auslosen +Lotta klassen = Kategorie auslosen +Lotta klassen X = Kategorie 'X' auslosen +Lotta löpare som saknar starttid = Läufer ohne Startzeit auslosen +Lotta om hela klassen = Ganze Kategorie neu auslosen +Lottad = Ausgelost +Lottad startlista = Ausgeloste Startliste +Lottar efteranmälda = Nachnennungen auslosen +Lottar: X = Wird ausgelost: X +Lottning = Zufällige Auslosung +Lyssna = Höre +Lägg till en ny rad i tabellen (X) = Neue Reihe in Tabelle (X) einfügen +Lägger till klubbar = Vereine werden hinzugefügt +Lägger till löpare = Läufer werden hinzugefügt +Längd (m) = Länge (m) +Länk till resultatlistan = Link zur Ergebnisliste +Länk till startlistan = Link zur Startliste +Läs brickor = SI-Cards einlesen +Läser klubbar = Vereine lesen +Läser löpare = Läufer lesen +Låt klassen ha mer än en bana eller sträcka = Ermögliche mehr als eine Bahn oder Strecke für eine Kategorie +Löpande information om viktiga händelser i tävlingen = Laufende Benachrichtigungen über wichtige Ereignisse im Wettkampf +Löparbricka %d = SI-Card %d +Löpardatabasen = Läuferdatenbank +Löpare = Läufer +Löpare saknar klass eller bana = Läufer ohne Kategorie oder Bahn +Löpare som förekommer i mer än ett lag = Läufer kommt in mehr als einem Team vor +Löpare utan SI-bricka: %d = Läufer ohne SI-Card: %d +Löpare utan bana: %d = Läufer ohne Bahn: %d +Löpare utan klass: %d = Läufer ohne Kategorie: %d +Löpare utan klubb: %d = Läufer ohne Verein: %d +Löpare utan starttid: %d = Läufer ohne Startzeit: %d +Löpare, Status Okänd, med registrering (kvar-i-skogen) = Läufer, Status unbekannt, mit Registrierung (nicht im Ziel) +Löpare, Status Okänd, som saknar registrering = Läufer, Status unbekannt, ohne Registrierung +Löpare: = Läufer: +Löpare: X, kontroll: Y, kl Z = Teilnehmer: X, Posten: Y, Uhrzeit: Z +Löparen hittades inte = Läufer nicht gefunden +Löptid = Laufzeit +Lösenord = Passwort +Manuell lottning = Manuelle Verlosung +Mata in första nummerlappsnummer, eller blankt för att ta bort nummerlappar = Erste Startnummer angeben oder leer lassen um Startnummern zu entfernen +Mata in radiotider manuellt = Zeiten bei Funkposten manuell eintragen +Max parallellt startande = Max. Anzahl zugleich Startende +Max. vakanser (per klass) = Max. Vakantplätze (pro Kategorie) +Maxtid = Maximalzeit +MeOS = MeOS +MeOS lokala datakatalog är = MeOS lokaler Datenordner ist +Med stafettklasser = Mit Staffelkategorien +Med sträcktidsanalys = Mit Zwischenzeitenanalyse +Medlöpare = Mitläufer +Mellantider visas för namngivna kontroller = Zwischenzeiten werden für benannte Posten angezeigt +Metod = Methode +Min. vakanser (per klass) = Min. Vakantplätze (pro Kategorie) +Minsta intervall i klass = Kürzestes Intervall in Kategorie +Minsta startintervall = Kürzestes Startintervall +Minsta sträcktid = Kürzeste Zwischenzeit +Minutstartlista = Minuten-Startliste +Motion = Hobby +Multipel = Mehrere +MySQL Server / IP-adress = MySQL Server / IP-Adresse +Mål = Ziel +Målstämpling saknas = Zielstempel fehlt +Måltid = Zielzeit +Namn = Name +Nationalitet = Nationalität +Nollställ avgifter = Gebühren zurücksetzen +Nollställ databaser = Datenbanken zurücksetzen +Nolltid = Nullzeit +Normal = Normal +Normalavgift = Normalgebühr +Not implemented = Nicht implementiert +Nummerlapp = Startnummer +Nummerlappar = Startnummern +Nummerlappar i X = Startnummern für X +Nuvarande innehavare: X = Derzeitiger Besitzer: X +Ny bana = Neue Bahn +Ny deltagare = Neuer Teilnehmer +Ny klass = Neue Kategorie +Ny klubb = Neuer Verein +Ny kontroll = Neuer Posten +Ny tävling = Neuer Wettkampf +Nyckel för Eventor = Eventor-Schlüssel +Nytt fönster = Neues Fenster +Nytt lag = Neues Team +Nästa = Nächste +Nästa försök = Nächster Versuch +OK = OK +Ogiltig banfil. Kontroll förväntad på position X, men hittade 'Y' = Ungültige Bahnendatei. Posten bei Position X erwartet, stattdessen 'Y' gefunden +Ogiltig första starttid. Måste vara efter nolltid = Ungültige erste Startzeit. Muss nach der Nullzeit sein +Ogiltig starttid i 'X' på sträcka Y = Ungültige Startzeit in 'X' auf Strecke Y +Ogiltig starttid: X = Ungültige Startzeit: X +Ogiltig tid = Ungültige Zeit +Ogiltigt bricknummer X = Ungültige SI-Cardnummer X +Okänd bricka = Unbekannte SI-Card +Okänd funktion = Unbekannte Funktion +Okänd klass = Unbekannte Kategorie +Om MeOS = Über MeOS +Om MeOS – ett Mycket Enkelt OrienteringsSystem = Über MeOS – Moderne und einfache Orientierungslauf-Software +Omstart = Neustart +Omstart i stafettklasser = Staffel-Neustart +Omstartstid = Neustartzeit +Oparad = Ungepaart +Operationen misslyckades = Operation erfolglos +Operationen stöds ej = Operation nicht unterstützt +Optimerar startfördelning = Startverteilung wird optimiert +Ordinarie anmälningsdatum = Nennschluss +Ordinarie avgift = Normalgebühr +Oväntad kontroll 'X' i bana Y = Unerwarteter Posten 'X' in Bahn Y +Packar upp löpardatabas = Läuferdatenbank wird geöffnet +Par- eller singelklass = Paarlauf- oder Einzelkategorie +Para ihop = paaren +Para ihop bricka X med en deltagare = SI-Card X mit Teilnehmer paaren +Parallell = Parallel +Patrull = Paarlauf +Patrull, 1 SI-pinne = Paarlauf, 1 SI-Card +Patrull, 2 SI-pinnar = Paarlauf, 2 SI-Cards +Patrullresultat (STOR) = Paarlaufergebnis (GROSS) +Plac. = Rang +Placering in = Rang ein +Plats = Ort +Port = Schnittstelle (Port) +Port för TCP = TCP-Schnittstelle +Postadress = Postadresse +Postkod = PLZ +Poäng = Punkte +Poäng in = Punkte ein +Poängavdrag (per minut) = Punkteabzug (pro Minute) +Poänggräns = Punktelimit +Prel. bomtid = Vorl. Fehlerzeit +Prel. placering = Vorl. Rang +Prioritering = Priorität +Prisutdelningslista = Siegerehrungsliste +Prolog + jaktstart = Prolog + Jagdstart +Publicera resultat = Ergebnis publizieren +Publicera resultat och sträcktider på Eventor och WinSplits online = Ergebnisse und Zwischenzeiten auf Eventor und WinSplits online publizieren +Publicera startlista = Startliste publizieren +Publicera startlistan på Eventor = Startliste auf Eventor publizieren +Publicerar resultat = Ergebnis wird publiziert +Publicerar startlistan = Startliste wird publiziert +Radera = Löschen +Radera tävlingen = Wettkampf löschen +Radera vakanser = Vakantplätze löschen +Radiotider, kontroll = Funkposten-Zeiten, Posten +Ranking = Ranking +Ranking (IOF, xml) = Ranking (IOF, xml) +Rapport inför = Bericht für +Rapporter = Berichte +Redigera deltagaren = Teilnehmer bearbeiten +Rep = Übergabestopp +Repdragningstid = Übergabestopp-Zeit +Reserverade = Reserviert +Resultat = Ergebnis +Resultat && sträcktider = Ergebnis && Zwischenzeiten +Resultat (STOR) = Ergebnis (GROSS) +Resultat - %s = Ergebnis - %s +Resultat - X = Ergebnis - X +Resultat efter sträcka X = Ergebnis nach Strecke X +Resultat efter sträckan = Ergebnis nach Strecke +Resultat för ett visst lopp = Ergebnis für einen bestimmen Lauf +Resultat lopp X - Y = Ergebnis Lauf X - Y +Resultat, generell = Ergebnis, allgemein +Resultat, individuell = Ergebnis, Einzel +Resultat, patrull = Ergebnis, Paarlauf +Resultatlista - %s = Ergebnisse - %s +Resultatlista – inställningar = Ergebnis – Einstellungen +Resultatlistor = Ergebnisse +Resultatutskrift = Ergebnis drucken +Resultatutskrift / export = Ergebnisdruck / Export +Rogaining = Rogaining +Rogaining, individuell = Rogaining, Einzel +Rogaining-poäng = Rogaining Punkte +SI X inläst. Brickan tillhör Y som saknar klass = SI X wurde eingelesen. Die SI-Card gehört Y und ist keiner Kategorie zugeordnet +SI X inläst. Brickan är inte knuten till någon löpare (i skogen) = SI X wurde eingelesen. Die SI-Card ist zu keinem Läufer (nicht im Ziel) gebunden +SI X är redan inläst. Använd interaktiv inläsning om du vill läsa brickan igen = SI X wurde bereits eingelesen. Interaktives Einlesen verwenden um SI-Chip nochmals einzulesen +SI X är redan inläst. Ska den läsas in igen? = SI X wurde bereits eingelesen. Nochmals einlesen? +SI på = SI an +SI-dubbletter: %d = SI-Duplikate: %d +SOFT-avgift = SOFT Gebühr +SOFT-lottning = Schwedische Losungsmethode +Saknad starttid = Fehlende Startzeit +Sammanställning = Zusammenfassung +Sammanställning, ekonomi = Zusammenfassung, Nenngelder +Sammanställning, klasser = Zusammenfassung, Kategorien +Selektionens storlek matchar inte urklippets storlek. Klistra in i alla fall? = Größe der Auswahl stimmt nicht mit der aus der Zwischenablage überein. Trotzdem einfügen? +Server = Server +Server: [X] Y = Server: [X] Y +Sidbrytning mellan klasser = Seitenumbruch zwischen Kategorien +Sidbrytning mellan klasser / klubbar = Seitenumbruch zwischen Kategorien / Vereinen +Simulera inläsning av stämplar = SI-Einlesen simulieren +Sista betalningsdatum = Zahlbar bis +Sista datum för ordinarie anmälan (ÅÅÅÅ-MM-DD) = Letztes Datum zu normalem Nenngeld (JJJJ-MM-TT) +Sista ordinarie anmälningsdatum = Letztes Datum zu normalem Nenngeld +Sista start (nu tilldelad) = Letzter Start (zugeteilt) +Sista start (nu tilldelad): X = Letzter Start (zugeteilt): X +Sista sträckan = Letzte Strecke +Ska X raderas från tävlingen? = X vom Wettkampf löschen? +Skapa en ny tävling med data från Eventor = Erstelle einen neuen Wettkampf mit Daten aus Eventor +Skapa en ny, tom, tävling = Erstelle einen neuen, leeren Wettkampf +Skapa generell lista = Allgemeine Liste erstellen +Skapa listan = Liste erstellen +Skapa ny klass = Neue Kategorie erstellen +Skapad av = Erstellt von +Skapade en bana för klassen %s med %d kontroller från brickdata (SI-%d) = Eine Bahn für die Kategorie %s mit %d Posten in SI-Card %d wurde erstellt. +Skapar ny tävling = Neuer Wettkampf wird erstellt +Skapar saknad klass = Fehlende Kategorie wird erstellt +Skippar lottning = Auslosung überspringen +Skript att köra efter export = Script nach dem Export ausführen +Skriv endast ut ändade sidor = Nur geänderte Seiten ausdrucken +Skriv första starttid på formen HH:MM:SS = Erste Startzeit in HH:MM:SS angeben +Skriv ut = Drucken +Skriv ut eller exportera listan automatiskt = Liste automatisch Drucken oder Exportieren +Skriv ut fakturan = Rechnung drucken +Skriv ut listan = Liste drucken +Skriv ut nu = Jetzt drucken +Skriv ut rapporten = Bericht drucken +Skriv ut sträcktider = Zwischenzeiten drucken +Skriv ut tabellen = Tabelle drucken +Skriv ut tabellen (X) = Tabelle (X) drucken +Skriv över existerande bricknummer? = Bestehende SI-Cardnummer überschreiben? +Skrivare = Drucker +Skrivarinställningar för sträcktider = Druckeinstellungen für Zwischenzeiten +Skriver sträcktider om = Zwischenzeiten werden gedruckt in +Slå ihop = Zusammenlegen +Slå ihop klubb = Verein zusammenlegen +Snabbinställningar = Schnell-Einstellungen +Sortering = Sortierung +Sortering: %s, antal rader: %d = Sortierung: %s, Anzahl Reihen: %d +Spara = Speichern +Spara anmälningar = Nennungen speichern +Spara för webben = Für Webseite speichern +Spara sträcktider till en fil för automatisk synkronisering med WinSplits = Zur automatischen Synchronisierung mit WinSplits Zwischenzeiten als Datei speichern +Speaker = Speaker +Speakerstöd = Speakerunterstützung +SportIdent = Sportident +Språk = Sprache +Stad = Ort +Stafett = Staffel +Stafett (sammanställning) = Staffel (Zusammenfassung) +Stafett - sammanställning = Staffel - Zusammenfassung +Stafett - sträcka = Staffel - Strecke +Stafett - total = Staffel - Gesamt +Stafettklasser = Staffel-Kategorien +Stafettresultat, delsträckor = Staffelergebnis, Strecken +Stafettresultat, lag = Staffelergebnis, Team +Stafettresultat, sträcka = Staffelergebnis, Strecke +Stafettresultat, sträcka (STOR) = Staffelergebnis, Strecke (GROSS) +Start = Start +Starta = Starten +Starta automaten = Automatischen Dienst starten +Starta en guide som hjälper dig göra klassinställningar = Kategorien-Guide starten +Startade automater = Gestartete automatisierte Dienste +Startande = Starter +Startar SI på = Starte SI auf +Startblock = Startblock +Startblock: %d = Startblock: %d +Startintervall (min) = Startintervall (min) +Startlista = Startliste +Startlista %%s - sträcka %d = Startliste %%s - Strecke %d +Startlista - %s = Startliste - %s +Startlista - X = Startliste - X +Startlista ett visst lopp = Startliste für einen bestimmten Lauf +Startlista lopp X - Y = Startliste Lauf X - Y +Startlista, individuell = Startliste, Einzel +Startlista, patrull = Startliste, Paarlauf +Startlista, stafett (lag) = Startliste, Staffel (Team) +Startlista, stafett (sträcka) = Startliste, Staffel (Strecke) +Startlistor = Startlisten +Startmetod = Startmethode +Startnamn = Startname +Startnummer = Startnummer +Starttid = Startzeit +Starttid (HH:MM:SS) = Startzeit (HH:MM:SS) +Starttiden är upptagen = Startzeit nicht verfügbar +Starttyp = Startart +Status = Status +Status OK = Status OK +Status in = Status Eingabe +Stoppa automaten = Automatisierten Dienst stoppen +Stor = Groß +Str. = Str. +Str. %d = Str. %d +Strukturerat exportformat = Strukturiertes Exportformat +Sträcka = Strecke +Sträcka %d = Strecke %d +Sträcka X = Strecke X +Sträckans banor = Bahnen für Strecke +Sträcktider = Zwischenzeiten +Sträcktider (WinSplits) = Zwischenzeiten (WinSplits) +Sträcktider / WinSplits = Zwischenzeiten / WinSplits +Sträcktider/WinSplits = Zwischenzeiten/WinSplits +Sträcktidsfil = Dateiname +Sträcktidsutskrift = Zwischenzeiten drucken +Sträcktidsutskrift[check] = Zwischenzeiten drucken +Sträcktilldelning, stafett = Streckeneinteilung, Staffel +Sträcktyp = Streckenart +Sträng = Beenden +Stämpelkod(er) = Stempelcode/s +Stämplar om = Stempelt um +Stämplingar = Stempel +Stämplingar saknas: X = Fehlende Stempel: X +Stämplingsautomat = Stempelautomat +Stämplingsintervall (MM:SS) = Stempelintervall (MM:SS) +Stämplingstest = Stempeltest +Stämplingstest [!] = Stempeltest [!] +Stäng = Schließen +Stäng tävlingen = Wettkampf schließen +Större = Größer +Störst = Größte +Största intervall i klass = Größtes Intervall in Kategorie +Summera = Summieren +Synkronisera med Eventor = Mit Eventor synchronisieren +Säkerhetskopiera = Sicherheitskopie +Sätt okända löpare utan registrering till = Setze Status für Läufer ohne Registrierung +Sätt som oparad = Setze als ungepaart +Sök = Suche +Sök deltagare = Suche Teilnehmer +Sök och starta automatiskt = Suche und starte automatisch +Sök på namn, bricka eller startnummer = Suche nach Name, SI-Card oder Startnummer +Söker efter SI-enheter = Suche nach SI-Einheiten +TCP: Port %d, Nolltid: %s = TCP: Port %d, Nullzeit: %s +TRASIG( = Kaputt( +Ta bort / slå ihop = Löschen / Zusammenlegen +Ta bort markerad = Markierte löschen +Ta bort stämpling = Stempel löschen +Ta bort valda rader från tabellen (X) = Lösche gewählte Reihen von der Tabelle (X) +Tabellverktyg = Tabellenwerkzeug +Tabelläge = Tabellenmodus +Telefon = Telefon +Test = Test +Test av stämplingsinläsningar = Teststempel +Testa rösten = Stimme testen +Textstorlek = Textgröße +Tid = Zeit +Tid efter: X = Rückstand: X +Tid efter: X; har tagit in Y = Rückstand: X; hat Y gut gemacht +Tid efter: X; har tappat Y = Rückstand: X; hat Y verloren +Tid in = Zeit ein +Tidsavdrag: X poäng = Zeitabzug: X Punkte +Tidsgräns = Zeitlimit +Tidsinmatning = Zeit manuell eingeben +Tidsintervall (MM:SS) = Zeitintervall (MM:SS) +Tidsjustering = Zeitkorrektur +Till huvudsidan = Zur Hauptseite +Tilldela = Zuweisen +Tilldela avgifter = Gebühren zuweisen +Tilldela hyrbrickor = Leihchips zuweisen +Tilldela nummerlappar = Startnummern zuweisen +Tilldelning av hyrbrickor = Leichips zuweisen +Tillgängliga automater = Verfügbare automatisierte Dienste +Tillsatte vakans = Vakantplatz zugewiesen +Tillsätt vakans = Vakantplatz zuweisen +Tillämpa parstart = Paarweise Starten +Tillåt direktanmälan = Erlaube Direktanmeldung +Topplista, N bästa = Topliste, N Besten +Total tävlingsavgift = Summe Wettkampfgebühr +Totalresultat = Gesamtergebnis +Totalt = Summe +Totalt faktureras = Summe in Rechnung stellen +Totalt kontant = Summe bar +Trasig = Fehlerhaft +Träning = Training +Tvåmannastafett = 2-Mann Staffel (Teamsprint) +Typ = Typ +Typ av delning = Teilungsart +Typ av export = Exportart +Typ av lista = Listenart +Tävling = Wettkampf +Tävling från Eventor = Wettkampf von Eventor +Tävlingen innehåller inga resultat = Es sind noch keine Ergebnisse vorhanden +Tävlingen måste ha ett namn = Wettkampf muss einen Namen haben +Tävlingens namn: X = Name des Wettkampfes: X +Tävlingsdata har sparats = Wettkampfdaten wurden gespeichert +Tävlingsinställningar = Wettkampfeinstellungen +Tävlingsinställningar (IOF, xml) = Wettkampfeinstellungen (IOF, xml) +Tävlingsnamn = Wettkampfname +Tävlingsrapport = Wettkampfbericht +Tävlingsstatistik = Wettkampfstatistik +Underlag för tävlingsavgift = Daten für Wettkampfgebühr +Undre ålder = Min. Alter +Ungdom = Jugend +Ungdomsavgift = Jugendgebühr +Ungdomsklasser = Jugendkategorien +Uppdatera = Aktualisieren +Uppdatera alla klubbar = Alle Vereine aktualisieren +Uppdatera alla värden i tabellen = Tabelle aktualisieren +Uppdatera alla värden i tabellen (X) = Tabelle (X) aktualisieren +Uppdatera fördelning = Zuweisung aktualisieren +Uppdatera fördelningen av starttider med hänsyn till manuella ändringar ovan = Aktualisiere die Zuweisung der Startzeiten mit Rücksicht auf die oben angegebenen, manuellen Änderungen. +Uppdatera klubbar && löpare = Vereine && Läufer aktualisieren +Uppdatera klubbarnas och löparnas uppgifter med data från löpardatabasen/distriktsregistret = Angaben über Vereine und Läufer mittels Daten der Läuferdatenbank aktualisieren. +Uppdatera klubbarnas uppgifter med data från löpardatabasen/distriktsregistret = Vereine mittels Daten der Läuferdatenbank aktualisieren +Uppdatera klubbens uppgifter med data från löpardatabasen/distriktsregistret = Vereinsangaben mittels Daten der Läuferdatenbank aktualisieren +Uppdatera löpardatabasen = Läuferdatenbank aktualisieren +Urval = Auswahl +Urval %c%s = Auswahl %c%s +Utan inställningar = Ohne Einstellungen +Utan tidtagning = Ohne Zeitnehmung +Utbyt tävlingsdata med Eventor = Wettkampfdaten mit Eventor austauschen +Utför lottning = Auslosung durchführen +Utfört = Fertig +Utg. = Aufg. +Utskrift / export = Drucken / Exportieren +Utskriftsintervall (MM:SS) = Druckintervall (MM:SS) +Utökat protokoll = Erweitertes Protokoll +VALFRI( = EinerVon( +Vak. ranking = Vakantplatz-Reihenfolge +Vakanser = Vakantplätze +Vakanser / klassbyte = Vakantplätze / Kategorientausch +Vakant = Vakant +Valbar = Optional +Vald bricka = Gewählte SI-Card +Varning: Ingen organisatör/avsändare av fakturan angiven (Se tävlingsinställningar) = Warnung: Kein Veranstalter angegeben (siehe Wettkampfeinstellungen) +Varning: Inget kontonummer angivet (Se tävlingsinställningar) = Warnung: Keine Kontonummer angegeben (siehe Wettkampfeinstellungen) +Varning: Inget sista betalningsdatum angivet (Se tävlinginställningar) = Warnung: Kein Fälligkeitsdatum angegeben (siehe Wettkampfeinstellungen) +Varning: deltagare med blankt namn påträffad. MeOS kräver att alla deltagare har ett namn, och tilldelar namnet 'N.N.' = Warnung: Ein Teilnehmer ohne Namen wurde gefunden. MeOS benötigt einen Namen und hat dem Teilnehmer daher den Namen 'N.N.' zugewiesen. +Varning: lag utan namn påträffat. MeOS kräver att alla lag har ett namn, och tilldelar namnet 'N.N.' = Warnung: Ein Team ohne Namen wurde gefunden. MeOS benötigt einen Namen und hat dem Team daher den Namen 'N.N.' zugewiesen. +Verkställ = Ausführen +Version X = Version X +Vi stöder MeOS = Wir unterstützen MeOS +Viktiga händelser = Wichtige Ereignisse +Vill du klistra in X nya rader i tabellen? = X neue Reihen in die Tabelle einfügen? +Vill du radera X rader från tabellen? = X Reihen der Tabelle löschen? +Vill du radera alla vakanser från tävlingen? = Alle Vakantplätze des Wettkampfes löschen? +Vill du skapa en ny klass? = Neue Kategorie erstellen? +Vill du verkligen radera tävlingen? = Wettkampf endgültig löschen? +Vill du verkligen stänga MeOS? = MeOS beenden? +Vill du verkligen ta bort laget? = Team endgültig löschen? +Vill du verkligen ta bort löparen? = Läufer endgültig löschen? +Visa avancerade funktioner = Erweiterte Einstellungen anzeigen +Visa en tabell över alla stämplingar = Tabelle mit allen Stempeln zeigen +Visa mellantider = Zwischenzeiten anzeigen +Visa startlistan = Startliste anzeigen +Visa tillgängliga säkerhetskopior = Zeige verfügbare Sicherheitskopien +Visar de X bästa = Zeige die X besten +Vuxen = Erwachsener +Vuxenklasser = Erwachsenen-Kategorien +Vuxna = Erwachsene +Välj Spara för att lagra brickorna. Interaktiv inläsning är INTE aktiverad = zum Sichern der SI-Cards wählen. Interaktives Einlesen ist NICHT aktiviert +Välj Spara för att lagra brickorna. Interaktiv inläsning är aktiverad = zum Sichern der SI-Cards wählen. Interaktives Einlesen ist aktiviert +Välj alla = Alle auswählen +Välj alla klasser = Alle Kategorien auswählen +Välj allt = Alles auswählen +Välj automatiskt = Automatisch auswählen +Välj en vakant plats nedan = Wähle einen Vakantplatz unten aus +Välj inget = Nichts auswählen +Välj klass = Kategorie auswählen +Välj klass och starttid nedan = Kategorie und Startzeit unten auswählen +Välj klasser där alla löpare saknar starttid = Kategorien, bei denen alle Läufer keine Startzeit haben auswählen +Välj klasser där någon löpare saknar starttid = Kategorien, bei denen eine Startzeit eines Läufers fehlt auswählen +Välj kolumner = Spalten auswählen +Välj kolumner att visa = Spalten zum Anzeigen auswählen +Välj kolumner för tabellen X = Spalten für Tabelle X auswählen +Välj lopp = Lauf auswählen +Välj löpare = Läufer auswählen +Välj löpare att prioritera bevakning för = Läufer zum Beobachten auswählen +Välj löpare för sträcka X = Läufer für Strecke X auswählen +Välj skrivare = Drucker auswählen +Välj tävling = Wettkampf auswählen +Välj vilka klasser och kontroller du vill bevaka = Kategorien und Posten zum Überwachen auswählen +Välj vilka klasser och kontroller som bevakas = Kategorien und Posten zum Überwachen auswählen +Välj vilka kolumner du vill visa = Spalten zum Anzeigen auswählen +Välj vy = Ansicht auswählen +Välkommen till MeOS = Willkommen bei MeOS +Vänligen betala senast = Bitte bezahle spätestens +Vänligen återlämna hyrbrickan = Bitte Leihchip zurückgeben +Växling = Übergabe +Webb = Webdokument +X har startat = X ist/sind gestartet +X meter = X Meter +X poäng fattas = X Punkte fehlen +X rader kunde inte raderas = X Reihe/n konnten nicht gelöscht werden +X senaste = X letzten +Zooma in (Ctrl + '+') = Einzoomen (Strg + '+') +Zooma ut (Ctrl + '-') = Auszoomen (Strg + '-') +[Bevaka] = [Beobachten] +[Flytta ner] = [Nach unten] +[Klassens bana] = [Bahn der Kategorie] +[Uppdaterad anmälan] = [Anmeldung aktualisiert] +[VARNING] ingen/okänd = [WARNUNG] keine/unbekannt +[Återställ] = [Zurücksetzen] +andra = 2. +ask:addpunches = Keine SI-Card wurde für diesen Teilnehmer eingelesen. Stempel manuell eintragen? +ask:missingcourse = Manche Kategorien (X) haben keine Bahn.\n\nMeOS verwendet die Bahnen bei der Auslosung um zu verhindern, dass Läufer mit dem gleichen ersten Posten zugleich starten.\n\nTrotzdem fortfahren? +ask:overwrite_server = Der Wettkampf ist bereits am Server. Wettkampf am Server überschreiben? +backup = Backup +c/o = c/o +ej aktiv = inaktiv +elfte = 11. +elva = 11. +ett Mycket Enkelt OrienteringsSystem = Moderne und einfache Orientierungslauf-Software +eventor:help = Wenn du MeOS für Orientierungsläufe in Schweden verwendest, wird die Verbindung zu Eventor empfohlen. +eventor:question = X\n\nMöchtest du die Eventorverbindung verwenden? +femma = 5. +femte = 5. +fjärde = 4. +fritt att använda och du är välkommen att distribuera det under vissa villkor = Kostenlos zu benützen und kann unter gewissen Bedingungen weitergegeben werden +fyra = 4. +går i mål på X plats med tiden Y = kommt ins Ziel als X. mit einer Zeit von Y +går i mål på X plats, efter Y, på tiden Z = kommt ins Ziel als X. hinter Y, mit einer Zeit von Z +går upp i delad ledning med tiden X = übernimmt die Führung (ex aequo) mit einer Zeit von X +handskakning = Handshake +har startat = ist gestartet +help:10000 = Ein Dienst in MeOS ist ein kleines Programm, das automatisch etwas macht sobald im Wettkampf Daten geändert werden. +help:12138 = Wähle eine Kategorie aus um sie mit der gewählten Kategorie zu verbinden. Wenn Startzeten bereits gelost wurden, solltest du sie erneut losen. +help:12290 = Der gewählte Wettkampf ist von einer anderen MeOS Version erstellt worden und kann nicht von einem Server geöffnet werden. Der Wettkampf kann jedoch von einer Datei importiert werden. +help:12352 = Diese Aktion löscht den ausgewählten Verein (%s, id=%d) und verschiebt alle Läufer von diesem Verein zu dem Verein, der unten ausgewählt wird. Diese Aktion kann nicht rückgängig gemacht werden. +help:12662 = Posten hinzufügen, indem eine Abfolge von Postennummern angegeben wird. Das Ziel muss nicht angegeben werden. z.B.: 31, 50, 36, 50, 37, 100. +help:14070 = Die TCP Schnittstelle wird verwendet um Stempel über TCP von anderen Systemen zu empfangen. Verwendete Schnittstelle (Port) angeben. Die Nullzeit des Protokolls ist 00:00:00. +help:14343 = Eine Liste mit eingelesenen SI-cards wird gezeigt. Um einen Läufer mit einer anderen SI-Card zu verknüpfen, klicke doppelt auf die SI-Card oder den Läufer der verknüpft werden soll. +help:146122 = MeOS kann Daten über Läufer, Vereine und Kategorien sammeln, indem er MeOS oder IOF (xml) Datenbanken durchsucht.\n\nFortfahren? +help:14692 = Posten (Postennummer), Läufer (Startnummer oder SI-Cardnummer) und Uhrzeit (HH:MM:SS) angeben. Feld leer lassen, dann wird die Computerzeit benützt. +help:15491 = Einstellungen, Vereins- und Läuferdatenbanken können zu einem ausgewählten Ordner exportiert werden. Diese Einstellungen und Datenbanken können bei einem anderen Computer importiert werden. +help:21576 = Klicke auf den Namen des Läufers um die Nennung zu ändern. Läufer-Seite verwenden um Nennungen zu löschen. Um eine Kategorie in der Liste (unten) zu sehen, muss Direktanmeldung in der Kategorien-Seite markiert sein. +help:25041 = Hier werden die Bahnen definiert. Eine Bahn wird anschließend mit einer oder mehreren Kategorien (oder Läufern) verknüpft. Es ist auch möglich Bahnen aus OCAD zu importieren. Bei Angabe der Kartenanzahl kontrolliert MeOS im Direktanmeldungsformular ob genügend Karten vorhanden sind. +help:26963 = Der Bahnenpool wird verwendet um einen Pool (eine Auswahl) an Bahnen für eine Strecke zu definieren. Anhand der auf der im Ziel ausgelesenen SI-Card erkennt MeOS welche Bahn der Läufer gelaufen ist und verknüpft diese automatisch. Bahnen im Pool werden definiert indem sie unter Mehrere Bahnen / Staffel hinzugefügt werden. Ein [S] nach der Kategorie bedeutet dass alle Teilnehmer eine Startzeit haben. +help:29191 = Es ist möglich Einstellungen, Vereins- und Läuferdatenbank von einem benutzerdefinierten Ordner zu installieren. Die lokalen Einstellungen werden beim Import überschrieben. MeOS sollte nach der Installation neu gestartet werden.\n\n führt dich zu einer Seite bei der die derzeitigen Einstellungen exportiert werden können. +help:29758 = Hier werden Vereine verwaltet und Rechnungen ausgedruckt. Es können Nenngelder anhand der Kategorie und des Meldedatums definiert, doppelte Vereine zusammengefügt und Vereinsadressen bearbeitet werden. +help:30750 = Es können viele verschiedene Listen und Berichte erstellt werden. Diese können auf dem Bildschirm gezeigt, gedruckt oder als Webseite gespeichert werden. Die Listen werden automatisch aktualisiert sobald sich die Wettkampfdaten ändern. Automatisierter Ergebnisausdruck wird unter Dienste konfiguriert. Wettkampfdaten (z.B. Zwischenzeiten) können im Menüpunkt Wettkampf exportiert werden. +help:31661 = Ein Neustart wird durch eine Übergabestopp-Zeit und einer Neustart-Startzeit definiert. Zur Übergabestopp-Zeit wird die Übergabezone geschlossen und keine Wettkämpfer dürfen auf ihre Strecke gehen. Die restlichen Läufer starten dann zur Neustartzeit. Es ist möglich verschiedene Neustartzeiten für verschiedene Strecken einzustellen. Mit dieser Funktion wird eine Neustartzeit für ganze Kategorien definiert. +help:33940 = Nennungen in Freitext importieren. Nennungen können in dieser Form angegeben werden: Name, Verein, Kategorie und SI-Card (eventuell auch Startzeit), am besten mittels Komma getrennt, eine Person (Team) pro Reihe. Es ist auch möglich mehrere Teilnehmer des selben Vereins/Kategorie einzufügen, indem die Felder Verein/Kategorie (teilweise) ausgelassen werden. Daten können auch in anderen Formaten importiert werden. +help:41072 = Zum Ändern oder Löschen eines Stempels, Stempel aus der Liste wählen. Fehlende Stempel können über die Bahnvorlage hinzugefügt werden. Fehlt die Zielzeit eines Läufers bekommt dieser den Status Aufgegeben. Fehlt ein Stempel erhält der Läufer den Status Fehlstempel. Es ist nicht möglich einen Status zu setzen der mit den vorhandenen Stempeln nicht übereinstimmt. Ist eine Zielzeit vorhanden, muss diese geändert werden um die Zielzeit zu ändern; das gleiche gilt für die Startzeit bei Startstempel. +help:41641 = Erste Startzeit und Startintervall angeben. Auslosung ergibt zufällige Losung. Schwedische Losung verteilt Läufer des selben Vereins. Gruppierter Start bedeutet, dass die ganze Kategorie in Kleingruppen laut vorgegebenem Intervall startet (verteilter Massenstart).\n\nIntervall 0 wird für Massenstart angeben.\n\nStartnummern: Erste Nummer angeben oder leer lassen wenn keine Startnummern verwendet werden. Im Feld Strecke wird angegeben welche Strecke gelost werden soll (wenn die Kategorie mehrere Strecken hat). +help:425188 = Nicht angetretene Läufer können verwaltet werden, indem SI-Einheiten (Löschen/Prüfen/Start/Posten) im SI-Manager eingelesen werden, der Import als Semikolon-getrennte Textdatei gespeichert wird und in MeOS importiert wird. Die Läufer, die im Import vorhanden sind erhalten eine Registrierung. Läufer ohne Registrierung können anschließend als gesetzt werden.Werden später weitere Läufer importiert, können Läufer, die den Status erhalten haben, auf Status geändert werden. +help:471101 = SI-Einheit aktivieren, indem die COM-Schnittstelle ausgewählt oder nach angeschlossenen SI-Einheiten gesucht wird. Information wählen um den Status für die ausgewählte Schnittstelle zu erhalten.\n\nInteraktives Einlesen lässt die direkte Bearbeitung von Problemen, wie z.B. falscher SI-Nummer zu. Diese Option nur verwenden, wenn die Läufer mit Problemen nicht besonders behandelt werden.\n\nDie Läuferdatenbank wird verwendet wenn neue Teilnehmer automatisch hinzugefügt werden sollen. Die Stempel auf der SI-Card werden verwendet um die richtige Kategorie zu finden (erraten). +help:50431 = Mit keinem Server verbunden. Um einen Wettkampf am Server zu öffnen, aus der Liste auswählen und auf öffnen klicken. Um einen Wettkampf auf den Server hochzuladen, Wettkampf lokal öffnen und hochladen wählen. Wenn ein Wettkampf am Server geöffnet ist, sind alle verbundenen MeOS Klienten sichtbar. +help:52726 = Verbindung mit einem Server.\n\nInstallation\nMySQL 5 (Community Edition) von www.mysql.com herunterladen und installieren. Es können die Standardeinstellungen verwendet werden. Es ist nur notwendig MySQL auf dem Computer, der die Funktion des Servers übernimmt zu installieren. Sobald MySQL installiert ist, MySQL Command Line Client starten und und ein Benutzerkonto für MeOS erstellen. So kann die Kommandozeile lauten:\n\n> CREATE USER meos;\nGRANT ALL ON *.* TO meos;\n\nEin Benutzer meos ohne Passwort wurde erstellt. Namen des Servers angeben (Firewalls müssen eventuell konfiguriert werden um den Datenverkehr zu erlauben).\n\n Alternativ kann der MySQL Root-Account verwendet werden. Der Benutzername ist 'root' und das Passwort ist das bei der Installation von MySQL angegebene. +help:5422 = Keine SI-Einheiten gefunden. Sind sie verbunden und aktiviert? +help:59395 = Mit diesem Formular können Einstellungen für mehrere Kategorien in einem Schritt durchgeführt werden.\n\nStart ist der Name des Starts - so wie er in der Startliste erscheinen soll.\n\nStartblock ist eine Nummer zwischen 0 und 100, die eine noch feinere Verteilung der Läufer bietet. Kategorien mit dem gleichen Block werden auf der selben Minuten-Startliste gedruckt.\n\nIndex ist ein Sortierungsschlüssel. Die Kategorien werden nach diesem Schlüssel in allen Listen sortiert.\n\nDie Bahn kann für Kategorien, die exakt eine Bahn haben spezifiziert werden. Wenn es mehrere mögliche Bahnen gibt muss das normale Kategorieformular verwendet werden. \n\nDirektanmeldung bestimmt ob die Kategorie Direktanmeldungen annimmt. +help:runnerdatabase = Durch Import von Läufer- und Vereinsdatenbank verknüpft MeOS automatisch SI-Cardnummern mit Läufern beim Einlesen der Chips und Adressen/Kontaktangaben der Vereine werden angezeigt.\n\nMeOS kann IOF (xml) Dateien importieren.\n\nWähle bei einem Computer wo die Datenbank installiert ist. Die Datenbank kann unter (verfügbar wenn kein Wettkampf ausgewählt ist) installiert werden. +help:7618 = Die Anzahl an Läufern in einem Team wird im Menüpunkt Kategorien definiert. +help:7620 = Intervall (Sekunden). Feld freilassen um zu aktualisieren, sobald der Wettkampf verändert wird. +help:89064 = Für jeden Posten wird eine oder mehrere Postennummern angegeben (SI Nummern). Bei der Bahnlegung wird zur Identifizierung die Posten ID verwendet. Normalerweise muss kein Posten hinzugefügt werden, da MeOS verwendete Posten automatisch hinzufügt.\n\nMehrere Postennummern sind nützlich wenn fehlerhafte Posten ersetzt werden oder um einfache Gabelungen zu ermöglichen. Für einen normalen Posten genügt es, dass der Läufer einen von den angegebenen Posten besucht hat. Wird der Status auf Mehrere geändert muss der Läufer alle gelisteten Posten in freiher Reihenfolge anlaufen.\n\nWenn der Postenstatus auf 'Fehlerhaft' geändert wird, wird dieser nicht für die Stempelkontrolle verwendet.\n\nEin Posten kann einen Namen erhalten, z.B. 'Zuschauerposten'. Es ist möglich Ergebnislisten mit Zwischenzeiten für Posten mit Namen zu drucken.\n\nDie Zeitkorrektur wird verwendet wenn sich herausstellt, dass die interne Uhr eines Postens falsch ist. Das Format ist +/-MM:SS oder +/-HH:MM:SS.\n\nKürzeste Zwischenzeit wird zum Beispiel bei einem Straßenübergang verwendet. Kein Läufer kann eine bessere Zeit zum Posten haben als die angegebene Zeit. Ist die Zeit des Läufers länger als die angegebene Zeit, wird die aktuelle Zeit des Läufers verwendet. +help:9373 = Eine oder mehrere Postennummern, die von diesem Posten verwendet werden, angeben.\nBeispiel: 31, 32, 33. Das Feld Punkte wird für Rogaining-Posten verwendet. +help:9615 = Keine Antwort erhalten. Soll die Schnittstelle in passivem Modus geöffnet werden; soll MeOS auf eingehende Stempel warten? +help:baudrate = Übertragungsgeschwindigkeit/Baudrate: verwende 4800 oder 38400. +help:computer_voice = Eingehende Stempel werden mit Startnummern verglichen und die Datei (N ist die Startnummer) wird abgespielt. Die Dateien werden vom unten angegebenen Ordner geladen. Wenn der Läufer/Team einer Nation (NAT) angehört, wird zuerst die passende Nationsdatei abgespielt. +help:dbage = Die Läuferdatenbank ist älter als zwei Monate. Neue Datenbank von Eventor herunterladen? +help:eventorkey = Eventor API-Schlüssel des Veranstalter-Vereins (Schweden) angeben. Den API-Schlüssel hat der Eventor-Vereinsadministrator. +help:import_entry_data = Läufer, Kategorien, Vereine und Nennungen können von diversen Text- und XML-Dateien importiert werden. Es ist nicht notwendig alle Dateien anzugeben. Zum Beispiel beinhaltet eine OE-CSV Datei für Nennungen auch Kategorien und Vereine. In diesem Fall sollten die Felder Kategorien und Vereine leer gelassen werden.\n\nWenn derselbe Teilnehmer zwei Mal importiert wird, wird dieser beim zweiten Mal aktualisiert. Es entstehen keine Kopien der Teilnehmer. Das bedeutet, dass Nachnennungen durch eine erweiterte Datei mit Nennungen importiert werden kann. +help:importcourse = Bahnen und Kategorien können von einer OCAD Exportdatei importiert werden. +help:ocad13091 = Wenn es bereits Bahnen gibt (z.B. OCAD), Namen der Bahndatei hier angeben. Bahnen können auch später hinzugefügt werden. +help:relaysetup = Anleitung verwenden um aus mehreren vordefinierten Wettkampfformen zu wählen. Bei Klick auf Ausführen werden die Einstellungen gespeichert. Danach können manuelle Einstellungen für jede Strecke gemacht werden und Bahnen gewählt werden.\n\nErläuterungen:\n- Staffel wird für Staffeln in verschiedenen Formen verwendet.\n- 2-Mann Staffel (Teamsprint-Staffel) bedeutet, dass zwei Läufer ein Team bilden und abwechselnd eine Strecke laufen.\n- Staffel mit zusätzlichen Läufern auf einer Strecke wird manchmal in Jugendklassen verwendet und erlaubt mehrere Läufer auf den mittleren Strecken (der/die Erste im Ziel übergibt an den nächsten Läufer).\n- Paarlauf kann mit zwei SI-Cards (jeder Läufer stempelt) oder mit einer SI-Card pro Paar gelaufen werden.\n- Prolog + Jagdstart bedeutet, dass ein Läufer zuerst einen Prolog (Vorlauf) und danach einen Jagdstart nach dem Ergebnis des Prologs läuft.\n- Bahnenpool ist eine Gabelungsmethode, bei der im Vorfeld nicht bestimmt werden muss wer welche Bahn läuft. Im Ziel erkennt MeOS welche Bahn gelaufen wurde. +help:restore_backup = Durch Auswahl der Zeit, an der eine Sicherheitskopie erstellt wurde kann sie wiederhergestellt werden. +help:save = MeOS speichert die Einstellungen automatisch. +help:speaker_setup = Wähle welche Kategorien und Bahnen beobachtet werden sollen. +help:speakerprio = Markiere die Läufer/Teams, die beobachten werden sollen solange sie gut laufen. Markiere zwei Kontrollkästchen um sie auch zu beobachten wenn das Ergebnis nicht so gut ist. Keine Markierung bedeutet, dass der Läufer/das Team nur beobachtet wird wenn es gut geht (nicht vom Start weg). +help:splitexport = Gesamtergebnisse oder Einzel-Ergebnisse für jeden einzelnen Lauf exportieren? Wenn alle Läufe gewählt werden, werden die Dateien nummeriert. +help:startmethod = MeOS wird automatisch die gewählte Startmethode anwenden. Egal welche Methode hier gewählt wird, sie kann später immer noch geändert werden und Startzeiten neu ausgelost werden. +help:winsplits_auto = Dieser Dienst sichert Zwischenzeiten in eine IOF (xml) Datei in regelmäßigen Intervallen. Wenn diese Datei in WinSplits eingelesen wird, werden die Zwischenzeiten in WinSplits online live aktualisiert. +help:zero_time = Setze die Nullzeit eine Stunde vor dem ersten geplanten Start. +help_autodraw = Erste (normale) Startzeit, das kürzeste Startintervall (in einer Kategorie) und den Anteil an Vakantplätzen angeben. Wähle eine Losungsmethode und ob Nachnennungen vorne oder hinten starten sollen. Die erste Startzeit muss nach der Nullzeit des Wettkampfes sein.\n\nWenn automatisches Auslosen gewählt wird, wird MeOS alle Kategorien auslosen. Kategorien, die noch nicht gelost worden sind, werden gelost. MeOS lost jeden Start einzeln und versucht eine gleichmäßige Verteilung der Starter zu schaffen. MeOS sorgt auch dafür, dass Kategorien mit der selben Bahn nicht gleichzeitig starten und wenn möglich, dass Läufer mit demselben ersten Posten nicht gleichzeitig starten. Außerdem wird ein Freiraum gelassen, damit Nachnennungen unter denselben Voraussetzungen gelost werden können.\n\nIn bereits ausgelosten Kategorien werden Nachnennungen vor oder nach den normalen Nennungen gelost. Die bereits gelosten Läufer behalten ihre Startzeit. Es ist auch möglich gewisse Kategorien manuell zu losen und MeOS anschließend die restlichen Kategorien automatisch auslosen zu lassen.\n\nWenn stattdessen die manuelle Auslosung gewählt wird, kann ausgewählt werden welche Kategorien gelost werden sollen und es gibt weitere Einstellungen. +help_draw = Die Auslosung der Startliste ist ein zweistufiges Verfahren. Zuerst werden die Kategorien, die ausgelost werden sollen ausgewählt und grundlegende Einstellungen vorgenommen. Wenn gewählt wird, wird MeOs die Einstellungen verwenden um die Startzeitblöcke zwischen den Kategorien zu verteilen. MeOS sorgt dafür, dass Kategorien mit ähnlichen Bahnen nicht zur gleichen Zeit starten, wobei bereits gezogene Kategorien berücksichtigt werden. Ein Ziel ist eine gleichmäßige Verteilung der Starter.\n\nDie berechnete Verteilung ist in einer Tabelle dargestellt, wo Änderungen vorgenommen werden können. Wenn die Verteilung zufriedenstellend ist, erlaube MeOS die ausgewählten Kategorien auszulosen.\n\nDie benötigten Grundeinstellungen sind eine erste Startzeit und das kürzeste Startintervall. Die maximale Anzahl der parallel Startenden bestimmt, wie viele Läufer gleichzeitig starten dürfen. Ein erhöhter Wert gibt eine kürzere Starttiefe.\n\nDer Anteil an Vakantplätzen steuert die Anzahl an Vakantplätzen. Wenn keine Vakantplätze benötigt werden, 0% angeben. Für die erwartete Anzahl an Nachnennungen reserviert MeOS einen Freiraum in der Startliste. +inforestwarning = Alle Läufer sind im Ziel. Da die Daten hinter dieser Folgerung fehlerhaft sein können sollte sichergestellt werden, dass alle Läufer im Ziel sind. +kartor = Karten +klar = fertig +kontroll = Posten +localhost = localhost +lopp = Lauf +mål = Ziel +målet = das Ziel +nia = 9. +nionde = 9. +radio X = Funkposten X +saknas = fehlt +se license.txt som levereras med programmet = Siehe license.txt, die mit dem Programm mitgeliefert ist +serverbackup = Server-Sicherheitskopie +sexa = 6. +sjua = 7. +sjunde = 7. +sjätte = 6. +skicka stämplar = sende Stempel +sortering: X, antal rader: Y = Sortierung: X, Anzahl Reihen: Y +sträcka X = Strecke X +stämplade vid = stempelte bei +stämplar vid X som Y, på tiden Z = stempelt bei X als Y. mit der Zeit Z +tia = 10. +till = bis +tionde = 10. +tolfte = 12. +tolva = 12. +tooltip:analyze = Analysiere Daten und zeige eine Vorschau. +tooltip:builddata = Erlaube MeOS mehr über Läufer, Vereine und Kategorien zu erfahren, indem MeOS die Wettkampfdaten analysiert. +tooltip:import = Importiere Nennungen aus Datei. +tooltip:inforest = Liste von Läufern nicht-im-Ziel und Läufern, die nicht gestartet sind. +tooltip:paste = Nennungen aus Zwischenablage einfügen. +tooltip:resultprint = Drucke Ergebnisse um auf Bildschirm zu zeigen +tooltip:voice = Computerstimme liest Zeiten von der Vorwarnung. +trea = 3. +tredje = 3. +tvåa = 2. +väntas till X om någon minut = wird demnächst bei X erwartet +väntas till X om någon minut, och kan i så fall ta en Y plats = wird demnächst bei X erwartet und kann einen Y. Rang einnehmen. +väntas till X om någon minut, och kan i så fall ta ledningen = wird demnächst bei X erwartet und kann die Führung übernehmen. +växeln = Übergabe +växlar på X plats, efter Y, på tiden Z = übergibt an X. Stelle (hinter Y) mit einer Zeit von Z +warning:has_entries = Kategorie hat bereits Läufer. Die Streckenverteilung zu diesem Zeitpunkt zu ändern kann zu einem Datenverlust führen.\n\nTrotzdem fortfahren? +warning:has_results = Kategorie hat bereits Ergebnisse. Die Streckenverteilung zu diesem Zeitpunkt zu ändern ist unüblich.\n\nTrotzdem fortfahren? +Äldre protokoll = Älteres Protokoll +Ändra = Ändern +Ändra grundläggande inställningar och gör en ny fördelning = Grundlegende Einstellungen bearbeiten und neue Zuweisung machen +Ändra inställningar = Einstellungen ändern +Ändra klassinställningar = Kategorieneinstellungen bearbeiten +Ändra lag = Team bearbeiten +Ändra sträckindelning = Streckeneinteilung bearbeiten +Ändrad = Bearbeitet +Ångra = Rückgängig machen +Återbud = Abmelden +Återgå = Zurück +Återställ = Zurücksetzen +Återställ löpare med registrering till = Läufer die sind, zu ändern +Återställ säkerhetskopia = Sicherheitskopie wiederherstellen +Återställ tabeldesignen och visa allt = Tabellendesign wiederherstellen und alles zeigen +Öppen = Offen +Öppen klass = Offene Kategorie +Öppna = Öffnen +Öppna i ett nytt fönster = In neuem Fenster öffnen +Öppna klasser, ungdom = Offene Kategorien, Jugend +Öppna klasser, vuxna = Offene Kategorien, Erwachsene +Öppna tävling = Wettkampf öffnen +Öppna vald tävling = Öffne gewählten Wettkampf +Öppnad tävling = Offener Wettkampf +Övre ålder = Max. Alter +Övriga = Übrige +är först i mål med tiden X = ist als 1. im Ziel mit der Zeit X +är först vid X med tiden Y = ist als 1. bei X mit der Zeit Y +är först vid växeln med tiden X = ist als 1. bei der Übergabe mit der Zeit X +är inte godkänd = ist disqualifiziert +återställd = wiederhergestellt +åtta = 8. +åttonde = 8. diff --git a/code/guihandler.h b/code/guihandler.h new file mode 100644 index 0000000..fa6bacc --- /dev/null +++ b/code/guihandler.h @@ -0,0 +1,45 @@ +#pragma once + +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#ifndef MEOS_GUI_HANDLER +#define MEOS_GUI_HANDLER + +enum GuiEventType {GUI_BUTTON=1, GUI_INPUT=2, GUI_LISTBOX=3, + GUI_INFOBOX=4, GUI_CLEAR=5, GUI_INPUTCHANGE=6, + GUI_COMBO, GUI_COMBOCHANGE, GUI_EVENT, GUI_LINK, + GUI_TIMEOUT, GUI_POSTCLEAR, GUI_FOCUS, GUI_TIMER, + GUI_LISTBOXSELECT //DBL-click +}; + +class gdioutput; +class BaseInfo; + +class GuiHandler { +public: + GuiHandler() {} + virtual ~GuiHandler() = 0 {} + virtual void handle(gdioutput &gdi, BaseInfo &info, GuiEventType type) = 0; +}; + +#endif diff --git a/code/importformats.cpp b/code/importformats.cpp new file mode 100644 index 0000000..69e8017 --- /dev/null +++ b/code/importformats.cpp @@ -0,0 +1,110 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +// oEvent.cpp: implementation of the oEvent class. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" + +#include "localizer.h" +#include "importformats.h" +#include "oEvent.h" + +/* +void ImportFormats::getImportFormats(vector< pair > &formats) { + formats.clear(); + formats.push_back(make_pair(lang.tl("Standard"), Default)); + formats.push_back(make_pair(lang.tl("French Orienteering Federation"), FrenchFederationMapping)); +} + +int ImportFormats::getDefault(oEvent &oe) { + return oe.getPropertyString("Language", "English") == "Français" ? FrenchFederationMapping : Default; +} +*/ +void ImportFormats::getExportFormats(vector< pair > &types, bool exportFilter) { + types.clear(); + + string v; + if (exportFilter) + v = "Resultat"; + else + v = "Startlista"; + + types.push_back(make_pair(lang.tl("IOF " + v + ", version 3.0 (xml)"), IOF30)); + types.push_back(make_pair(lang.tl("IOF " + v + ", version 2.0.3 (xml)"), IOF203)); + types.push_back(make_pair(lang.tl("OE Semikolonseparerad (csv)"), OE)); + types.push_back(make_pair(lang.tl("Webbdokument (html)"), HTML)); +} + +void ImportFormats::getExportFilters(bool exportFilters, vector< pair > &ext) { + string v; + if (exportFilters) + v = "Resultat"; + else + v = "Startlista"; + + ext.push_back(make_pair("IOF " + v + ", version 3.0 (xml)", "*.xml")); + ext.push_back(make_pair("IOF " + v + ", version 2.0.3 (xml)", "*.xml")); + ext.push_back(make_pair("OE Semikolonseparerad (csv)", "*.csv")); + ext.push_back(make_pair("OE/French Federation of Orienteering (csv)", "*.csv")); + ext.push_back(make_pair("Webbdokument (html)", "*.html")); +} + +ImportFormats::ExportFormats ImportFormats::getDefaultExportFormat(oEvent &oe) { + int def = IOF30; + return (ExportFormats)oe.getPropertyInt("ExportFormat", def); +} + +ImportFormats::ExportFormats ImportFormats::setExportFormat(oEvent &oe, int raw) { + oe.setProperty("ExportFormat", raw); + return (ExportFormats)raw; +} + +void ImportFormats::getOECSVLanguage(vector< pair > &typeLanguages) { + typeLanguages.push_back(make_pair("English", 1)); + typeLanguages.push_back(make_pair("Svenska", 2)); + typeLanguages.push_back(make_pair("Deutsch", 3)); + typeLanguages.push_back(make_pair("Dansk", 4)); + typeLanguages.push_back(make_pair("Français", 5)); + typeLanguages.push_back(make_pair("Russian", 6)); +} + +int ImportFormats::getDefaultCSVLanguage(oEvent &oe) { + string currentLanguage = oe.getPropertyString("Language", "English"); + int defaultLanguageType = 1; + + if (currentLanguage == "English") + defaultLanguageType = 1; + else if (currentLanguage == "Svenska") + defaultLanguageType = 2; + else if (currentLanguage == "Deutsch") + defaultLanguageType = 3; + else if (currentLanguage == "Dansk") + defaultLanguageType = 4; + else if (currentLanguage == "Français") + defaultLanguageType = 5; + else if (currentLanguage == "Russian(ISO 8859 - 5)") + defaultLanguageType = 6; + + return defaultLanguageType; +} diff --git a/code/importformats.h b/code/importformats.h new file mode 100644 index 0000000..fb4fa24 --- /dev/null +++ b/code/importformats.h @@ -0,0 +1,64 @@ +#pragma once +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +class oEvent; + +/** Support for context specific interpretation of import/export data*/ +class ImportFormats { +public: + enum ImportFormatOptions { + Default + }; + + //static void getImportFormats(vector< pair > &formats); + + //static int getDefault(oEvent &oe); + + enum ExportFormats { + IOF30 = 1, + IOF203 = 2, + OE = 3, + HTML = 5 + }; + + static void getExportFormats(vector< pair > &types, bool exportFilter); + + static void getExportFilters(bool exportFilters, vector< pair > &ext); + + static ExportFormats getDefaultExportFormat(oEvent &oe); + + static ExportFormats setExportFormat(oEvent &oe, int raw); + + ImportFormats(int opt) : option((ImportFormatOptions)opt) {} + + ImportFormatOptions getOption() const { + return option; + } + + static void getOECSVLanguage(vector< pair > &typeLanguages); + + static int getDefaultCSVLanguage(oEvent &oe); + + private: + ImportFormatOptions option; +}; diff --git a/code/infoserver.cpp b/code/infoserver.cpp new file mode 100644 index 0000000..1c61860 --- /dev/null +++ b/code/infoserver.cpp @@ -0,0 +1,688 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + + +#include "stdafx.h" +#include "meos_util.h" +#include "infoserver.h" +#include "xmlparser.h" +#include "oEvent.h" +#include "download.h" +#include "progress.h" +#include "meosException.h" +#include "gdioutput.h" + +void base64_encode(const vector &input, string &output); + +// Encode a vector vector int {{1}, {1,2,3}, {}, {4,5}} as "1;1,2,3;;4,5" +static void packIntInt(vector< vector > v, string &def) { + for (size_t j = 0; j < v.size(); j++) { + if (j>0) + def += ";"; + for (size_t k = 0; k < v[j].size(); k++) { + if (k>0) + def += ","; + def += itos(v[j][k]); + } + } +} + +InfoBase::InfoBase(int idIn) : id(idIn), committed(false){ +} + +InfoBase::InfoBase(const InfoBase &src) : id(src.id), committed(src.committed){ +} + +void InfoBase::operator=(const InfoBase &src) { +} + +InfoBase::~InfoBase() { +} + +int InfoBase::convertRelativeTime(const oBase &elem, int t) { + return t+elem.getEvent()->getZeroTimeNum(); +} + +InfoCompetition::InfoCompetition(int id) : InfoBase(id) { + forceComplete = true; +} + +InfoRadioControl::InfoRadioControl(int id) : InfoBase(id) { +} + +InfoClass::InfoClass(int id) : InfoBase(id) { +} + +InfoOrganization::InfoOrganization(int id) : InfoBase(id) { +} + +InfoBaseCompetitor::InfoBaseCompetitor(int id) : InfoBase(id) { + organizationId = 0; + classId = 0; + status = 0; + startTime = 0; + runningTime = 0; +} + +InfoCompetitor::InfoCompetitor(int id) : InfoBaseCompetitor(id) { + totalStatus = 0; + inputTime = 0; +} + +InfoTeam::InfoTeam(int id) : InfoBaseCompetitor(id) { +} + + +bool InfoCompetition::synchronize(oEvent &oe, const set &includeCls) { + bool changed = false; + if (oe.getName() != name) { + name = oe.getName(); + changed = true; + } + + if (oe.getDate() != date) { + date = oe.getDate(); + changed = true; + } + + if (oe.getDCI().getString("Organizer") != organizer) { + organizer = oe.getDCI().getString("Organizer"); + changed = true; + } + + if (oe.getDCI().getString("Homepage") != homepage) { + homepage = oe.getDCI().getString("Homepage"); + changed = true; + } + + if (changed) + needCommit(*this); + + vector ctrl; + oe.getControls(ctrl, true); + set knownId; + for (size_t k = 0; k < ctrl.size(); k++) { + if (ctrl[k]->isValidRadio()) { + vector ids; + ctrl[k]->getCourseControls(ids); + for (size_t j = 0; j < ids.size(); j++) { + int id = ids[j]; + knownId.insert(id); + map::iterator res = controls.find(id); + if (res == controls.end()) + res = controls.insert(make_pair(id, InfoRadioControl(id))).first; + if (res->second.synchronize(*ctrl[k], ids.size() > 1 ? j+1 : 0)) + needCommit(res->second); + } + } + } + + // Check if something was deleted + for (map::iterator it = controls.begin(); it != controls.end();) { + if (!knownId.count(it->first)) { + controls.erase(it++); + forceComplete = true; + } + else + ++it; + } + knownId.clear(); + + vector cls; + oe.getClasses(cls, false); + for (size_t k = 0; k < cls.size(); k++) { + int id = cls[k]->getId(); + if (!includeCls.count(id)) + continue; + knownId.insert(id); + map::iterator res = classes.find(id); + if (res == classes.end()) + res = classes.insert(make_pair(id, InfoClass(id))).first; + if (res->second.synchronize(*cls[k])) + needCommit(res->second); + } + + // Check if something was deleted + for (map::iterator it = classes.begin(); it != classes.end();) { + if (!knownId.count(it->first)) { + classes.erase(it++); + forceComplete = true; + } + else + ++it; + } + knownId.clear(); + + vector clb; + oe.getClubs(clb, false); + for (size_t k = 0; k < clb.size(); k++) { + int id = clb[k]->getId(); + knownId.insert(id); + map::iterator res = organizations.find(id); + if (res == organizations.end()) + res = organizations.insert(make_pair(id, InfoOrganization(id))).first; + if (res->second.synchronize(*clb[k])) + needCommit(res->second); + } + + // Check if something was deleted + for (map::iterator it = organizations.begin(); it != organizations.end();) { + if (!knownId.count(it->first)) { + organizations.erase(it++); + forceComplete = true; + } + else + ++it; + } + knownId.clear(); + + vector t; + oe.getTeams(0, t, false); + for (size_t k = 0; k < t.size(); k++) { + if (!includeCls.count(t[k]->getClassId())) + continue; + int id = t[k]->getId(); + knownId.insert(id); + map::iterator res = teams.find(id); + if (res == teams.end()) + res = teams.insert(make_pair(id, InfoTeam(id))).first; + if (res->second.synchronize(*t[k])) + needCommit(res->second); + } + + // Check if something was deleted + for (map::iterator it = teams.begin(); it != teams.end();) { + if (!knownId.count(it->first)) { + teams.erase(it++); + forceComplete = true; + } + else + ++it; + } + knownId.clear(); + + vector r; + oe.getRunners(0, 0, r, false); + for (size_t k = 0; k < r.size(); k++) { + if (!includeCls.count(r[k]->getClassId())) + continue; + int id = r[k]->getId(); + knownId.insert(id); + map::iterator res = competitors.find(id); + if (res == competitors.end()) + res = competitors.insert(make_pair(id, InfoCompetitor(id))).first; + if (res->second.synchronize(*this, *r[k])) + needCommit(res->second); + } + + // Check if something was deleted + for (map::iterator it = competitors.begin(); it != competitors.end();) { + if (!knownId.count(it->first)) { + competitors.erase(it++); + forceComplete = true; + } + else + ++it; + } + knownId.clear(); + + return !toCommit.empty() || forceComplete; +} + +void InfoCompetition::needCommit(InfoBase &obj) { + toCommit.push_back(&obj); +} + +bool InfoRadioControl::synchronize(oControl &c, int number) { + string n = c.hasName() ? c.getName() : c.getString(); + if (number > 0) + n = n + "-" + itos(number); + if (n == name) + return false; + else { + name = n; + modified(); + } + return true; +} + +void InfoRadioControl::serialize(xmlbuffer &xml, bool diffOnly) const { + vector< pair > prop; + prop.push_back(make_pair("id", itos(getId()))); + xml.write("ctrl", prop, name); +} + +bool InfoClass::synchronize(oClass &c) { + const string &n = c.getName(); + int no = c.getSortIndex(); + bool mod = false; + vector< vector > rc; + size_t s = c.getNumStages(); + + if (s > 0) { + linearLegNumberToActual.clear(); + + for (size_t k = 0; k < s; k++) { + if (!c.isParallel(k) && !c.isOptional(k)) { + pCourse pc = c.getCourse(k, 0, true); // Get a course representative for the leg. + + rc.push_back(vector()); + if (pc) { + vector ctrl; + pc->getControls(ctrl); + for (size_t j = 0; j < ctrl.size(); j++) { + if (ctrl[j]->isValidRadio()) { + rc.back().push_back(pc->getCourseControlId(j)); + } + } + } + } + // Setup transformation map (flat to 2D) + linearLegNumberToActual.push_back(max(0, rc.size()-1)); + + } + } + else { + // Single stage + linearLegNumberToActual.resize(1, 0); + pCourse pc = c.getCourse(true); // Get a course representative for the leg. + rc.push_back(vector()); + if (pc) { + vector ctrl; + pc->getControls(ctrl); + for (size_t j = 0; j < ctrl.size(); j++) { + if (ctrl[j]->isValidRadio()) { + //rc.back().push_back(pc->getCourseControlId(ctrl[j]->getId()); + rc.back().push_back(pc->getCourseControlId(j)); + } + } + } + } + + if (radioControls != rc) { + radioControls = rc; + mod = true; + } + + if (n != name || no != sortOrder) { + name = n; + sortOrder = no; + mod = true; + } + + if (mod) + modified(); + return mod; +} + +void InfoClass::serialize(xmlbuffer &xml, bool diffOnly) const { + vector< pair > prop; + prop.push_back(make_pair("id", itos(getId()))); + prop.push_back(make_pair("ord", itos(sortOrder))); + string def; + packIntInt(radioControls, def); + prop.push_back(make_pair("radio", def)); + xml.write("cls", prop, name); +} + +bool InfoOrganization::synchronize(oClub &c) { + const string &n = c.getDisplayName(); + if (n == name) + return false; + else { + name = n; + modified(); + } + return true; +} + +void InfoOrganization::serialize(xmlbuffer &xml, bool diffOnly) const { + vector< pair > prop; + prop.push_back(make_pair("id", itos(getId()))); + xml.write("org", prop, name); +} + +void InfoCompetition::serialize(xmlbuffer &xml, bool diffOnly) const { + vector< pair > prop; + prop.push_back(make_pair("date", date)); + prop.push_back(make_pair("organizer", organizer)); + prop.push_back(make_pair("homepage", homepage)); + xml.write("competition", prop, name); +} + +void InfoBaseCompetitor::serialize(xmlbuffer &xml, bool diffOnly) const { + vector< pair > prop; + prop.push_back(make_pair("org", itos(organizationId))); + prop.push_back(make_pair("cls", itos(classId))); + prop.push_back(make_pair("stat", itos(status))); + prop.push_back(make_pair("st", itos(startTime))); + prop.push_back(make_pair("rt", itos(runningTime))); + xml.write("base", prop, name); +} + +bool InfoBaseCompetitor::synchronizeBase(oAbstractRunner &bc) { + const string &n = bc.getName(); + bool ch = false; + if (n != name) { + name = n; + ch = true; + } + + int cid = bc.getClubId(); + if (cid != organizationId) { + organizationId = cid; + ch = true; + } + + int cls = bc.getClassId(); + if (cls != classId) { + classId = cls; + ch = true; + } + + int s = bc.getStatus(); + if (status != s) { + status = s; + ch = true; + } + + int st = -1; + if (bc.startTimeAvailable()) + st = convertRelativeTime(bc, bc.getStartTime()) * 10; + + if (st != startTime) { + startTime = st; + ch = true; + } + + int rt = bc.getRunningTime() * 10; + if (rt != runningTime) { + runningTime = rt; + ch = true; + } + return ch; +} + +bool InfoCompetitor::synchronize(const InfoCompetition &cmp, oRunner &r) { + bool ch = synchronizeBase(r); + + changeTotalSt = r.getEvent()->hasPrevStage() || r.getLegNumber()>0; // Always write full attributes + int s = r.getTotalStatusInput(); + if (totalStatus != s) { + totalStatus = s; + ch = true; + changeTotalSt = true; + } + + int legInput = r.getTotalTimeInput() * 10; + if (legInput != inputTime) { + inputTime = legInput; + ch = true; + changeTotalSt = true; + } + + vector newRT; + if (r.getClassId() > 0) { + const vector &radios = cmp.getControls(r.getClassId(), r.getLegNumber()); + for (size_t k = 0; k < radios.size(); k++) { + RadioTime radioTime; + RunnerStatus s_split; + radioTime.radioId = radios[k]; + r.getSplitTime(radioTime.radioId, s_split, radioTime.runningTime); + + if (radioTime.runningTime > 0) { + radioTime.runningTime*=10; + newRT.push_back(radioTime); + } + } + } + changeRadio = radioTimes.size() > 0;//false; // Always write full attributes + if (newRT != radioTimes) { + ch = true; + changeRadio = true; + radioTimes.swap(newRT); + } + + if (ch) + modified(); + return ch; +} + +void InfoCompetitor::serialize(xmlbuffer &xml, bool diffOnly) const { + vector< pair > sprop; + sprop.push_back(make_pair("id", itos(getId()))); + xmlbuffer &subTag = xml.startTag("cmp", sprop); + InfoBaseCompetitor::serialize(subTag, diffOnly); + if (radioTimes.size() > 0 && (!diffOnly || changeRadio)) { + string radio; + radio.reserve(radioTimes.size() * 12); + for (size_t k = 0; k < radioTimes.size(); k++) { + if (k>0) + radio+=";"; + radio+=itos(radioTimes[k].radioId); + radio+=","; + radio+=itos(radioTimes[k].runningTime); + } + vector< pair > eprop; + subTag.write("radio", eprop, radio); + } + if (!diffOnly || changeTotalSt) { + vector< pair > prop; + prop.push_back(make_pair("it", itos(inputTime))); + prop.push_back(make_pair("tstat", itos(totalStatus))); + subTag.write("input", prop, ""); + } + xml.endTag(); +} + + +bool InfoTeam::synchronize(oTeam &t) { + bool ch = synchronizeBase(t); + + const pClass cls = t.getClassRef(); + if (cls) { + vector< vector > r; + + size_t s = cls->getNumStages(); + for (size_t k = 0; k < s; k++) { + pRunner rr = t.getRunner(k); + int rid = rr != 0 ? rr->getId() : 0; + + if (cls->isParallel(k) || cls->isOptional(k)) { + if (r.empty()) + r.push_back(vector()); // This is not a valid case, really + r.back().push_back(rid); + } + else + r.push_back(vector(1, rid)); + } + + if (r != competitors) { + r.swap(competitors); + ch = true; + } + + } + if (ch) + modified(); + return ch; +} + +void InfoTeam::serialize(xmlbuffer &xml, bool diffOnly) const { + vector< pair > prop; + prop.push_back(make_pair("id", itos(getId()))); + xmlbuffer &sub = xml.startTag("tm", prop); + InfoBaseCompetitor::serialize(sub, diffOnly); + string def; + packIntInt(competitors, def); + prop.clear(); + sub.write("r", prop, def); + sub.endTag(); +} + +const vector &InfoCompetition::getControls(int classId, int legNumber) const { + map::const_iterator res = classes.find(classId); + + if (res != classes.end()) { + if (size_t(legNumber) < res->second.linearLegNumberToActual.size()) + legNumber = res->second.linearLegNumberToActual[legNumber]; + else + legNumber = 0; + const vector< vector > &c = res->second.radioControls; + if (size_t(legNumber) < c.size()) + return c[legNumber]; + } + throw meosException("Internal class definition error"); +} + +void InfoCompetition::getCompleteXML(xmlbuffer &xml) { + xml.setComplete(true); + serialize(xml, false); + + for(map::iterator it = controls.begin(); it != controls.end(); ++it) { + it->second.serialize(xml, false); + } + + for(map::iterator it = classes.begin(); it != classes.end(); ++it) { + it->second.serialize(xml, false); + } + + for(map::iterator it = organizations.begin(); it != organizations.end(); ++it) { + it->second.serialize(xml, false); + } + + for(map::iterator it = teams.begin(); it != teams.end(); ++it) { + it->second.serialize(xml, false); + } + + for(map::iterator it = competitors.begin(); it != competitors.end(); ++it) { + it->second.serialize(xml, false); + } +} + +void InfoCompetition::getDiffXML(xmlbuffer &xml) { + if (forceComplete) { + getCompleteXML(xml); + return; + } + xml.setComplete(false); + for (list::iterator it = toCommit.begin(); it != toCommit.end(); ++it) { + (*it)->serialize(xml, true); + } +} + +void InfoCompetition::commitComplete() { + toCommit.clear(); + forceComplete = false; +} + +static char encoding_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', + 'w', 'x', 'y', 'z', '0', '1', '2', '3', + '4', '5', '6', '7', '8', '9', '+', '/'}; + +static int mod_table[] = {0, 2, 1}; + +void base64_encode(const vector &input, string &encoded_data) { + + size_t input_length = input.size(); + size_t output_length = 4 * ((input_length + 2) / 3); + encoded_data.resize(output_length); + + for (size_t i = 0, j = 0; i < input_length;) { + unsigned octet_a = i < input_length ? input[i++] : 0; + unsigned octet_b = i < input_length ? input[i++] : 0; + unsigned octet_c = i < input_length ? input[i++] : 0; + + unsigned triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c; + + encoded_data[j++] = encoding_table[(triple >> 3 * 6) & 0x3F]; + encoded_data[j++] = encoding_table[(triple >> 2 * 6) & 0x3F]; + encoded_data[j++] = encoding_table[(triple >> 1 * 6) & 0x3F]; + encoded_data[j++] = encoding_table[(triple >> 0 * 6) & 0x3F]; + } + + for (int i = 0; i < mod_table[input_length % 3]; i++) + encoded_data[output_length - 1 - i] = '='; +} + +xmlbuffer &xmlbuffer::startTag(const char *tag, const vector< pair > &prop) { + blocks.push_back(block()); + blocks.back().tag = tag; + blocks.back().prop = prop; + blocks.back().subValues.push_back(xmlbuffer()); + return blocks.back().subValues.back(); +} + +void xmlbuffer::endTag() { +} + +void xmlbuffer::write(const char *tag, + const vector< pair > &prop, + const string &value) { + blocks.push_back(block()); + blocks.back().tag = tag; + blocks.back().prop = prop; + blocks.back().value = value; +} + +void xmlbuffer::startXML(xmlparser &xml, const string &dest) { + xml.openOutput(dest.c_str(), false); + if (complete) { + xml.startTag("MOPComplete", "xmlns", "http://www.melin.nu/mop"); + complete = false; + } + else + xml.startTag("MOPDiff", "xmlns", "http://www.melin.nu/mop"); +} + +bool xmlbuffer::commit(xmlparser &xml, int count) { + while (count>0 && !blocks.empty()) { + block &block = blocks.front(); + + if (block.subValues.empty()) { + xml.write(block.tag.c_str(), block.prop, block.value); + } + else { + vector p2; + for (size_t k = 0; k< block.prop.size(); k++) { + p2.push_back(block.prop[k].first); + p2.push_back(block.prop[k].second); + } + xml.startTag(block.tag.c_str(), p2); + + for (size_t k = 0; k < block.subValues.size(); k++) + block.subValues[k].commit(xml, numeric_limits::max()); + + xml.endTag(); + } + + count--; + blocks.pop_front(); + } + + return !blocks.empty(); +} diff --git a/code/infoserver.h b/code/infoserver.h new file mode 100644 index 0000000..23f521f --- /dev/null +++ b/code/infoserver.h @@ -0,0 +1,219 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +/** Class for keeping an external information server (online results) up-to-date */ + +#include +#include +#include + +class oBase; +class oEvent; +class oClass; +class oAbstractRunner; +class oRunner; +class oTeam; +class oClub; +class oControl; +class xmlparser; +class gdioutput; + + +class xmlbuffer { +private: + struct block { + string tag; + vector> prop; + string value; + vector subValues; + }; + + list blocks; + bool complete; +public: + void setComplete(bool c) {complete = c;} + xmlbuffer &startTag(const char *tag, const vector< pair > &prop); + void endTag(); + void write(const char *tag, + const vector< pair > &prop, + const string &value); + + size_t size() const {return blocks.size();} + bool commit(xmlparser &xml, int count); + + void startXML(xmlparser &xml, const string &dest); +}; + +class InfoBase +{ +private: + bool committed; + const int id; +protected: + void modified() {committed = false;} + virtual void serialize(xmlbuffer &xml, bool diffOnly) const = 0; + + // Converts a relative time to absolute time: + // number of tenths of a second since 00:00:00 on the day of + // the zero time of the competition + int convertRelativeTime(const oBase &elem, int t); +public: + + int getId() const {return id;} + bool isCommitted() const {return committed;} + + InfoBase(int id); + InfoBase(const InfoBase &in); + void operator=(const InfoBase &in); + virtual ~InfoBase(); + + friend class InfoCompetition; +}; + +typedef InfoBase * pInfoBase; + +class InfoRadioControl : public InfoBase { + protected: + string name; + bool synchronize(oControl &c, int number); + void serialize(xmlbuffer &xml, bool diffOnly) const; + public: + InfoRadioControl(int id); + virtual ~InfoRadioControl() {} + + friend class InfoCompetition; +}; + +class InfoClass : public InfoBase { + protected: + string name; + int sortOrder; + vector< vector > radioControls; + vector linearLegNumberToActual; + bool synchronize(oClass &c); + void serialize(xmlbuffer &xml, bool diffOnly) const; + public: + InfoClass(int id); + virtual ~InfoClass() {} + + friend class InfoCompetition; +}; + +class InfoOrganization : public InfoBase { + protected: + string name; + bool synchronize(oClub &c); + void serialize(xmlbuffer &xml, bool diffOnly) const; + public: + InfoOrganization(int id); + virtual ~InfoOrganization() {} + + friend class InfoCompetition; +}; + +struct RadioTime { + int radioId; + int runningTime; + + bool operator==(const RadioTime &t) const { + return radioId == t.radioId && runningTime == t.runningTime; + } +}; + +class InfoBaseCompetitor : public InfoBase { + protected: + string name; + int organizationId; + int classId; + + int status; + int startTime; + int runningTime; + void serialize(xmlbuffer &xml, bool diffOnly) const; + bool synchronizeBase(oAbstractRunner &bc); + public: + InfoBaseCompetitor(int id); + virtual ~InfoBaseCompetitor() {} +}; + +class InfoCompetitor : public InfoBaseCompetitor { + protected: + vector radioTimes; + int inputTime; + int totalStatus; + bool synchronize(const InfoCompetition &cmp, oRunner &c); + void serialize(xmlbuffer &xml, bool diffOnly) const; + bool changeTotalSt; + bool changeRadio; + public: + InfoCompetitor(int id); + virtual ~InfoCompetitor() {} + + friend class InfoCompetition; +}; + +class InfoTeam : public InfoBaseCompetitor { + protected: + // The outer level holds legs, the inner level holds (parallel/patrol) runners on each leg. + vector< vector > competitors; + bool synchronize(oTeam &t); + void serialize(xmlbuffer &xml, bool diffOnly) const; + public: + InfoTeam(int id); + virtual ~InfoTeam() {} + friend class InfoCompetition; +}; + +class InfoCompetition : public InfoBase { +private: + string name; + string date; + string organizer; + string homepage; +protected: + bool forceComplete; + + list toCommit; + + map controls; + map classes; + map organizations; + map competitors; + map teams; + + void needCommit(InfoBase &obj); + void serialize(xmlbuffer &xml, bool diffOnly) const; + + + public: + const vector &getControls(int classId, int legNumber) const; + bool synchronize(oEvent &oe, const set &classes); + + void getCompleteXML(xmlbuffer &xml); + void getDiffXML(xmlbuffer &xml); + + void commitComplete(); + + InfoCompetition(int id); + //InfoCompetition(const InfoCompetition &in); + virtual ~InfoCompetition() {} +}; diff --git a/code/inthashmap.h b/code/inthashmap.h new file mode 100644 index 0000000..38909d9 --- /dev/null +++ b/code/inthashmap.h @@ -0,0 +1,27 @@ +#pragma once + +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "intkeymap.hpp" + +typedef intkeymap inthashmap; diff --git a/code/intkeymap.hpp b/code/intkeymap.hpp new file mode 100644 index 0000000..197e8e3 --- /dev/null +++ b/code/intkeymap.hpp @@ -0,0 +1,78 @@ +#pragma once + +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2015 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Stigbergsvägen 7, SE-75242 UPPSALA, Sweden + +************************************************************************/ + +template class intkeymap { +private: + const static KEY NoKey = -1013; + + struct keypair { + KEY key; + T value; + }; + T dummy; + T tmp; + keypair *keys; + unsigned siz; + unsigned used; + intkeymap *next; + intkeymap *parent; + double allocFactor; + T noValue; + unsigned hash1; + unsigned hash2; + int level; + static int optsize(int arg); + + T &rehash(int size, KEY key, const T &value); + T &get(const KEY key); + + const intkeymap &operator=(const intkeymap &co); + void *lookup(KEY key) const; +public: + virtual ~intkeymap(); + intkeymap(int size); + intkeymap(); + intkeymap(const intkeymap &co); + + bool empty() const; + int size() const; + int getAlloc() const {return siz;} + void clear(); + + void resize(int size); + int count(KEY key) { + return lookup(key, dummy) ? 1:0; + } + bool lookup(KEY key, T &value) const; + + void insert(KEY key, const T &value); + void remove(KEY key); + void erase(KEY key) {remove(key);} + const T operator[](KEY key) const + {if (lookup(key,tmp)) return tmp; else return T();} + + T &operator[](KEY key) { + return get(key); + } +}; diff --git a/code/intkeymapimpl.hpp b/code/intkeymapimpl.hpp new file mode 100644 index 0000000..f73d88f --- /dev/null +++ b/code/intkeymapimpl.hpp @@ -0,0 +1,374 @@ +#pragma once + +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2015 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Stigbergsvägen 7, SE-75242 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" +#include "intkeymap.hpp" + + + +template intkeymap::intkeymap() { + siz = 17; + allocFactor = 1.5; + keys = new keypair[siz]; + hash1 = siz / 2 + 3; + hash2 = siz / 3 + 2; + used = 0; + next = 0; + level = 0; + parent = 0; + dummy = 0; + noValue = 0; + clear(); +} + +template intkeymap::intkeymap(int _size) +{ + allocFactor = 1.3; + siz = optsize(_size); + keys = new keypair[siz]; + hash1 = siz / 2 + 3; + hash2 = siz / 3 + 2; + used = 0; + next = 0; + level = 0; + parent = 0; + dummy = T(); + noValue = T(); + clear(); +} + +template intkeymap::intkeymap(const intkeymap &co) +{ + allocFactor = co.allocFactor; + siz = co.siz; + keys = new keypair[siz]; + hash1 = co.hash1; + hash2 = co.hash2; + used = co.used; + level = co.level; + dummy = co.dummy; + noValue = co.noValue; + + for (unsigned k=0; k(*co.next); + next->parent = this; + } +} + +template intkeymap::~intkeymap() +{ + delete[] keys; + if (next) + delete next; +} + +template void intkeymap::clear() +{ + for (unsigned k=0;k void intkeymap::insert(KEY key, const T &value) +{ + if (key == NoKey) { + noValue = value; + return; + } + + keypair *ptr = (keypair *)lookup(key); + if (ptr) { + ptr->key = key; + ptr->value = value; + return; + } + + unsigned hk = unsigned(key) % siz; + + if (keys[hk].key == NoKey) + used++; + if (keys[hk].key == NoKey || keys[hk].key == key) { + keys[hk].key = key; + keys[hk].value = value; + return; + } + + hk = unsigned(key + hash1) % siz; + + if (keys[hk].key == NoKey) + used++; + if (keys[hk].key == NoKey || keys[hk].key == key) { + keys[hk].key = key; + keys[hk].value = value; + return; + } + + hk = unsigned(key + hash2) % siz; + + if (keys[hk].key == NoKey) + used++; + if (keys[hk].key == NoKey || keys[hk].key == key) { + keys[hk].key = key; + keys[hk].value = value; + return; + } + + if (next) { + next->insert(key, value); + return; + } + else if (level < 3) { + next = new intkeymap(siz/2); + next->level = level + 1; + next->parent = this; + next->insert(key, value); + return; + } + + rehash(0, key, value); +} + +template T &intkeymap::get(KEY key) +{ + keypair *ptr = (keypair *)lookup(key); + if (ptr) + return ptr->value; + + if (key == NoKey) + return noValue; + + unsigned hk = unsigned(key) % siz; + + if (keys[hk].key == NoKey) { + used++; + keys[hk].value = T(); + } + if (keys[hk].key == NoKey || keys[hk].key == key) { + keys[hk].key = key; + return keys[hk].value; + } + + hk = unsigned(key + hash1) % siz; + + if (keys[hk].key == NoKey) { + used++; + keys[hk].value = T(); + } + if (keys[hk].key == NoKey || keys[hk].key == key) { + keys[hk].key = key; + return keys[hk].value; + } + + hk = unsigned(key + hash2) % siz; + + if (keys[hk].key == NoKey) { + keys[hk].value = T(); + used++; + } + if (keys[hk].key == NoKey || keys[hk].key == key) { + keys[hk].key = key; + return keys[hk].value; + } + + if (next) { + return next->get(key); + } + else if (level < 3) { + next = new intkeymap(siz/2); + next->level = level + 1; + next->parent = this; + return next->get(key); + } + + return rehash(0, key, T()); +} + + +template void intkeymap::remove(KEY key) +{ + unsigned hk = unsigned(key) % siz; + if (keys[hk].key == key) { + keys[hk].key = NoKey; + used--; + return; + } + + hk = unsigned(key + hash1) % siz; + if (keys[hk].key == key) { + keys[hk].key = NoKey; + used--; + return; + } + + hk = unsigned(key + hash2) % siz; + if (keys[hk].key == key) { + keys[hk].key = NoKey; + used--; + return; + } + + if (next) { + next->remove(key); + return; + } +} + +template T &intkeymap::rehash(int _siz, KEY key, const T &value) +{ + if (parent) + return parent->rehash(_siz+used, key, value); + else { + intkeymap nm(int((_siz+used)*allocFactor)); + if (key != NoKey) + nm.insert(key, value); + + intkeymap *tmap = this; + while (tmap) { + int tsize = tmap->siz; + keypair *tkeys = tmap->keys; + for (int k=0; knext; + } + + // Swap + keypair *oldkeys = keys; + + //Take next + delete next; + next = nm.next; + nm.next = 0; + if (next) + next->parent = this; + + //Take keys + keys = nm.keys; + nm.keys = 0; + delete[] oldkeys; + + // Copy relevant data + siz = nm.siz; + used = nm.used; + hash1 = nm.hash1; + hash2 = nm.hash2; + + if (key!=NoKey) + return get(key); + return dummy; + } +} + +template bool intkeymap::lookup(KEY key, T &value) const +{ + keypair *ptr = (keypair *)lookup(key); + if (ptr) { + value = ptr->value; + return true; + } + else { + value = T(); + return false; + } +} + +template void *intkeymap::lookup(KEY key) const +{ + if (key == NoKey) { + return 0; + } + + unsigned hk = unsigned(key) % siz; + if (keys[hk].key == key) { + return (void *)&keys[hk]; + } + + hk = unsigned(key + hash1) % siz; + if (keys[hk].key == key) { + return (void *)&keys[hk]; + } + + hk = unsigned(key + hash2) % siz; + if (keys[hk].key == key) { + return (void *)&keys[hk]; + } + + if (next) + return next->lookup(key); + else + return 0; +} + +template int intkeymap::optsize(int a) { + if (a<5) + a = 5; + + if ((a&1) == 0) + a++; + + while (true) { + if (a%3 == 0) + a+=2; + else if (a%5 == 0) + a+=2; + else if (a%7 == 0) + a+=2; + else if (a%11 == 0) + a+=2; + else if (a%13 == 0) + a+=2; + else + return a; + } +} + +template int intkeymap::size() const +{ + if (next) + return used + next->size(); + else + return used; +} + +template bool intkeymap::empty() const +{ + return used==0 && (next==0 || next->empty()); +} + +template void intkeymap::resize(int size) +{ + allocFactor = 1.0; + rehash(size, NoKey, 0); + allocFactor = 1.3; +} diff --git a/code/iof30interface.cpp b/code/iof30interface.cpp new file mode 100644 index 0000000..c2c9d7f --- /dev/null +++ b/code/iof30interface.cpp @@ -0,0 +1,3508 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" + +#include +#include + +#include "iof30interface.h" +#include "oEvent.h" +#include "gdioutput.h" +#include "gdifonts.h" +#include "xmlparser.h" +#include "RunnerDB.h" +#include "meos_util.h" +#include "meosException.h" +#include "localizer.h" + +string &getFirst(string &inout, int maxNames); +string getMeosCompectVersion(); + +IOF30Interface::IOF30Interface(oEvent *oe, bool forceSplitFee) : oe(*oe), useGMT(false), teamsAsIndividual(false), + entrySourceId(1), unrollLoops(true), + includeStageRaceInfo(true) { + cachedStageNumber = -1; + splitLateFee = forceSplitFee || oe->getPropertyInt("SplitLateFees", false) == 1; +} + +void IOF30Interface::readCourseData(gdioutput &gdi, const xmlobject &xo, bool updateClass, + int &courseCount, int &failed) { + string ver; + xo.getObjectString("iofVersion", ver); + if (!ver.empty() && ver > "3.0") + gdi.addString("", 0, "Varning, okänd XML-version X#" + ver); + courseCount = 0; + failed = 0; + xmlList xl; + xo.getObjects("RaceCourseData", xl); + xmlList::const_iterator it; + xmlobject xRaceCourses; + if (xl.size() == 1) { + xRaceCourses = xl[0]; + } + else { + int nr = getStageNumber(); + int ix = -1; + for (size_t k = 0; k < xl.size(); k++) { + if (xl[k].getObjectInt("raceNumber") == nr) { + ix = k; + break; + } + } + if (ix == -1) + throw meosException("Filen innehåller flera uppsättningar banor, men ingen har samma etappnummer som denna etapp (X).#" + itos(nr)); + else + xRaceCourses = xl[ix]; + } + + xmlList xControls, xCourse, x; + xRaceCourses.getObjects("Control", xControls); + xRaceCourses.getObjects("Course", xCourse); + + for (size_t k = 0; k < xControls.size(); k++) { + readControl(xControls[k]); + } + + map courses; + map > coursesFamilies; + + for (size_t k = 0; k < xCourse.size(); k++) { + pCourse pc = readCourse(xCourse[k]); + if (pc) { + courseCount++; + if (courses.count(pc->getName())) + gdi.addString("", 0, "Varning: Banan 'X' förekommer flera gånger#" + pc->getName()); + + courses[pc->getName()] = pc; + + string family; + xCourse[k].getObjectString("CourseFamily", family); + + if (!family.empty()) { + coursesFamilies[family].push_back(pc); + } + } + else + failed++; + } + + if (!updateClass) + return; + + + xmlList xClassAssignment, xTeamAssignment, xPersonAssignment; + xRaceCourses.getObjects("ClassCourseAssignment", xClassAssignment); + if (xClassAssignment.size() > 0) + classCourseAssignment(gdi, xClassAssignment, courses, coursesFamilies); + + xRaceCourses.getObjects("PersonCourseAssignment", xPersonAssignment); + if (xPersonAssignment.size() > 0) + personCourseAssignment(gdi, xPersonAssignment, courses); + + xRaceCourses.getObjects("TeamCourseAssignment", xTeamAssignment); + if (xTeamAssignment.size() > 0) + teamCourseAssignment(gdi, xTeamAssignment, courses); + + xmlList xAssignment; + xRaceCourses.getObjects("CourseAssignment", xAssignment); + if (xAssignment.size() > 0) { + classAssignmentObsolete(gdi, xAssignment, courses, coursesFamilies); + } + +} + +void IOF30Interface::classCourseAssignment(gdioutput &gdi, xmlList &xAssignment, + const map &courses, + const map > &coursesFamilies) { + + map< pair, vector > classIdLegToCourse; + + for (size_t k = 0; k < xAssignment.size(); k++) { + xmlobject &xClsAssignment = xAssignment[k]; + map > cls2Stages; + + xmlList xClsId; + xClsAssignment.getObjects("ClassId", xClsId); + for (size_t j = 0; j ())); + } + + if (cls2Stages.empty()) { + string cname; + xClsAssignment.getObjectString("ClassName", cname); + if (cname.length() > 0) { + pClass pc = oe.getClassCreate(0, cname); + if (pc) + cls2Stages.insert(make_pair(pc->getId(), vector()) ); + } + } + + if (cls2Stages.empty()) { + gdi.addString("", 0, "Klass saknad").setColor(colorRed); + continue; + } + + // Allowed on leg + xmlList xLeg; + xClsAssignment.getObjects("AllowedOnLeg", xLeg); + + for (map >::iterator it = cls2Stages.begin(); it != cls2Stages.end(); ++it) { + pClass defClass = oe.getClass(it->first); + vector &legs = it->second; + + // Convert from leg/legorder to real leg number + for (size_t j = 0; j getNumStages() > 0) { + for (unsigned i = 0; i < defClass->getNumStages(); i++) { + int realLeg, legIx; + defClass->splitLegNumberParallel(i, realLeg, legIx); + if (realLeg == leg) + legs.push_back(i); + } + } + else + legs.push_back(leg); + } + if (legs.empty()) + legs.push_back(-1); // All legs + } + // Extract courses / families + xmlList xCourse; + xClsAssignment.getObjects("CourseName", xCourse); + + xmlList xFamily; + string t, t1, t2; + xClsAssignment.getObjects("CourseFamily", xFamily); + + for (map >::iterator it = cls2Stages.begin(); it != cls2Stages.end(); ++it) { + const vector &legs = it->second; + for (size_t m = 0; m < legs.size(); m++) { + int leg = legs[m]; + for (size_t j = 0; j < xFamily.size(); j++) { + for (size_t i = 0; i < xCourse.size(); i++) { + string crs = constructCourseName(xFamily[j].getObjectString(0, t1), + xCourse[i].getObjectString(0, t2)); + classIdLegToCourse[make_pair(it->first, leg)].push_back(crs); + } + } + if (xFamily.empty()) { + for (size_t i = 0; i < xCourse.size(); i++) { + string crs = constructCourseName("", xCourse[i].getObjectString(0, t)); + classIdLegToCourse[make_pair(it->first, leg)].push_back(crs); + } + } + if (xCourse.empty()) { + for (size_t j = 0; j < xFamily.size(); j++) { + map >::const_iterator res = + coursesFamilies.find(xFamily[j].getObjectString(0, t)); + + + if (res != coursesFamilies.end()) { + const vector &family = res->second; + for (size_t i = 0; i < family.size(); i++) { + classIdLegToCourse[make_pair(it->first, leg)].push_back(family[i]->getName()); + } + } + } + } + } + } + } + + map< pair, vector >::iterator it; + for (it = classIdLegToCourse.begin(); it != classIdLegToCourse.end(); ++it) { + pClass pc = oe.getClass(it->first.first); + if (pc) { + pc->setCourse(0); + for (size_t k = 0; k < pc->getNumStages(); k++) + pc->clearStageCourses(k); + } + } + for (it = classIdLegToCourse.begin(); it != classIdLegToCourse.end(); ++it) { + pClass pc = oe.getClass(it->first.first); + unsigned leg = it->first.second; + const vector &crs = it->second; + vector pCrs; + for (size_t k = 0; k < crs.size(); k++) { + map::const_iterator res = courses.find(crs[k]); + pCourse c = res != courses.end() ? res->second : 0; + if (c == 0) + gdi.addString("", 0, "Varning: Banan 'X' finns inte#" + crs[k]).setColor(colorRed); + pCrs.push_back(c); + } + if (pCrs.empty()) + continue; + + if (leg == -1) { + if (pCrs.size() > 1) { + if (!pc->hasMultiCourse()) { + pc->setNumStages(1); + } + } + + if (pc->hasMultiCourse()) { + for (size_t k = 0; k < pc->getNumStages(); k++) { + for (size_t j = 0; j < pCrs.size(); j++) + pc->addStageCourse(k, pCrs[j]); + } + } + else + pc->setCourse(pCrs[0]); + } + else if (leg == 0 && pCrs.size() == 1) { + if (pc->hasMultiCourse()) + pc->addStageCourse(0, pCrs[0]); + else + pc->setCourse(pCrs[0]); + } + else { + if (leg >= pc->getNumStages()) + pc->setNumStages(leg+1); + + for (size_t j = 0; j < pCrs.size(); j++) + pc->addStageCourse(leg, pCrs[j]); + } + } +} + +void IOF30Interface::personCourseAssignment(gdioutput &gdi, xmlList &xAssignment, + const map &courses) { + vector allR; + oe.getRunners(0, 0, allR, false); + map bib2Runner; + multimap name2Runner; + for (size_t k = 0; k < allR.size(); k++) { + string bib = allR[k]->getBib(); + if (!bib.empty()) + bib2Runner[bib] = allR[k]; + + name2Runner.insert(make_pair(allR[k]->getName(), allR[k])); + } + + for (size_t k = 0; k < xAssignment.size(); k++) { + xmlobject &xPAssignment = xAssignment[k]; + pRunner r = 0; + + string runnerText; + string bib; + xPAssignment.getObjectString("BibNumber", bib); + + if (!bib.empty()) { + runnerText = bib; + r = bib2Runner[bib]; + } + + if (r == 0) { + int id = xPAssignment.getObjectInt("EntryId"); // This assumes entryId = personId, which may or may not be the case. + if (id != 0) { + runnerText = "Id = "+itos(id); + r = oe.getRunner(id, 0); + } + } + + if (r == 0) { + string person; + xPAssignment.getObjectString("PersonName", person); + if (!person.empty()) { + runnerText = person; + string cls; + xPAssignment.getObjectString("ClassName", cls); + multimap::const_iterator res = name2Runner.find(person); + while (res != name2Runner.end() && person == res->first) { + if (cls.empty() || res->second->getClass() == cls) { + r = res->second; + break; + } + ++res; + } + } + } + + if (r == 0) { + gdi.addString("", 0, "Varning: Deltagaren 'X' finns inte.#" + runnerText).setColor(colorRed); + continue; + } + + pCourse c = findCourse(gdi, courses, xPAssignment); + if (c == 0) + continue; + + r->setCourseId(c->getId()); + } +} + +pCourse IOF30Interface::findCourse(gdioutput &gdi, + const map &courses, + xmlobject &xPAssignment) { + string course; + xPAssignment.getObjectString("CourseName", course); + string family; + xPAssignment.getObjectString("CourseFamily", family); + string fullCrs = constructCourseName(family, course); + + map::const_iterator res = courses.find(fullCrs); + pCourse c = res != courses.end() ? res->second : 0; + if (c == 0) { + gdi.addString("", 0, "Varning: Banan 'X' finns inte.#" + fullCrs).setColor(colorRed); + } + return c; +} + +void IOF30Interface::teamCourseAssignment(gdioutput &gdi, xmlList &xAssignment, + const map &courses) { + vector allT; + oe.getTeams(0, allT, false); + + map bib2Team; + map, pTeam> nameClass2Team; + for (size_t k = 0; k < allT.size(); k++) { + string bib = allT[k]->getBib(); + if (!bib.empty()) + bib2Team[bib] = allT[k]; + + nameClass2Team[make_pair(allT[k]->getName(), allT[k]->getClass())] = allT[k]; + } + + for (size_t k = 0; k < xAssignment.size(); k++) { + xmlobject &xTAssignment = xAssignment[k]; + pTeam t = 0; + string teamText; + string bib; + xTAssignment.getObjectString("BibNumber", bib); + + if (!bib.empty()) { + teamText = bib; + t = bib2Team[bib]; + } + + if (t == 0) { + string team; + xTAssignment.getObjectString("TeamName", team); + if (!team.empty()) { + string cls; + xTAssignment.getObjectString("ClassName", cls); + t = nameClass2Team[make_pair(team, cls)]; + teamText = team + " / " + cls; + } + } + + if (t == 0) { + gdi.addString("", 0, "Varning: Laget 'X' finns inte.#" + teamText).setColor(colorRed); + continue; + } + + xmlList teamMemberAssignment; + xTAssignment.getObjects("TeamMemberCourseAssignment", teamMemberAssignment); + assignTeamCourse(gdi, *t, teamMemberAssignment, courses); + } +} + +void IOF30Interface::assignTeamCourse(gdioutput &gdi, oTeam &team, xmlList &xAssignment, + const map &courses) { + + if (!team.getClassRef()) + return; + for (size_t k = 0; k getLegNumberLinear(leg, legorder); + if (legId>=0) { + pRunner r = team.getRunner(legId); + if (r == 0) { + r = oe.addRunner(lang.tl("N.N."), team.getClubId(), team.getClassId(), 0, 0, false); + if (r) { + r->setEntrySource(entrySourceId); + r->flagEntryTouched(true); + } + team.setRunner(legId, r, false); + r = team.getRunner(legId); + } + if (r) { + r->setCourseId(c->getId()); + } + } + else + gdi.addString("", 0, "Bantilldelning för 'X' hänvisar till en sträcka som inte finns#" + team.getClass()).setColor(colorRed); + } + else { + string name; + xAssignment[k].getObjectString("TeamMemberName", name); + if (!name.empty()) { + for (int j = 0; j < team.getNumRunners(); j++) { + pRunner r = team.getRunner(j); + if (r && r->getName() == name) { + r->setCourseId(c->getId()); + break; + } + } + } + } + } +} + + +void IOF30Interface::classAssignmentObsolete(gdioutput &gdi, xmlList &xAssignment, + const map &courses, + const map > &coursesFamilies) { + map > class2Courses; + map > class2Families; + + multimap bib2Runners; + typedef multimap::iterator bibIterT; + bool b2RInit = false; + + map, pTeam> clsName2Team; + typedef map, pTeam>::iterator teamIterT; + bool c2TeamInit = false; + + for (size_t k = 0; k < xAssignment.size(); k++) { + string name = constructCourseName(xAssignment[k]); + string family; + xAssignment[k].getObjectString("CourseFamily", family); + + if ( courses.find(name) == courses.end() ) + gdi.addString("", 0, "Varning: Banan 'X' finns inte#" + name); + else { + pCourse pc = courses.find(name)->second; + xmlList xCls, xPrs; + xAssignment[k].getObjects("Class", xCls); + xAssignment[k].getObjects("Person", xPrs); + + for (size_t j = 0; j < xCls.size(); j++) { + string cName; + xCls[j].getObjectString("Name", cName); + int id = xCls[j].getObjectInt("Id"); + pClass cls = oe.getClassCreate(id, cName); + if (cls) { + class2Courses[cls->getId()].push_back(pc); + + if (!family.empty()) { + class2Families[cls->getId()].insert(family); + } + } + } + + for (size_t j = 0; j < xPrs.size(); j++) { + string bib; + int leg = xPrs[j].getObjectInt("Leg"); + int legOrder = xPrs[j].getObjectInt("LegOrder"); + + xPrs[j].getObjectString("BibNumber", bib); + if (!bib.empty()) { + if (!b2RInit) { + // Setup bib2runner map + vector r; + oe.getRunners(0, 0, r); + for (size_t i = 0; i < r.size(); i++) { + string b = r[i]->getBib(); + if (!b.empty()) + bib2Runners.insert(make_pair(b, r[i])); + } + b2RInit = true; + } + + pair range = bib2Runners.equal_range(bib); + for (bibIterT it = range.first; it != range.second; ++it) { + int ln = it->second->getLegNumber(); + int rLegNumber = 0, rLegOrder = 0; + if (it->second->getClassRef()) + it->second->getClassRef()->splitLegNumberParallel(ln, rLegNumber, rLegOrder); + bool match = true; + if (leg != 0 && leg != rLegNumber+1) + match = false; + if (legOrder != 0 && legOrder != rLegOrder+1) + match = false; + + if (match) { + it->second->setCourseId(pc->getId()); + it->second->synchronize(); + } + } + continue; + } + + string className, teamName; + xPrs[j].getObjectString("ClassName", className); + xPrs[j].getObjectString("TeamName", teamName); + + if (!teamName.empty()) { + if (!c2TeamInit) { + vector t; + oe.getTeams(0, t); + for (size_t i = 0; i < t.size(); i++) + clsName2Team[make_pair(t[i]->getClass(), t[i]->getName())] = t[i]; + c2TeamInit = true; + } + + teamIterT res = clsName2Team.find(make_pair(className, teamName)); + + if (res != clsName2Team.end()) { + pClass cls = res->second->getClassRef(); + if (cls) { + int ln = cls->getLegNumberLinear(leg, legOrder); + pRunner r = res->second->getRunner(ln); + if (r) { + r->setCourseId(pc->getId()); + r->synchronize(); + } + } + } + continue; + } + + // Note: entryId is assumed to be equal to personId, + // which is the only we have. This might not be true. + int entryId = xPrs[j].getObjectInt("EntryId"); + pRunner r = oe.getRunner(entryId, 0); + if (r) { + r->setCourseId(pc->getId()); + r->synchronize(); + } + } + } + } + + if (!class2Families.empty()) { + vector c; + oe.getClasses(c, false); + for (size_t k = 0; k < c.size(); k++) { + bool assigned = false; + + if (class2Families.count(c[k]->getId())) { + const set &families = class2Families[c[k]->getId()]; + + if (families.size() == 1) { + int nl = c[k]->getNumStages(); + const vector &crsFam = coursesFamilies.find(*families.begin())->second; + if (nl == 0) { + if (crsFam.size() == 1) + c[k]->setCourse(crsFam[0]); + else { + c[k]->setNumStages(1); + c[k]->clearStageCourses(0); + for (size_t j = 0; j < crsFam.size(); j++) + c[k]->addStageCourse(0, crsFam[j]->getId()); + } + } + else { + int nFam = crsFam.size(); + for (int i = 0; i < nl; i++) { + c[k]->clearStageCourses(i); + for (int j = 0; j < nFam; j++) + c[k]->addStageCourse(i, crsFam[(j + i)%nFam]->getId()); + } + } + assigned = true; + } + else if (families.size() > 1) { + int nl = c[k]->getNumStages(); + if (nl == 0) { + c[k]->setNumStages(families.size()); + nl = families.size(); + } + + set::const_iterator fit = families.begin(); + for (int i = 0; i < nl; i++, ++fit) { + if (fit == families.end()) + fit = families.begin(); + c[k]->clearStageCourses(i); + const vector &crsFam = coursesFamilies.find(*fit)->second; + int nFam = crsFam.size(); + for (int j = 0; j < nFam; j++) + c[k]->addStageCourse(i, crsFam[j]->getId()); + } + + assigned = true; + } + } + + if (!assigned && class2Courses.count(c[k]->getId())) { + const vector &crs = class2Courses[c[k]->getId()]; + int nl = c[k]->getNumStages(); + + if (crs.size() == 1 && nl == 0) { + c[k]->setCourse(crs[0]); + } + else if (crs.size() > 1) { + int nCrs = crs.size(); + for (int i = 0; i < nl; i++) { + c[k]->clearStageCourses(i); + for (int j = 0; j < nCrs; j++) + c[k]->addStageCourse(i, crs[(j + i)%nCrs]->getId()); + } + } + } + c[k]->synchronize(); + } + } +} + +void IOF30Interface::readCompetitorList(gdioutput &gdi, const xmlobject &xo, int &personCount) { + if (!xo) + return; + + string ver; + xo.getObjectString("iofVersion", ver); + if (!ver.empty() && ver > "3.0") + gdi.addString("", 0, "Varning, okänd XML-version X#" + ver); + + xmlList xl; + xo.getObjects(xl); + + xmlList::const_iterator it; + + for (it=xl.begin(); it != xl.end(); ++it) { + if (it->is("Competitor")) { + if (readXMLCompetitorDB(*it)) + personCount++; + } + } +} + +void IOF30Interface::readClubList(gdioutput &gdi, const xmlobject &xo, int &clubCount) { + if (!xo) + return; + + string ver; + xo.getObjectString("iofVersion", ver); + if (!ver.empty() && ver > "3.0") + gdi.addString("", 0, "Varning, okänd XML-version X#" + ver); + + xmlList xl; + xo.getObjects(xl); + + xmlList::const_iterator it; + for (it=xl.begin(); it != xl.end(); ++it) { + if (it->is("Organisation")) { + if (readOrganization(gdi, *it, true)) + clubCount++; + } + } +} + + +void IOF30Interface::readEntryList(gdioutput &gdi, xmlobject &xo, bool removeNonexiting, + int &entRead, int &entFail, int &entRemoved) { + string ver; + entRemoved = 0; + xo.getObjectString("iofVersion", ver); + if (!ver.empty() && ver > "3.0") + gdi.addString("", 0, "Varning, okänd XML-version X#" + ver); + + xmlobject xEvent = xo.getObject("Event"); + map > teamClassConfig; + map > bibPatterns; + oClass::extractBibPatterns(oe, bibPatterns); + + if (xEvent) { + readEvent(gdi, xEvent, teamClassConfig); + } + + vector allR; + vector allT; + oe.getRunners(0, 0, allR, false); + for (size_t k = 0; k < allR.size(); k++) { + if (allR[k]->getEntrySource() == entrySourceId) + allR[k]->flagEntryTouched(false); + } + + oe.getTeams(0, allT, false); + for (size_t k = 0; k < allT.size(); k++) { + if (allT[k]->getEntrySource() == entrySourceId) + allT[k]->flagEntryTouched(false); + } + + xmlList pEntries; + xo.getObjects("PersonEntry", pEntries); + map > > personId2TeamLeg; + for (size_t k = 0; k < pEntries.size(); k++) { + if (readPersonEntry(gdi, pEntries[k], 0, teamClassConfig, personId2TeamLeg)) + entRead++; + else + entFail++; + } + + xo.getObjects("TeamEntry", pEntries); + for (size_t k = 0; k < pEntries.size(); k++) { + setupClassConfig(0, pEntries[k], teamClassConfig); + } + + // Get all classes, and use existing leg info + vector allCls; + oe.getClasses(allCls, false); + for (size_t k = 0; k < allCls.size(); k++) { + if (allCls[k]->getNumStages() > 1) { + for (size_t j = 0; j < allCls[k]->getNumStages(); j++) { + int number; + int order; + allCls[k]->splitLegNumberParallel(j, number, order); + vector &li = teamClassConfig[allCls[k]->getId()]; + + if (size_t(number) >= li.size()) + li.resize(number+1); + + if (allCls[k]->getLegType(j) == LTExtra || allCls[k]->getLegType(j) == LTIgnore || allCls[k]->getLegType(j) == LTParallelOptional) + li[number].setMaxRunners(order+1); + else + li[number].setMinRunners(order+1); + } + } + } + + setupRelayClasses(teamClassConfig); + + for (size_t k = 0; k < pEntries.size(); k++) { + if (readTeamEntry(gdi, pEntries[k], bibPatterns, teamClassConfig, personId2TeamLeg)) + entRead++; + else + entFail++; + } + + bool hasMulti = false; + for (map > >::iterator it = personId2TeamLeg.begin(); + it != personId2TeamLeg.end(); ++it) { + if (it->second.size() > 1) { + hasMulti = true; + break; + } + } + + // Analyze equivalences of legs + map > > classLegEqClasses; + + for (map > >::iterator it = personId2TeamLeg.begin(); + it != personId2TeamLeg.end(); ++it) { + const vector< pair > &teamLeg = it->second; + if (teamLeg.empty()) + continue; // Should not happen + int minLeg = teamLeg.front().second; + int teamId = teamLeg.front().first; + bool inconsistentTeam = false; + + for (size_t i = 1; i < teamLeg.size(); i++) { + if (teamLeg[i].first != teamId) { + inconsistentTeam = true; + break; + } + if (teamLeg[i].second < minLeg) + minLeg = teamLeg[i].second; + } + + if (!inconsistentTeam) { + pTeam t = oe.getTeam(teamId); + if (t) { + if (minLeg != teamLeg.front().second) { + pRunner r = t->getRunner(teamLeg.front().second); + t->setRunner(minLeg, r, true); + t->synchronize(true); + } + + // If multi, for each class, store how the legs was multiplied + if (hasMulti) { + vector key(it->second.size()); + for (size_t j = 0; j < key.size(); j++) + key[j] = it->second[j].second; + + sort(key.begin(), key.end()); + classLegEqClasses[t->getClassId()].insert(key); + } + } + } + } + + for (map > >::const_iterator it = classLegEqClasses.begin(); + it != classLegEqClasses.end(); ++it) { + const set< vector > &legEq = it->second; + pClass cls = oe.getClass(it->first); + if (!cls) + continue; + bool invalid = false; + vector specification(cls->getNumStages(), -2); + for (set< vector >::const_iterator eqit = legEq.begin(); eqit != legEq.end(); ++eqit) { + const vector &eq = *eqit; + for (size_t j = 0; j < eq.size(); j++) { + size_t ix = eq[j]; + if (ix >= specification.size()) { + invalid = true; + break; // Internal error? + } + if (j == 0) { // Base leg + if (specification[ix] >= 0) { + invalid = true; + break; // Inconsistent specification + } + else { + specification[ix] = -1; + } + } + else { // Duplicated leg + if (specification[ix] == -1 || (specification[ix] >= 0 && specification[ix] != eq[0])) { + invalid = true; + break; // Inconsistent specification + } + else { + specification[ix] = eq[0]; // Specify duplication of base leg + } + } + } + } + if (invalid) + continue; + + vector teams; + oe.getTeams(it->first, teams); + + // Check that the guessed specification is compatible with all current teams + for (size_t j = 0; j < specification.size(); j++) { + if (specification[j] >= 0) { + // Check that leg is not occupied + for (size_t i = 0; i < teams.size(); i++) { + if (teams[i]->getRunner(j) && teams[i]->getRunner(j)->getRaceNo() == 0) { + invalid = true; + break; + } + } + } + } + + if (invalid) + continue; + + for (size_t j = 0; j < specification.size(); j++) { + if (specification[j] >= 0) { + cls->setLegRunner(j, specification[j]); + } + } + oe.adjustTeamMultiRunners(cls); + } + + if (removeNonexiting && entRead > 0) { + for (size_t k = 0; k < allT.size(); k++) { + if (allT[k]->getEntrySource() == entrySourceId && !allT[k]->isEntryTouched()) { + oe.removeTeam(allT[k]->getId()); + gdi.addString("", 0, "Tar bort X#" + allT[k]->getName()); + entRemoved++; + } + /*else { + for (int i = 0; i < allT[k]->getNumRunners(); i++) { + pRunner r = allT[k]->getRunner(i); + if (r) + r->flagEntryTouched(true); + } + }*/ + } + + vector rids; + for (size_t k = 0; k < allR.size(); k++) { + if (allR[k]->getEntrySource() == entrySourceId && !allR[k]->isEntryTouched() && !allR[k]->getTeam()) { + entRemoved++; + gdi.addString("", 0, "Tar bort X#" + allR[k]->getCompleteIdentification()); + rids.push_back(allR[k]->getId()); + } + } + if (!rids.empty()) + oe.removeRunner(rids); + } +} + + +void IOF30Interface::readStartList(gdioutput &gdi, xmlobject &xo, int &entRead, int &entFail) { + string ver; + xo.getObjectString("iofVersion", ver); + if (!ver.empty() && ver > "3.0") + gdi.addString("", 0, "Varning, okänd XML-version X#" + ver); + + map > teamClassConfig; + + xmlobject xEvent = xo.getObject("Event"); + if (xEvent) { + readEvent(gdi, xEvent, teamClassConfig); + } + + xmlList cStarts; + xo.getObjects("ClassStart", cStarts); + + struct RaceInfo { + int courseId; + int length; + int climb; + string startName; + }; + + for (size_t k = 0; k < cStarts.size(); k++) { + xmlobject &xClassStart = cStarts[k]; + + pClass pc = readClass(xClassStart.getObject("Class"), + teamClassConfig); + int classId = pc ? pc->getId() : 0; + + + map raceToInfo; + + xmlList courses; + xClassStart.getObjects("Course", courses); + for (size_t k = 0; k < courses.size(); k++) { + int raceNo = courses[k].getObjectInt("raceNumber"); + if (raceNo > 0) + raceNo--; + RaceInfo &raceInfo = raceToInfo[raceNo]; + + raceInfo.courseId = courses[k].getObjectInt("Id"); + raceInfo.length = courses[k].getObjectInt("Length"); + raceInfo.climb = courses[k].getObjectInt("Climb"); + } + + xmlList startNames; + xClassStart.getObjects("StartName", startNames); + for (size_t k = 0; k < startNames.size(); k++) { + int raceNo = startNames[k].getObjectInt("raceNumber"); + if (raceNo > 0) + raceNo--; + RaceInfo &raceInfo = raceToInfo[raceNo]; + startNames[k].getObjectString(0, raceInfo.startName); + pc->setStart(raceInfo.startName); + } + + if (raceToInfo.size() == 1) { + RaceInfo &raceInfo = raceToInfo.begin()->second; + if (raceInfo.courseId > 0) { + if (pc->getCourse() == 0) { + pCourse crs = oe.addCourse(pc->getName(), raceInfo.length, raceInfo.courseId); + crs->setStart(raceInfo.startName, false); + crs->getDI().setInt("Climb", raceInfo.climb); + pc->setCourse(crs); + crs->synchronize(); + } + } + } + else if (raceToInfo.size() > 1) { + } + + xmlList xPStarts; + xClassStart.getObjects("PersonStart", xPStarts); + map > bibPatterns; + oClass::extractBibPatterns(oe, bibPatterns); + + for (size_t k = 0; k < xPStarts.size(); k++) { + if (readPersonStart(gdi, pc, xPStarts[k], 0, teamClassConfig)) + entRead++; + else + entFail++; + } + + xmlList tEntries; + xClassStart.getObjects("TeamStart", tEntries); + for (size_t k = 0; k < tEntries.size(); k++) { + setupClassConfig(classId, tEntries[k], teamClassConfig); + } + + //setupRelayClasses(teamClassConfig); + if (pc && teamClassConfig.count(pc->getId()) && !teamClassConfig[pc->getId()].empty()) { + setupRelayClass(pc, teamClassConfig[pc->getId()]); + } + + for (size_t k = 0; k < tEntries.size(); k++) { + if (readTeamStart(gdi, pc, tEntries[k], bibPatterns, teamClassConfig)) + entRead++; + else + entFail++; + } + + pc->synchronize(); + } +} + +void IOF30Interface::readClassList(gdioutput &gdi, xmlobject &xo, int &entRead, int &entFail) { + string ver; + xo.getObjectString("iofVersion", ver); + if (!ver.empty() && ver > "3.0") + gdi.addString("", 0, "Varning, okänd XML-version X#" + ver); + + map > teamClassConfig; + + xmlobject xEvent = xo.getObject("Event"); + if (xEvent) { + readEvent(gdi, xEvent, teamClassConfig); + } + + xmlList cClass; + xo.getObjects("Class", cClass); + + + for (size_t k = 0; k < cClass.size(); k++) { + xmlobject &xClass = cClass[k]; + + pClass pc = readClass(xClass, teamClassConfig); + + if (pc) + entRead++; + else + entFail++; + + if (pc && teamClassConfig.count(pc->getId()) && !teamClassConfig[pc->getId()].empty()) { + setupRelayClass(pc, teamClassConfig[pc->getId()]); + } + + pc->synchronize(); + } +} + +void IOF30Interface::readEventList(gdioutput &gdi, xmlobject &xo) { + if (!xo) + return; + + string ver; + xo.getObjectString("iofVersion", ver); + if (!ver.empty() && ver > "3.0") + gdi.addString("", 0, "Varning, okänd XML-version X#" + ver); + + xmlList xl; + xo.getObjects(xl); + + xmlList::const_iterator it; + map > teamClassConfig; + for (it=xl.begin(); it != xl.end(); ++it) { + if (it->is("Event")) { + readEvent(gdi, *it, teamClassConfig); + return; + } + } +} + +void IOF30Interface::readEvent(gdioutput &gdi, const xmlobject &xo, + map > &teamClassConfig) { + + string name; + xo.getObjectString("Name", name); + oe.setName(name); + + int id = xo.getObjectInt("Id"); + if (id>0) { + oe.setExtIdentifier(id); + entrySourceId = id; + } + else { + entrySourceId = 1; // Use this as a default number for "imported entries" + } + + xmlobject date = xo.getObject("StartTime"); + + if (date) { + string dateStr; + date.getObjectString("Date", dateStr); + oe.setDate(dateStr); + string timeStr; + date.getObjectString("Time", timeStr); + if (!timeStr.empty()) { + int t = convertAbsoluteTimeISO(timeStr); + if (t >= 0 && oe.getNumRunners() == 0) { + int zt = t - 3600; + if (zt < 0) + zt += 3600*24; + oe.setZeroTime(formatTimeHMS(zt)); + } + } + //oe.setZeroTime(...); + } + + xmlobject xOrg = xo.getObject("Organiser"); + oDataInterface DI = oe.getDI(); + + if (xOrg) { + string name; + xOrg.getObjectString("Name", name); + if (name.length() > 0) + DI.setString("Organizer", name); + + xmlobject address = xOrg.getObject("Address"); + + string tmp; + + if (address) { + DI.setString("CareOf", address.getObjectString("CareOf", tmp)); + DI.setString("Street", address.getObjectString("Street", tmp)); + string city, zip, state; + address.getObjectString("City", city); + address.getObjectString("ZipCode", zip); + address.getObjectString("State", state); + if (state.empty()) + DI.setString("Address", zip + " " + city); + else + DI.setString("Address", state + ", " + zip + " " + city); + } + + xmlList xContact; + xOrg.getObjects("Contact", xContact); + + string phone; + for (size_t k = 0; k < xContact.size(); k++) { + string type; + xContact[k].getObjectString("type", type); + string c; + xContact[k].getObjectString(0, c); + + if (type == "PhoneNumber" || "MobilePhoneNumber") + phone += phone.empty() ? c : ", " + c; + else if (type == "EmailAddress") + DI.setString("EMail", c); + else if (type == "WebAddress") + DI.setString("Homepage", c); + } + if (!phone.empty()) + DI.setString("Phone", phone); + } + + string account; + xo.getObjectString("Account", account); + if (!account.empty()) + DI.setString("Account", account); + + xmlList xClass; + xo.getObjects("Class", xClass); + for (size_t k = 0; k < xClass.size(); k++) + readClass(xClass[k], teamClassConfig); + + if (!feeStatistics.empty()) { + set fees; + set factors; + for (size_t i = 0; i < feeStatistics.size(); i++) { + int fee = int(100 * feeStatistics[i].fee); + int factor = int(100 * feeStatistics[i].lateFactor) - 100; + fees.insert(fee); + if (factor > 0) + factors.insert(factor); + } + int n = 0, y = 0, e = 0; + + if (fees.size() >= 3) { + y = *fees.begin(); + fees.erase(fees.begin()); + n = *fees.begin(); + fees.erase(fees.begin()); + e = *fees.rbegin(); + } + else if (fees.size() == 2) { + y = *fees.begin(); + fees.erase(fees.begin()); + e = n = *fees.begin(); + } + else if (fees.size() == 1) { + e = n = y = *fees.begin(); + } + + if (n > 0) { + DI.setInt("EliteFee", oe.interpretCurrency(double(e) * 0.01, "")); + DI.setInt("EntryFee", oe.interpretCurrency(double(n) * 0.01, "")); + DI.setInt("YouthFee", oe.interpretCurrency(double(y) * 0.01, "")); + } + + if (!factors.empty()) { + char lf[16]; + sprintf_s(lf, "%d %%", *factors.rbegin()); + DI.setString("LateEntryFactor", lf); + } + } + oe.synchronize(); +} + +void IOF30Interface::setupClassConfig(int classId, const xmlobject &xTeam, map > &teamClassConfig) { + + // Get class + xmlobject xClass = xTeam.getObject("Class"); + if (xClass) { + pClass pc = readClass(xClass, teamClassConfig); + classId = pc->getId(); + } + vector &teamClass = teamClassConfig[classId]; + + // Get team entriess + xmlList xEntries; + xTeam.getObjects("TeamEntryPerson", xEntries); + for (size_t k = 0; k < xEntries.size(); k++) { + int leg = xEntries[k].getObjectInt("Leg"); + int legorder = xEntries[k].getObjectInt("LegOrder"); + leg = max(0, leg - 1); + legorder = max(1, legorder); + if (int(teamClass.size()) <= leg) + teamClass.resize(leg + 1); + teamClass[leg].setMaxRunners(legorder); + } + + // Get team starts + xmlList xMemberStarts; + xTeam.getObjects("TeamMemberStart", xMemberStarts); + for (size_t k = 0; k < xMemberStarts.size(); k++) { + xmlList xStarts; + xMemberStarts[k].getObjects("Start", xStarts); + for (size_t j = 0; j < xStarts.size(); j++) { + int leg = xStarts[j].getObjectInt("Leg"); + int legorder = xStarts[j].getObjectInt("LegOrder"); + leg = max(0, leg - 1); + legorder = max(1, legorder); + if (int(teamClass.size()) <= leg) + teamClass.resize(leg + 1); + teamClass[leg].setMaxRunners(legorder); + } + } +} + +pTeam IOF30Interface::readTeamEntry(gdioutput &gdi, xmlobject &xTeam, + map > &bibPatterns, + const map > &teamClassConfig, + map > > &personId2TeamLeg) { + + bool newTeam; + pTeam t = getCreateTeam(gdi, xTeam, newTeam); + + if (!t) + return 0; + + // Class + map > localTeamClassConfig; + pClass pc = readClass(xTeam.getObject("Class"), localTeamClassConfig); + + if (pc && (t->getClassId() == 0 || !t->hasFlag(oAbstractRunner::FlagUpdateClass)) ) { + t->setClassId(pc->getId(), false); + } + string bib; + xTeam.getObjectString("BibNumber", bib); + char pat[32]; + int no = oClass::extractBibPattern(bib, pat); + if (no > 0 && t->getBib().empty()) + t->setBib(bib, no, true, false); + else if (newTeam) { + pair autoBib = pc->getNextBib(bibPatterns); + if (autoBib.first > 0) { + t->setBib(autoBib.second, autoBib.first, true, false); + } + } + + oDataInterface di = t->getDI(); + if (newTeam) { + string entryTime; + xTeam.getObjectString("EntryTime", entryTime); + di.setDate("EntryDate", entryTime); + } + + double fee = 0, paid = 0, taxable = 0, percentage = 0; + string currency; + xmlList xAssigned; + xTeam.getObjects("AssignedFee", xAssigned); + for (size_t j = 0; j < xAssigned.size(); j++) { + getAssignedFee(xAssigned[j], fee, paid, taxable, percentage, currency); + } + fee += fee * percentage; // OLA / Eventor stupidity + + di.setInt("Fee", oe.interpretCurrency(fee, currency)); + di.setInt("Paid", oe.interpretCurrency(paid, currency)); + di.setInt("Taxable", oe.interpretCurrency(fee, currency)); + + xmlList xEntries; + xTeam.getObjects("TeamEntryPerson", xEntries); + + for (size_t k = 0; ksynchronize(); + return t; +} + +pTeam IOF30Interface::readTeamStart(gdioutput &gdi, pClass pc, xmlobject &xTeam, + map > &bibPatterns, + const map > &teamClassConfig) { + bool newTeam; + pTeam t = getCreateTeam(gdi, xTeam, newTeam); + + if (!t) + return 0; + + // Class + if (pc && (t->getClassId() == 0 || !t->hasFlag(oAbstractRunner::FlagUpdateClass)) ) + t->setClassId(pc->getId(), false); + + string bib; + xTeam.getObjectString("BibNumber", bib); + char pat[32]; + int no = oClass::extractBibPattern(bib, pat); + if (no > 0 && t->getBib().empty()) + t->setBib(bib, no, true, false); + else if (newTeam){ + pair autoBib = pc->getNextBib(bibPatterns); + if (autoBib.first > 0) { + t->setBib(autoBib.second, autoBib.first, true, false); + } + } + xmlList xEntries; + xTeam.getObjects("TeamMemberStart", xEntries); + + for (size_t k = 0; ksynchronize(); + return t; +} + +pTeam IOF30Interface::getCreateTeam(gdioutput &gdi, const xmlobject &xTeam, bool &newTeam) { + newTeam = false; + string name; + xTeam.getObjectString("Name", name); + + if (name.empty()) + return 0; + + int id = xTeam.getObjectInt("Id"); + pTeam t = 0; + + if (id) + t = oe.getTeam(id); + else + t = oe.getTeamByName(name); + + if (!t) { + if (id > 0) { + oTeam tr(&oe, id); + t = oe.addTeam(tr, true); + } + else { + oTeam tr(&oe); + t = oe.addTeam(tr, true); + } + newTeam = true; + } + + if (!t) + return 0; + + t->setEntrySource(entrySourceId); + t->flagEntryTouched(true); + if (t->getName().empty() || !t->hasFlag(oAbstractRunner::FlagUpdateName)) + t->setName(name, false); + + // Club + pClub c = 0; + xmlList xOrgs; + xTeam.getObjects("Organisation", xOrgs); + if (xOrgs.empty()) + xTeam.getObjects("Organization", xOrgs); + + for (size_t k = 0; k < xOrgs.size(); k++) { + if (c == 0) + c = readOrganization(gdi, xOrgs[k], false); + else + readOrganization(gdi, xOrgs[k], false);// Just include in competition + } + + if (c) + t->setClubId(c->getId()); + + return t; +} + +int IOF30Interface::getIndexFromLegPos(int leg, int legorder, const vector &setup) { + int ix = 0; + for (int k = 0; k < leg - 1; k++) + ix += k < int(setup.size()) ? max(setup[k].maxRunners, 1) : 1; + if (legorder > 0) + ix += legorder - 1; + return ix; +} + +pRunner IOF30Interface::readPersonEntry(gdioutput &gdi, xmlobject &xo, pTeam team, + const map > &teamClassConfig, + map > > &personId2TeamLeg) { + xmlobject xPers = xo.getObject("Person"); + // Card + const int cardNo = xo.getObjectInt("ControlCard"); + + pRunner r = 0; + + if (xPers) + r = readPerson(gdi, xPers); + + if (cardNo > 0 && r == 0 && team) { + // We got no person, but a card number. Add the runner anonymously. + r = oe.addRunner(lang.tl("N.N."), team->getClubId(), team->getClassId(), cardNo, 0, false); + r->flagEntryTouched(true); + r->setEntrySource(entrySourceId); + r->synchronize(); + } + + if (r == 0) + return 0; + + // Club + pClub c = readOrganization(gdi, xo.getObject("Organisation"), false); + if (!c) + c = readOrganization(gdi, xo.getObject("Organization"), false); + + if (c) + r->setClubId(c->getId()); + + // Class + map > localTeamClassConfig; + pClass pc = readClass(xo.getObject("Class"), localTeamClassConfig); + + if (pc && (r->getClassId() == 0 || !r->hasFlag(oAbstractRunner::FlagUpdateClass)) ) + r->setClassId(pc->getId(), false); + + if (team) { + int leg = xo.getObjectInt("Leg"); + int legorder = xo.getObjectInt("LegOrder"); + int legindex = max(0, leg - 1); + map >::const_iterator res = teamClassConfig.find(team->getClassId()); + if (res != teamClassConfig.end()) { + legindex = getIndexFromLegPos(leg, legorder, res->second); + } + + if (personId2TeamLeg.find(r->getId()) == personId2TeamLeg.end()) { + if (team->getClassRef()) + legindex = team->getClassRef()->getLegRunner(legindex); + + // Ensure unique + team->setRunner(legindex, r, false); + if (r->getClubId() == 0) + r->setClubId(team->getClubId()); + } + personId2TeamLeg[r->getId()].push_back(make_pair(team->getId(), legindex)); + } + + // Card + if (cardNo > 0) + r->setCardNo(cardNo, false); + + oDataInterface di = r->getDI(); + + string entryTime; + xo.getObjectString("EntryTime", entryTime); + di.setDate("EntryDate", entryTime); + + double fee = 0, paid = 0, taxable = 0, percentage = 0; + string currency; + xmlList xAssigned; + xo.getObjects("AssignedFee", xAssigned); + for (size_t j = 0; j < xAssigned.size(); j++) { + getAssignedFee(xAssigned[j], fee, paid, taxable, percentage, currency); + } + fee += fee * percentage; // OLA / Eventor stupidity + + di.setInt("Fee", oe.interpretCurrency(fee, currency)); + di.setInt("Paid", oe.interpretCurrency(paid, currency)); + di.setInt("Taxable", oe.interpretCurrency(fee, currency)); + + r->synchronize(); + return r; +} + +pRunner IOF30Interface::readPersonStart(gdioutput &gdi, pClass pc, xmlobject &xo, pTeam team, + const map > &teamClassConfig) { + xmlobject xPers = xo.getObject("Person"); + pRunner r = 0; + if (xPers) + r = readPerson(gdi, xPers); + if (r == 0) + return 0; + + // Club + pClub c = readOrganization(gdi, xo.getObject("Organisation"), false); + if (!c) + c = readOrganization(gdi, xo.getObject("Organization"), false); + + if (c) + r->setClubId(c->getId()); + + xmlList starts; + xo.getObjects("Start", starts); + + for (size_t k = 0; k < starts.size(); k++) { + int race = starts[k].getObjectInt("raceNumber"); + pRunner rRace = r; + if (race > 1 && r->getNumMulti() > 0) { + pRunner rr = r->getMultiRunner(race - 1); + if (rr) + rRace = rr; + } + if (rRace) { + // Card + int cardNo = starts[k].getObjectInt("ControlCard"); + if (cardNo > 0) + rRace->setCardNo(cardNo, false); + + xmlobject startTime = starts[k].getObject("StartTime"); + + if (team) { + int leg = starts[k].getObjectInt("Leg"); + int legorder = starts[k].getObjectInt("LegOrder"); + int legindex = max(0, leg - 1); + map >::const_iterator res = teamClassConfig.find(team->getClassId()); + if (res != teamClassConfig.end()) { + legindex = getIndexFromLegPos(leg, legorder, res->second); + } + team->setRunner(legindex, rRace, false); + if (rRace->getClubId() == 0) + rRace->setClubId(team->getClubId()); + + if (startTime && pc) { + pc->setStartType(legindex, STDrawn, false); + + } + } + + string bib; + starts[k].getObjectString("BibNumber", bib); + rRace->getDI().setString("Bib", bib); + + rRace->setStartTime(parseISO8601Time(startTime), true, false); + } + } + + if (pc && (r->getClassId() == 0 || !r->hasFlag(oAbstractRunner::FlagUpdateClass)) ) + r->setClassId(pc->getId(), true); + + r->synchronize(); + return r; +} + + + +pRunner IOF30Interface::readPerson(gdioutput &gdi, const xmlobject &person) { + + xmlobject pname = person.getObject("Name"); + + string name; + + if (pname) { + string given, family; + //name = getFirst(pname.getObjectString("Given", given), 2)+ " " +pname.getObjectString("Family", family); + name = pname.getObjectString("Family", family) + ", " + getFirst(pname.getObjectString("Given", given), 2); + } + else { + name = lang.tl("N.N."); + } + + string sid; + person.getObjectString("Id", sid); + __int64 extId = oBase::converExtIdentifierString(sid); + int pid = oBase::idFromExtId(extId); + pRunner r = 0; + + if (pid) { + r = oe.getRunner(pid, 0); + while (r) { // Check that the exact match is OK + if (extId != r->getExtIdentifier()) + break; + pid++; + r = oe.getRunner(pid, 0); + } + + if (r) { + // Check that a with this id runner does not happen to exist with a different source + if (entrySourceId>0 && r->getEntrySource() != entrySourceId) { + r = 0; + pid = 0; + } + else if (entrySourceId == 0) { + string canName = canonizeName(name.c_str()); + string canOldName = canonizeName(r->getName().c_str()); + if (canName != canOldName) { + r = 0; + pid = 0; + } + } + } + } + + if (!r) { + if ( pid > 0) { + oRunner or(&oe, pid); + r = oe.addRunner(or, true); + } + else { + oRunner or(&oe); + r = oe.addRunner(or, true); + } + } + + r->setEntrySource(entrySourceId); + r->flagEntryTouched(true); + + if (!r->hasFlag(oAbstractRunner::FlagUpdateName)) { + r->setName(name, false); + } + + r->setExtIdentifier(extId); + + oDataInterface DI=r->getDI(); + string tmp; + + PersonSex s = interpretSex(person.getObjectString("sex", tmp)); + if (s != sUnknown) + r->setSex(s); + person.getObjectString("BirthDate", tmp); + if (tmp.length()>=4) { + tmp = tmp.substr(0, 4); + r->setBirthYear(atoi(tmp.c_str())); + } + + getNationality(person.getObject("Nationality"), DI); + + return r; +} + +pClub IOF30Interface::readOrganization(gdioutput &gdi, const xmlobject &xclub, bool saveToDB) { + if (!xclub) + return 0; + string clubIdS; + xclub.getObjectString("Id", clubIdS); + __int64 extId = oBase::converExtIdentifierString(clubIdS); + int clubId = oBase::idFromExtId(extId); + string name, shortName; + xclub.getObjectString("Name", name); + xclub.getObjectString("ShortName", shortName); + + if (shortName.length() > 4 && shortName.length() < name.length()) + swap(name, shortName); + + if (name.length()==0 || !IsCharAlphaNumeric(name[0])) + return 0; + + pClub pc=0; + + if ( !saveToDB ) { + if (clubId) + pc = oe.getClubCreate(clubId, name); + + if (!pc) return false; + } + else { + pc = new oClub(&oe, clubId); + //pc->setID->Id = clubId; + } + + pc->setName(name); + + pc->setExtIdentifier(extId); + + oDataInterface DI=pc->getDI(); + + string tmp; + + int district = xclub.getObjectInt("ParentOrganisationId"); + if (district > 0) + DI.setInt("District", district); + + xmlobject address = xclub.getObject("Address"); + + if (shortName.length() <= 4) + DI.setString("ShortName", shortName); + + string str; + + if (address) { + DI.setString("CareOf", address.getObjectString("CareOf", tmp)); + DI.setString("Street", address.getObjectString("Street", tmp)); + DI.setString("City", address.getObjectString("City", tmp)); + DI.setString("ZIP", address.getObjectString("ZipCode", tmp)); + DI.setString("State", address.getObjectString("State", tmp)); + getNationality(address.getObject("Country"), DI); + } + + xmlList xContact; + xclub.getObjects("Contact", xContact); + + string phone; + for (size_t k = 0; k < xContact.size(); k++) { + string type; + xContact[k].getObjectString("type", type); + string c; + xContact[k].getObjectString(0, c); + + if (type == "PhoneNumber" || type == "MobilePhoneNumber") + phone += phone.empty() ? c : ", " + c; + else if (type == "EmailAddress") + DI.setString("EMail", c); + } + DI.setString("Phone", phone); + + getNationality(xclub.getObject("Country"), DI); + + xclub.getObjectString("type", str); + if (!str.empty()) + DI.setString("Type", str); + + if (saveToDB) { + oe.getRunnerDatabase().importClub(*pc, false); + delete pc; + } + else { + pc->synchronize(); + } + + return pc; +} + +void IOF30Interface::getNationality(const xmlobject &xCountry, oDataInterface &di) { + if (xCountry) { + string code, country; + + xCountry.getObjectString("code", code); + xCountry.getObjectString(0, country); + + if (!code.empty()) + di.setString("Nationality", code); + + if (!country.empty()) + di.setString("Country", country); + } +} + +void IOF30Interface::getAmount(const xmlobject &xAmount, double &amount, string ¤cy) { + amount = 0; // Do no clear currency. It is filled in where found (and assumed to be constant) + if (xAmount) { + string tmp; + xAmount.getObjectString(0, tmp); + amount = atof(tmp.c_str()); + xAmount.getObjectString("currency", currency); + } +} + +void IOF30Interface::getFeeAmounts(const xmlobject &xFee, double &fee, double &taxable, double &percentage, string ¤cy) { + xmlobject xAmount = xFee.getObject("Amount"); + xmlobject xPercentage = xFee.getObject("Percentage"); // Eventor / OLA stupidity + if (xPercentage) { + string tmp; + xPercentage.getObjectString(0, tmp); + percentage = atof(tmp.c_str()) * 0.01; + } + else + getAmount(xAmount, fee, currency); + getAmount(xFee.getObject("TaxableAmount"), taxable, currency); +} + +void IOF30Interface::getAssignedFee(const xmlobject &xFee, double &fee, double &paid, double &taxable, double &percentage, string ¤cy) { + currency.clear(); + if (xFee) { + getFeeAmounts(xFee.getObject("Fee"), fee, taxable, percentage, currency); + getAmount(xFee.getObject("PaidAmount"), paid, currency); + } +} + +void IOF30Interface::getFee(const xmlobject &xFee, FeeInfo &fee) { + getFeeAmounts(xFee, fee.fee, fee.taxable, fee.percentage, fee.currency); + + xFee.getObjectString("ValidFromTime", fee.fromTime); + xFee.getObjectString("ValidToTime", fee.toTime); + + xFee.getObjectString("FromDateOfBirth", fee.fromBirthDate); + xFee.getObjectString("ToDateOfBirth", fee.toBirthDate); +} + +void IOF30Interface::writeAmount(xmlparser &xml, const char *tag, int amount) const { + if (amount > 0) { + string code = oe.getDCI().getString("CurrencyCode"); + if (code.empty()) + xml.write(tag, oe.formatCurrency(amount, false)); + else + xml.write(tag, "currency", code, oe.formatCurrency(amount, false)); + } +} + +void IOF30Interface::writeAssignedFee(xmlparser &xml, const oAbstractRunner &tr, int paidForCard) const { + const oDataConstInterface dci = tr.getDCI(); + int fee = dci.getInt("Fee"); + int taxable = dci.getInt("Taxable"); + int paid = dci.getInt("Paid"); + + if (fee == 0 && taxable == 0 && paid == 0) + return; + + if (paid >= paidForCard) { + paid -= paidForCard; // Included in card service fee + } + const pClass pc = tr.getClassRef(); + if (!splitLateFee || !pc || !tr.hasLateEntryFee()) { + xml.startTag("AssignedFee"); + string type = tr.hasLateEntryFee() ? "Late" : "Normal"; + xml.startTag("Fee", "type", type); + xml.write("Name", "Entry fee"); + writeAmount(xml, "Amount", fee); + writeAmount(xml, "TaxableAmount", taxable); + xml.endTag(); + + writeAmount(xml, "PaidAmount", paid); + xml.endTag(); + } + else { + int normalFee = pc->getDCI().getInt("ClassFee"); + + int feeSplit[2] = {fee, 0}; + int paidSplit[2] = {paid, 0}; + if (normalFee > 0) { + feeSplit[0] = min(normalFee, fee); + feeSplit[1] = max(0, fee - feeSplit[0]); + + paidSplit[0] = min(paid, feeSplit[0]); + paidSplit[1] = max(0, paid - paidSplit[0]); + } + + for (int ft = 0; ft < 2; ft++) { + xml.startTag("AssignedFee"); + string type = ft == 1 ? "Late" : "Normal"; + xml.startTag("Fee", "type", type); + xml.write("Name", "Entry fee"); + writeAmount(xml, "Amount", feeSplit[ft]); + if (ft == 0) + writeAmount(xml, "TaxableAmount", taxable); + xml.endTag(); + + writeAmount(xml, "PaidAmount", paidSplit[ft]); + xml.endTag(); + } + } +} + +void IOF30Interface::writeRentalCardService(xmlparser &xml, int cardFee, bool paid) const { + xml.startTag("ServiceRequest"); { + + xml.startTag("Service", "type", "RentalCard"); { + xml.write("Name", "Card Rental"); + } + xml.endTag(); + + xml.write("RequestedQuantity", "1"); + + xml.startTag("AssignedFee"); { + xml.startTag("Fee"); { + xml.write("Name", "Card Rental Fee"); + writeAmount(xml, "Amount", cardFee); + } + xml.endTag(); + + if (paid) { + writeAmount(xml, "PaidAmount", cardFee); + } + } + xml.endTag(); + } + xml.endTag(); +} + +void IOF30Interface::getAgeLevels(const vector &fees, const vector &ix, + int &normalIx, int &redIx, string &youthLimit, string &seniorLimit) { + assert(!ix.empty()); + if (ix.size() == 1) { + normalIx = ix[0]; + redIx = ix[0]; + return; + } + else { + normalIx = redIx = ix[0]; + for (size_t k = 0; k < ix.size(); k++) { + if (fees[ix[k]] < fees[redIx]) + redIx = ix[k]; + if (fees[normalIx] < fees[ix[k]]) + normalIx = ix[k]; + + const string &to = fees[ix[k]].toBirthDate; + const string &from = fees[ix[k]].fromBirthDate; + + if (!from.empty() && (youthLimit.empty() || youthLimit > from)) + youthLimit = from; + + if (!to.empty() && (seniorLimit.empty() || seniorLimit > to)) + seniorLimit = to; + } + } +} + +int getAgeFromDate(const string &date) { + int y = getThisYear(); + SYSTEMTIME st; + convertDateYMS(date, st, false); + if (st.wYear > 1900) + return y - st.wYear; + else + return 0; +} + +void IOF30Interface::FeeInfo::add(IOF30Interface::FeeInfo &fi) { + fee += fi.fee; + fee += fee*percentage; + + taxable += fi.taxable; + + if (fi.toTime.empty() || (fi.toTime > fromTime && !fromTime.empty())) { + fi.toTime = fromTime; + if (!fi.toTime.empty()) { + SYSTEMTIME st; + convertDateYMS(fi.toTime, st, false); + __int64 sec = SystemTimeToInt64Second(st); + sec -= 3600; + fi.toTime = convertSystemDate(Int64SecondToSystemTime(sec)); + } + } + //if (fi.fromTime.empty() || (fi.fromTime < toTime && !toTime.empty())) + // fi.fromTime = toTime; +} + +pClass IOF30Interface::readClass(const xmlobject &xclass, + map > &teamClassConfig) { + if (!xclass) + return 0; + int classId = xclass.getObjectInt("Id"); + string name, shortName, longName; + xclass.getObjectString("Name", name); + xclass.getObjectString("ShortName", shortName); + + if (!shortName.empty()) { + longName = name; + name = shortName; + } + + pClass pc = 0; + + if (classId) { + pc = oe.getClass(classId); + + if (!pc) { + oClass c(&oe, classId); + pc = oe.addClass(c); + } + } + else + pc = oe.addClass(name); + + oDataInterface DI = pc->getDI(); + + if (!longName.empty()) { + pc->setName(name); + DI.setString("LongName", longName); + } + else { + if (pc->getName() != name && DI.getString("LongName") != name) + pc->setName(name); + } + xmlList legs; + xclass.getObjects("Leg", legs); + if (!legs.empty()) { + vector &legInfo = teamClassConfig[pc->getId()]; + if (legInfo.size() < legs.size()) + legInfo.resize(legs.size()); + + for (size_t k = 0; k < legs.size(); k++) { + legInfo[k].setMaxRunners(legs[k].getObjectInt("maxNumberOfCompetitors")); + legInfo[k].setMinRunners(legs[k].getObjectInt("minNumberOfCompetitors")); + } + } + + string tmp; + // Status + xclass.getObjectString("Status", tmp); + + if (tmp == "Invalidated") + DI.setString("Status", "I"); // No refund + else if (tmp == "InvalidatedNoFee") + DI.setString("Status", "IR"); // Refund + + // No timing + xclass.getObjectString("resultListMode", tmp); + if (tmp == "UnorderedNoTimes") + pc->setNoTiming(true); + + int minAge = xclass.getObjectInt("minAge"); + if (minAge > 0) + DI.setInt("LowAge", minAge); + + int highAge = xclass.getObjectInt("maxAge"); + if (highAge > 0) + DI.setInt("HighAge", highAge); + + xclass.getObjectString("sex", tmp); + if (!tmp.empty()) + DI.setString("Sex", tmp); + + xmlobject type = xclass.getObject("ClassType"); + if (type) { + DI.setString("ClassType", type.getObjectString("Id", tmp)); + } + + // XXX we only care about the existance of one race class + xmlobject raceClass = xclass.getObject("RaceClass"); + + if (raceClass) { + xmlList xFees; + raceClass.getObjects("Fee", xFees); + if (xFees.size() > 0) { + vector fees(xFees.size()); + int feeIx = 0; + int feeLateIx = 0; + int feeRedIx = 0; + int feeRedLateIx = 0; + + map > feePeriods; + for (size_t k = 0; k < xFees.size(); k++) { + getFee(xFees[k], fees[k]); + } + + for (size_t k = 0; k < fees.size(); k++) { + for (size_t j = k+1; j < fees.size(); j++) { + if (fees[k].includes(fees[j])) + fees[j].add(fees[k]); + if (fees[j].includes(fees[k])) + fees[k].add(fees[j]); + } + feePeriods[fees[k].getDateKey()].push_back(k); + } + + string youthLimit; + string seniorLimit; + + vector &earlyEntry = feePeriods.begin()->second; + getAgeLevels(fees, earlyEntry, feeIx, feeRedIx, youthLimit, seniorLimit); + const string &lastODate = fees[earlyEntry[0]].toTime; + if (!lastODate.empty()) { + oe.getDI().setDate("OrdinaryEntry", lastODate); + } + vector &lateEntry = feePeriods.rbegin()->second; + getAgeLevels(fees, lateEntry, feeLateIx, feeRedLateIx, youthLimit, seniorLimit); + + if (!youthLimit.empty()) + oe.getDI().setInt("YouthAge", getAgeFromDate(youthLimit)); + + if (!seniorLimit.empty()) + oe.getDI().setInt("SeniorAge", getAgeFromDate(seniorLimit)); + + DI.setInt("ClassFee", oe.interpretCurrency(fees[feeIx].fee, fees[feeIx].currency)); + DI.setInt("HighClassFee", oe.interpretCurrency(fees[feeLateIx].fee, fees[feeLateIx].currency)); + + DI.setInt("ClassFeeRed", oe.interpretCurrency(fees[feeRedIx].fee, fees[feeRedIx].currency)); + DI.setInt("HighClassFeeRed", oe.interpretCurrency(fees[feeRedLateIx].fee, fees[feeRedLateIx].currency)); + + FeeStatistics feeStat; + feeStat.fee = fees[feeIx].fee; + if (feeStat.fee > 0) { + feeStat.lateFactor = fees[feeLateIx].fee / feeStat.fee; + feeStatistics.push_back(feeStat); + } + } + } + pc->synchronize(); + + return pc; +} + +void IOF30Interface::setupRelayClasses(const map > &teamClassConfig) { + for (map >::const_iterator it = teamClassConfig.begin(); + it != teamClassConfig.end(); ++it) { + int classId = it->first; + const vector &legs = it->second; + if (legs.empty()) + continue; + if (classId > 0) { + pClass pc = oe.getClass(classId); + if (!pc) { + pc = oe.getClassCreate(classId, "tmp" + itos(classId)); + } + setupRelayClass(pc, legs); + } + } +} + +void IOF30Interface::setupRelayClass(pClass pc, const vector &legs) { + if (pc) { + int nStage = 0; + for (size_t k = 0; k < legs.size(); k++) { + nStage += legs[k].maxRunners; + } + if (int(pc->getNumStages())>=nStage) + return; // Do nothing + + pc->setNumStages(nStage); + pc->setStartType(0, STTime, false); + pc->setStartData(0, oe.getAbsTime(3600)); + + int ix = 0; + for (size_t k = 0; k < legs.size(); k++) { + for (int j = 0; j < legs[k].maxRunners; j++) { + if (j>0) { + if (j < legs[k].minRunners) + pc->setLegType(ix, LTParallel); + else + pc->setLegType(ix, LTExtra); + + pc->setStartType(ix, STChange, false); + } + else if (k>0) { + pc->setLegType(ix, LTNormal); + pc->setStartType(ix, STChange, false); + } + ix++; + } + } + } +} + +string IOF30Interface::getCurrentTime() const { + // Don't call this method at midnight! + return getLocalDate() + "T" + getLocalTimeOnly(); +} + +int IOF30Interface::parseISO8601Time(const xmlobject &xo) { + if (!xo) + return 0; + const char *t = xo.get(); + int tIx = -1; + int zIx = -1; + for (int k = 0; t[k] != 0; k++) { + if (t[k] == 'T' || t[k] == 't') { + if (tIx == -1) + tIx = k; + else ; + // Bad format + } + else if (t[k] == '+' || t[k] == '-' || t[k] == 'Z') { + if (zIx == -1 && tIx != -1) + zIx = k; + else ; + // Bad format + } + } + string date = t; + string time = tIx >= 0 ? date.substr(tIx+1) : date; + string zone = (tIx >= 0 && zIx > 0) ? time.substr(zIx - tIx - 1) : ""; + + if (tIx > 0) { + date = date.substr(0, tIx); + + if (zIx > 0) + time = time.substr(0, zIx - tIx - 1); + } + + return oe.getRelativeTime(date, time, zone); +} + +void IOF30Interface::getProps(vector &props) const { + props.push_back("xmlns"); + props.push_back("http://www.orienteering.org/datastandard/3.0"); + + props.push_back("xmlns:xsi"); + props.push_back("http://www.w3.org/2001/XMLSchema-instance"); + + props.push_back("iofVersion"); + props.push_back("3.0"); + + props.push_back("createTime"); + props.push_back(getCurrentTime()); + + props.push_back("creator"); + props.push_back("MeOS " + getMeosCompectVersion()); +} + +void IOF30Interface::writeResultList(xmlparser &xml, const set &classes, + int leg, bool useUTC_, + bool teamsAsIndividual_, bool unrollLoops_, + bool includeStageInfo_) { + useGMT = useUTC_; + includeStageRaceInfo = includeStageInfo_; + teamsAsIndividual = teamsAsIndividual_; + unrollLoops = unrollLoops_; + vector props; + getProps(props); + + props.push_back("status"); + props.push_back("Complete"); + + xml.startTag("ResultList", props); + + writeEvent(xml); + + vector c; + oe.getClasses(c, false); + + for (size_t k = 0; k < c.size(); k++) { +// bool indRel = c[k]->getClassType() == oClassIndividRelay; + + if (classes.empty() || classes.count(c[k]->getId())) { + /* oe.getRunners(c[k]->getId(), r, false); + vector rToUse; + rToUse.reserve(r.size()); + + for (size_t j = 0; j < r.size(); j++) { + if (leg == -1 || leg == r[j]->getLegNumber()) { + if (leg == -1 && indRel && r[j]->getLegNumber() != 0) + continue; // Skip all but leg 0 for individual relay + + if (leg == -1 && !indRel && r[j]->getTeam()) + continue; // For teams, skip presonal results, unless individual relay + + if (r[j]->getStatus() == StatusUnknown) + continue; + + rToUse.push_back(r[j]); + } + } + + vector tToUse; + + if (leg == -1) { + oe.getTeams(c[k]->getId(), t, false); + tToUse.reserve(t.size()); + + for (size_t j = 0; j < t.size(); j++) { + for (int n = 0; n < t[j]->getNumRunners(); n++) { + pRunner tr = t[j]->getRunner(n); + if (tr && tr->getStatus() != StatusUnknown) { + tToUse.push_back(t[j]); + break; + } + } + } + + } + */ + vector rToUse; + vector tToUse; + getRunnersToUse(c[k], rToUse, tToUse, leg, false); + + if (!rToUse.empty() || !tToUse.empty()) { + writeClassResult(xml, *c[k], rToUse, tToUse); + } + } + } + + + xml.endTag(); +} + +void IOF30Interface::writeClassResult(xmlparser &xml, + const oClass &c, + const vector &r, + const vector &t) { + pCourse stdCourse = haveSameCourse(r); + + xml.startTag("ClassResult"); + writeClass(xml, c); + if (stdCourse) + writeCourse(xml, *stdCourse); + + bool hasInputTime = false; + for (size_t k = 0; !hasInputTime && k < r.size(); k++) { + if (r[k]->hasInputData()) + hasInputTime = true; + } + + for (size_t k = 0; !hasInputTime && k < t.size(); k++) { + if (t[k]->hasInputData()) + hasInputTime = true; + } + + for (size_t k = 0; k < r.size(); k++) { + writePersonResult(xml, *r[k], stdCourse == 0, false, hasInputTime); + } + + for (size_t k = 0; k < t.size(); k++) { + writeTeamResult(xml, *t[k], hasInputTime); + } + + xml.endTag(); +} + +pCourse IOF30Interface::haveSameCourse(const vector &r) const { + bool sameCourse = true; + pCourse stdCourse = r.size() > 0 ? r[0]->getCourse(false) : 0; + for (size_t k = 1; sameCourse && k < r.size(); k++) { + int nr = r[k]->getNumMulti(); + for (int j = 0; j <= nr; j++) { + pRunner tr = r[k]->getMultiRunner(j); + if (tr && stdCourse != tr->getCourse(true)) { + sameCourse = false; + return 0; + } + } + } + return stdCourse; +} + +void IOF30Interface::writeClass(xmlparser &xml, const oClass &c) { + xml.startTag("Class"); + xml.write("Id", c.getExtIdentifierString()); // Need to call initClassId first + xml.write("Name", c.getName()); + + oClass::ClassStatus stat = c.getClassStatus(); + if (stat == oClass::Invalid) + xml.write("Status", "Invalidated"); + else if (stat == oClass::InvalidRefund) + xml.write("Status", "InvalidatedNoFee"); + + + xml.endTag(); +} + +void IOF30Interface::writeCourse(xmlparser &xml, const oCourse &c) { + xml.startTag("Course"); + writeCourseInfo(xml, c); + xml.endTag(); +} + +void IOF30Interface::writeCourseInfo(xmlparser &xml, const oCourse &c) { + xml.write("Id", c.getId()); + xml.write("Name", c.getName()); + int len = c.getLength(); + if (len > 0) + xml.write("Length", len); + int climb = c.getDCI().getInt("Climb"); + if (climb > 0) + xml.write("Climb", climb); +} + + +string formatStatus(RunnerStatus st) { + switch (st) { + case StatusOK: + return "OK"; + case StatusDNS: + return "DidNotStart"; + case StatusMP: + return "MissingPunch"; + case StatusDNF: + return "DidNotFinish"; + case StatusDQ: + return "Disqualified"; + case StatusMAX: + return "OverTime"; + case StatusNotCompetiting: + return "NotCompeting"; + default: + return "Inactive"; + } +} + +void IOF30Interface::writePersonResult(xmlparser &xml, const oRunner &r, + bool includeCourse, bool teamMember, bool hasInputTime) { + if (!teamMember) + xml.startTag("PersonResult"); + else + xml.startTag("TeamMemberResult"); + + writePerson(xml, r); + const pClub pc = r.getClubRef(); + + if (pc && !r.isVacant()) + writeClub(xml, *pc, false); + + if (teamMember) { + oRunner const *resultHolder = &r; + cTeam t = r.getTeam(); + pClass cls = r.getClassRef(); + + if (t && cls) { + int leg = r.getLegNumber(); + const int legOrg = leg; + while (cls->getLegType(leg) == LTIgnore && leg > 0) { + leg--; + } + if (leg < legOrg && t->getRunner(leg)) + resultHolder = t->getRunner(leg); + } + + writeResult(xml, r, *resultHolder, includeCourse, + includeStageRaceInfo && (r.getNumMulti() > 0 || r.getRaceNo() > 0), teamMember, hasInputTime); + } + else { + if (r.getNumMulti() > 0) { + for (int k = 0; k <= r.getNumMulti(); k++) { + const pRunner tr = r.getMultiRunner(k); + if (tr) + writeResult(xml, *tr, *tr, includeCourse, includeStageRaceInfo, teamMember, hasInputTime); + } + } + else + writeResult(xml, r, r, includeCourse, false, teamMember, hasInputTime); + } + + + xml.endTag(); +} + +void IOF30Interface::writeResult(xmlparser &xml, const oRunner &rPerson, const oRunner &r, + bool includeCourse, bool includeRaceNumber, + bool teamMember, bool hasInputTime) { + + vector dummy; + if (!includeRaceNumber && getStageNumber() == 0) + xml.startTag("Result"); + else { + int rn = getStageNumber(); + if (rn == 0) + rn = 1; + if (includeRaceNumber) + rn += rPerson.getRaceNo(); + xml.startTag("Result", "raceNumber", itos(rn)); + } + + if (teamMember) + writeLegOrder(xml, rPerson); + + string bib = rPerson.getBib(); + if (!bib.empty()) + xml.write("BibNumber", bib); + + if (r.getStartTime() > 0) + xml.write("StartTime", oe.getAbsDateTimeISO(r.getStartTime(), true, useGMT)); + + if (r.getFinishTime() > 0) + xml.write("FinishTime", oe.getAbsDateTimeISO(r.getFinishTimeAdjusted(), true, useGMT)); + + if (r.getRunningTime() > 0) + xml.write("Time", r.getRunningTime()); + + int after = r.getTimeAfter(); + if (after >= 0) { + if (teamMember) { + xml.write("TimeBehind", "type", "Leg", itos(after)); + + after = r.getTimeAfterCourse(); + if (after >= 0) + xml.write("TimeBehind", "type", "Course", itos(after)); + + } + else + xml.write("TimeBehind", after); + } + + if (r.getClassRef()) { + + if (r.statusOK() && r.getClassRef()->getNoTiming() == false) { + if (!teamMember && r.getPlace() > 0 && r.getPlace() < 50000) { + xml.write("Position", r.getPlace()); + } + else if (teamMember) { + //int pos = r.getTeam()->getLegPlace(r.getLegNumber(), false); + int pos = r.getPlace(); + if (pos > 0 && pos < 50000) + xml.write("Position", "type", "Leg", itos(pos)); + + pos = r.getCoursePlace(); + if (pos > 0) + xml.write("Position", "type", "Course", itos(pos)); + } + } + + xml.write("Status", formatStatus(r.getStatus())); + + if ( (r.getTeam() && r.getClassRef()->getClassType() != oClassPatrol && !teamsAsIndividual) || hasInputTime) { + xml.startTag("OverallResult"); + int rt = r.getTotalRunningTime(); + if (rt > 0) + xml.write("Time", rt); + + bool hasTiming = r.getClassRef()->getNoTiming() == false; + RunnerStatus stat = r.getTotalStatus(); + + int tleg = r.getLegNumber() >= 0 ? r.getLegNumber() : 0; + + if (stat == StatusOK && hasTiming) { + int after = r.getTotalRunningTime() - r.getClassRef()->getTotalLegLeaderTime(tleg, true); + if (after >= 0) + xml.write("TimeBehind", after); + } + + if (stat == StatusOK && hasTiming) + xml.write("Position", r.getTotalPlace()); + + xml.write("Status", formatStatus(stat)); + + xml.endTag(); + } + + pCourse crs = r.getCourse(!unrollLoops); + if (crs) { + if (includeCourse) + writeCourse(xml, *crs); + + const vector &sp = r.getSplitTimes(unrollLoops); + if (r.getStatus()>0 && r.getStatus() != StatusDNS && r.getStatus() != StatusNotCompetiting) { + int nc = crs->getNumControls(); + bool hasRogaining = crs->hasRogaining(); + int firstControl = crs->useFirstAsStart() ? 1 : 0; + if (crs->useLastAsFinish()) { + nc--; + } + set< pair > rogaining; + for (int k = firstControl; k= sp.size()) + break; + if (crs->getControl(k)->isRogaining(hasRogaining)) { + if (sp[k].hasTime()) { + int time = sp[k].time - r.getStartTime(); + int control = crs->getControl(k)->getFirstNumber(); + rogaining.insert(make_pair(time, control)); + } + else if (!sp[k].isMissing()) { + int control = crs->getControl(k)->getFirstNumber(); + rogaining.insert(make_pair(-1, control)); + } + continue; + } + + if (sp[k].isMissing()) + xml.startTag("SplitTime", "status", "Missing"); + else + xml.startTag("SplitTime"); + xml.write("ControlCode", crs->getControl(k)->getFirstNumber()); + if (sp[k].hasTime()) + xml.write("Time", sp[k].time - r.getStartTime()); + xml.endTag(); + } + + for (set< pair >::iterator it = rogaining.begin(); it != rogaining.end(); ++it) { + xml.startTag("SplitTime", "status", "Additional"); + xml.write("ControlCode", it->second); + if (it->first != -1) + xml.write("Time", it->first); + xml.endTag(); + } + } + } + } + + if (rPerson.getCardNo() > 0) + xml.write("ControlCard", rPerson.getCardNo()); + + writeFees(xml, rPerson); + + xml.endTag(); +} + +void IOF30Interface::writeFees(xmlparser &xml, const oRunner &r) const { + int cardFee = r.getDCI().getInt("CardFee"); + bool paidCard = r.getDCI().getInt("Paid") >= cardFee; + + writeAssignedFee(xml, r, paidCard ? cardFee : 0); + + if (cardFee > 0) + writeRentalCardService(xml, cardFee, paidCard); +} + +void IOF30Interface::writeTeamResult(xmlparser &xml, const oTeam &t, bool hasInputTime) { + xml.startTag("TeamResult"); + + xml.write("EntryId", t.getId()); + xml.write("Name", t.getName()); + + if (t.getClubRef()) + writeClub(xml, *t.getClubRef(), false); + + string bib = t.getBib(); + if (!bib.empty()) + xml.write("BibNumber", bib); + + for (int k = 0; k < t.getNumRunners(); k++) { + if (t.getRunner(k)) + writePersonResult(xml, *t.getRunner(k), true, true, hasInputTime); + } + + writeAssignedFee(xml, t, 0); + xml.endTag(); +} + +int IOF30Interface::getStageNumber() { + if (cachedStageNumber >= 0) + return cachedStageNumber; + int sn = oe.getStageNumber(); + if (sn != 0) { + if (sn < 0) + sn = 0; + cachedStageNumber = sn; + return sn; + } + bool pre = oe.hasPrevStage(); + bool post = oe.hasNextStage(); + + if (!pre && !post) { + cachedStageNumber = 0; + } + else if (!pre && post) { + cachedStageNumber = 1; + } + else { + cachedStageNumber = 1; + // Guess from stage name + string name = oe.getName(); + if (!name.empty()) { + char d = name[name.length() -1]; + if (d>='1' && d<='9') + cachedStageNumber = d - '0'; + } + } + + return cachedStageNumber; +} + +void IOF30Interface::writeEvent(xmlparser &xml) { + xml.startTag("Event"); + xml.write("Id", oe.getExtIdentifierString()); + xml.write("Name", oe.getName()); + xml.startTag("StartTime"); + xml.write("Date", oe.getDate()); + xml.write("Time", oe.getAbsDateTimeISO(0, false, useGMT)); + xml.endTag(); + + if (getStageNumber()) { + xml.startTag("Race"); + xml.write("RaceNumber", getStageNumber()); + + xml.write("Name", oe.getName()); + + xml.startTag("StartTime"); + xml.write("Date", oe.getDate()); + xml.write("Time", oe.getAbsDateTimeISO(0, false, useGMT)); + xml.endTag(); + + xml.endTag(); + } + + xml.endTag(); +} + +void IOF30Interface::writePerson(xmlparser &xml, const oRunner &r) { + xml.startTag("Person"); + + __int64 id = r.getExtIdentifier(); + if (id != 0) + xml.write("Id", r.getExtIdentifierString()); + + xml.startTag("Name"); + xml.write("Family", r.getFamilyName()); + xml.write("Given", r.getGivenName()); + xml.endTag(); + + xml.endTag(); +} + +void IOF30Interface::writeClub(xmlparser &xml, const oClub &c, bool writeExtended) const { + if (c.isVacant() || c.getName().empty()) + return; + + if (writeExtended) { + const string &type = c.getDCI().getString("Type"); + if (type.empty()) + xml.startTag("Organisation"); + else + xml.startTag("Organisation", "type", type); + } + else { + xml.startTag("Organisation"); + } + __int64 id = c.getExtIdentifier(); + if (id != 0) + xml.write("Id", c.getExtIdentifierString()); + + xml.write("Name", c.getName()); + string sname = c.getDCI().getString("ShortName"); + if (!sname.empty()) + xml.write("ShortName", sname); + + string ctry = c.getDCI().getString("Country"); + string nat = c.getDCI().getString("Nationality"); + + if (!ctry.empty() || !nat.empty()) { + if (ctry.empty()) { + if (nat == "SWE") + ctry = "Sweden"; + else if (nat == "FR" || nat == "FRA") + ctry = "France"; + else + ctry = nat; + } + xml.write("Country", "code", nat, ctry); + } + + if (writeExtended) { + oDataConstInterface di = c.getDCI(); + const string &street = di.getString("Street"); + const string &co = di.getString("CareOf"); + const string &city = di.getString("City"); + const string &state = di.getString("State"); + const string &zip = di.getString("ZIP"); + const string &email = di.getString("EMail"); + const string &phone = di.getString("Phone"); + + if (!street.empty()) { + xml.startTag("Address"); + xml.write("Street", street); + if (!co.empty()) + xml.write("CareOf", co); + if (!zip.empty()) + xml.write("ZipCode", zip); + if (!city.empty()) + xml.write("City", city); + if (!state.empty()) + xml.write("State", state); + if (!ctry.empty()) + xml.write("Country", ctry); + xml.endTag(); + } + + if (!email.empty()) + xml.write("Contact", "type", "EmailAddress", email); + + if (!phone.empty()) + xml.write("Contact", "type", "PhoneNumber", phone); + + int dist = di.getInt("District"); + if (dist > 0) + xml.write("ParentOrganisationId", dist); + } + + xml.endTag(); +} + +void IOF30Interface::writeStartList(xmlparser &xml, const set &classes, bool useUTC_, + bool teamsAsIndividual_, bool includeStageInfo_) { + useGMT = useUTC_; + teamsAsIndividual = teamsAsIndividual_; + includeStageRaceInfo = includeStageInfo_; + vector props; + getProps(props); + + xml.startTag("StartList", props); + + writeEvent(xml); + + vector c; + oe.getClasses(c, false); + + for (size_t k = 0; k < c.size(); k++) { + + if (classes.empty() || classes.count(c[k]->getId())) { + vector rToUse; + vector tToUse; + getRunnersToUse(c[k], rToUse, tToUse, -1, true); + if (!rToUse.empty() || !tToUse.empty()) { + writeClassStartList(xml, *c[k], rToUse, tToUse); + } + } + } + xml.endTag(); +} + +void IOF30Interface::getRunnersToUse(const pClass cls, vector &rToUse, + vector &tToUse, int leg, bool includeUnknown) const { + + rToUse.clear(); + tToUse.clear(); + vector r; + vector t; + + int classId = cls->getId(); + bool indRel = cls->getClassType() == oClassIndividRelay; + + oe.getRunners(classId, 0, r, false); + rToUse.reserve(r.size()); + + for (size_t j = 0; j < r.size(); j++) { + if (leg == -1 || leg == r[j]->getLegNumber()) { + + if (!teamsAsIndividual) { + if (leg == -1 && indRel && r[j]->getLegNumber() != 0) + continue; // Skip all but leg 0 for individual relay + + if (leg == -1 && !indRel && r[j]->getTeam()) + continue; // For teams, skip presonal results, unless individual relay + + if (!includeUnknown && r[j]->getStatus() == StatusUnknown) + continue; + } + rToUse.push_back(r[j]); + } + } + + if (leg == -1 && !teamsAsIndividual) { + oe.getTeams(classId, t, false); + tToUse.reserve(t.size()); + + for (size_t j = 0; j < t.size(); j++) { + if (includeUnknown) + tToUse.push_back(t[j]); + else { + for (int n = 0; n < t[j]->getNumRunners(); n++) { + pRunner tr = t[j]->getRunner(n); + if (tr && tr->getStatus() != StatusUnknown) { + tToUse.push_back(t[j]); + break; + } + } + } + } + } +} + +void IOF30Interface::writeClassStartList(xmlparser &xml, const oClass &c, + const vector &r, + const vector &t) { + + pCourse stdCourse = haveSameCourse(r); + + xml.startTag("ClassStart"); + writeClass(xml, c); + if (stdCourse) + writeCourse(xml, *stdCourse); + + string start = c.getStart(); + if (!start.empty()) + xml.write("StartName", start); + + for (size_t k = 0; k < r.size(); k++) { + writePersonStart(xml, *r[k], stdCourse == 0, false); + } + + for (size_t k = 0; k < t.size(); k++) { + writeTeamStart(xml, *t[k]); + } + xml.endTag(); +} + +void IOF30Interface::writePersonStart(xmlparser &xml, const oRunner &r, bool includeCourse, bool teamMember) { + if (!teamMember) + xml.startTag("PersonStart"); + else + xml.startTag("TeamMemberStart"); + + writePerson(xml, r); + const pClub pc = r.getClubRef(); + + if (pc && !r.isVacant()) + writeClub(xml, *pc, false); + + if (teamMember) { + writeStart(xml, r, includeCourse, includeStageRaceInfo && (r.getNumMulti() > 0 || r.getRaceNo() > 0), teamMember); + } + else { + if (r.getNumMulti() > 0) { + for (int k = 0; k <= r.getNumMulti(); k++) { + const pRunner tr = r.getMultiRunner(k); + if (tr) + writeStart(xml, *tr, includeCourse, includeStageRaceInfo, teamMember); + } + } + else + writeStart(xml, r, includeCourse, false, teamMember); + } + + xml.endTag(); +} + +void IOF30Interface::writeTeamStart(xmlparser &xml, const oTeam &t) { + xml.startTag("TeamStart"); + + xml.write("EntryId", t.getId()); + xml.write("Name", t.getName()); + + if (t.getClubRef()) + writeClub(xml, *t.getClubRef(), false); + + string bib = t.getBib(); + if (!bib.empty()) + xml.write("BibNumber", bib); + + for (int k = 0; k < t.getNumRunners(); k++) { + if (t.getRunner(k)) + writePersonStart(xml, *t.getRunner(k), true, true); + } + + writeAssignedFee(xml, t, 0); + xml.endTag(); +} + +void IOF30Interface::writeStart(xmlparser &xml, const oRunner &r, + bool includeCourse, bool includeRaceNumber, + bool teamMember) { + if (!includeRaceNumber && getStageNumber() == 0) + xml.startTag("Start"); + else { + int rn = getStageNumber(); + if (rn == 0) + rn = 1; + if (includeStageRaceInfo) + rn += r.getRaceNo(); + + xml.startTag("Start", "raceNumber", itos(rn)); + } + if (teamMember) + writeLegOrder(xml, r); + + string bib = r.getBib(); + if (!bib.empty()) + xml.write("BibNumber", bib); + + if (r.getStartTime() > 0) + xml.write("StartTime", oe.getAbsDateTimeISO(r.getStartTime(), true, useGMT)); + + pCourse crs = r.getCourse(true); + if (crs && includeCourse) + writeCourse(xml, *crs); + + if (r.getCardNo() > 0) + xml.write("ControlCard", r.getCardNo()); + + writeFees(xml, r); + + xml.endTag(); +} + +void IOF30Interface::writeLegOrder(xmlparser &xml, const oRunner &r) const { + // Team member race result + int legNumber, legOrder; + const pClass pc = r.getClassRef(); + if (pc) { + bool par = pc->splitLegNumberParallel(r.getLegNumber(), legNumber, legOrder); + xml.write("Leg", legNumber + 1); + if (par) + xml.write("LegOrder", legOrder + 1); + } +} + +bool IOF30Interface::readXMLCompetitorDB(const xmlobject &xCompetitor) { + + if (!xCompetitor) return false; + + xmlobject person = xCompetitor.getObject("Person"); + + if (!person) return false; + + string pidS; + person.getObjectString("Id", pidS); + long long pid = oBase::converExtIdentifierString(pidS); + xmlobject pname = person.getObject("Name"); + if (!pname) return false; + + int cardno=0; + string tmp; + + xmlList cards; + xCompetitor.getObjects("ControlCard", cards); + + for (size_t k= 0; kgetExtId()!=0) + rde = 0; //Other runner, same card + + if (!rde) + rde = runnerDB.addRunner(name.c_str(), pid, clubId, cardno); + } + + if (rde) { + rde->setExtId(pid); + rde->setName(name.c_str()); + rde->clubNo = clubId; + rde->birthYear = extendYear(birth); + rde->sex = sex[0]; + memcpy(rde->national, national, 3); + } + return true; +} + +void IOF30Interface::writeXMLCompetitorDB(xmlparser &xml, const RunnerDBEntry &rde) const { + string s = rde.getSex(); + + xml.startTag("Competitor"); + + if (s.empty()) + xml.startTag("Person"); + else + xml.startTag("Person", "sex", s); + + long long pid = rde.getExtId(); + if (pid > 0) { + char bf[16]; + oBase::converExtIdentifierString(pid, bf); + xml.write("Id", bf); + } + xml.startTag("Name"); + xml.write("Given", rde.getGivenName()); + xml.write("Family", rde.getFamilyName()); + xml.endTag(); + + if (rde.getBirthYear() > 1900) + xml.write("BirthDate", itos(rde.getBirthYear()) + "-01-01"); + + string nat = rde.getNationality(); + if (!nat.empty()) { + xml.write("Nationality", "code", nat.c_str()); + } + + xml.endTag(); // Person + + if (rde.cardNo > 0) { + xml.write("ControlCard", "punchingSystem", "SI", itos(rde.cardNo)); + } + + + if (rde.clubNo > 0) { + xml.startTag("Organisation"); + xml.write("Id", rde.clubNo); + xml.endTag(); + } + + xml.endTag(); // Competitor +} + +int getStartIndex(int sn); +int getFinishIndex(int sn); +string getStartName(const string &start); + +int IOF30Interface::getStartIndex(const string &startId) { + int num = getNumberSuffix(startId); + if (num == 0 && startId.length()>0) + num = int(startId[startId.length()-1])-'0'; + return ::getStartIndex(num); +} + +bool IOF30Interface::readControl(const xmlobject &xControl) { + if (!xControl) + return false; + + string idStr; + xControl.getObjectString("Id", idStr); + + if (idStr.empty()) + return false; + + int type = -1; + int code = 0; + if (idStr[0] == 'S') + type = 1; + else if (idStr[0] == 'F') + type = 2; + else { + type = 0; + code = atoi(idStr.c_str()); + if (code <= 0) + return false; + } + + xmlobject pos = xControl.getObject("MapPosition"); + + int xp = 0, yp = 0; + if (pos) { + string x,y; + pos.getObjectString("x", x); + pos.getObjectString("y", y); + xp = int(10.0 * atof(x.c_str())); + yp = int(10.0 * atof(y.c_str())); + } + + int longitude = 0, latitude = 0; + + xmlobject geopos = xControl.getObject("Position"); + + if (geopos) { + string lat,lng; + geopos.getObjectString("lat", lat); + geopos.getObjectString("lng", lng); + latitude = int(1e6 * atof(lat.c_str())); + longitude = int(1e6 * atof(lng.c_str())); + } + pControl pc = 0; + + if (type == 0) { + pc = oe.getControl(code, true); + } + else if (type == 1) { + string start = getStartName(trim(idStr)); + pc = oe.getControl(getStartIndex(idStr), true); + pc->setNumbers(""); + pc->setName(start); + pc->setStatus(oControl::StatusStart); + } + else if (type == 2) { + string finish = trim(idStr); + int num = getNumberSuffix(finish); + if (num == 0 && finish.length()>0) + num = int(finish[finish.length()-1])-'0'; + if (num > 0 && num<10) + finish = lang.tl("Mål ") + itos(num); + else + finish = lang.tl("Mål"); + pc = oe.getControl(getFinishIndex(num), true); + pc->setNumbers(""); + pc->setName(finish); + pc->setStatus(oControl::StatusFinish); + } + + if (pc) { + pc->getDI().setInt("xpos", xp); + pc->getDI().setInt("ypos", yp); + pc->getDI().setInt("longcrd", longitude); + pc->getDI().setInt("latcrd", latitude); + pc->synchronize(); + } + return true; +} + +void IOF30Interface::readCourseGroups(xmlobject xClassCourse, vector< vector > &crs) { + xmlList groups; + xClassCourse.getObjects("CourseGroup", groups); + + for (size_t k = 0; k < groups.size(); k++) { + xmlList courses; + groups[k].getObjects("Course", courses); + crs.push_back(vector()); + for (size_t j = 0; j < courses.size(); j++) { + pCourse pc = readCourse(courses[j]); + if (pc) + crs.back().push_back(pc); + } + } +} + +string IOF30Interface::constructCourseName(const string &family, const string &name) { + if (family.empty()) + return trim(name); + else + return trim(family) + ":" + trim(name); +} + +string IOF30Interface::constructCourseName(const xmlobject &xcrs) { + string name, family; + xcrs.getObjectString("Name", name); + if (name.empty()) + // CourseAssignment case + xcrs.getObjectString("CourseName", name); + + xcrs.getObjectString("CourseFamily", family); + + return constructCourseName(family, name); +} + +pCourse IOF30Interface::readCourse(const xmlobject &xcrs) { + if (!xcrs) + return 0; + + int cid = xcrs.getObjectInt("Id"); + + string name = constructCourseName(xcrs); + /*, family; + xcrs.getObjectString("Name", name); + xcrs.getObjectString("CourseFamily", family); + + if (family.empty()) + name = trim(name); + else + name = trim(family) + ":" + trim(name); +*/ + int len = xcrs.getObjectInt("Length"); + int climb = xcrs.getObjectInt("Climb"); + + xmlList xControls; + xcrs.getObjects("CourseControl", xControls); + + vector ctrlCode; + vector legLen; + string startName; + bool hasRogaining = false; + + for (size_t k = 0; k < xControls.size(); k++) { + string type; + xControls[k].getObjectString("type", type); + if (type == "Start") { + string idStr; + xControls[k].getObjectString("Control", idStr); + pControl pStart = oe.getControl(getStartIndex(idStr), false); + if (pStart) + startName = pStart->getName(); + } + else if (type == "Finish") { + legLen.push_back(xControls[k].getObjectInt("LegLength")); + } + else { + xmlList xPunchControls; + xControls[k].getObjects("Control", xPunchControls); + pControl pCtrl = 0; + if (xPunchControls.size() == 1) { + pCtrl = oe.getControl(xPunchControls[0].getInt(), true); + } + else if (xPunchControls.size()>1) { + pCtrl = oe.addControl(1000*cid + xPunchControls[0].getInt(),xPunchControls[0].getInt(), ""); + if (pCtrl) { + string cc; + for (size_t j = 0; j < xPunchControls.size(); j++) + cc += string(xPunchControls[j].get()) + " "; + + pCtrl->setNumbers(cc); + } + } + + if (pCtrl) { + legLen.push_back(xControls[k].getObjectInt("LegLength")); + ctrlCode.push_back(pCtrl); + int score = xControls[k].getObjectInt("Score"); + if (score > 0) { + pCtrl->getDI().setInt("Rogaining", score); + pCtrl->setStatus(oControl::StatusRogaining); + hasRogaining = true; + } + } + } + } + + pCourse pc = 0; + if (cid > 0) + pc = oe.getCourseCreate(cid); + else { + pc = oe.getCourse(name); + if (pc == 0) + pc = oe.addCourse(name); + } + + if (pc) { + pc->setName(name); + pc->setLength(len); + pc->importControls("", false); + for (size_t i = 0; iaddControl(ctrlCode[i]->getId()); + } + if (pc->getNumControls() + 1 == legLen.size()) + pc->setLegLengths(legLen); + pc->getDI().setInt("Climb", climb); + + pc->setStart(startName, true); + if (hasRogaining) { + int mt = oe.getMaximalTime(); + if (mt == 0) + mt = 3600; + pc->setMaximumRogainingTime(mt); + } + + pc->synchronize(); + } + return pc; +} + + +void IOF30Interface::bindClassCourse(oClass &pc, const vector< vector > &crs) { + if (crs.empty()) + return; + if (crs.size() == 1 && crs[0].size() == 0) + pc.setCourse(crs[0][0]); + else { + unsigned ns = pc.getNumStages(); + ns = max(ns, crs.size()); + pc.setNumStages(ns); + for (size_t k = 0; k < crs.size(); k++) { + pc.clearStageCourses(k); + for (size_t j = 0; j < crs[k].size(); j++) { + pc.addStageCourse(k, crs[k][j]->getId()); + } + } + } +} + + +void IOF30Interface::writeCourses(xmlparser &xml) { + vector props; + getProps(props); + xml.startTag("CourseData", props); + + writeEvent(xml); + + vector ctrl; + vector crs; + oe.getControls(ctrl, false); + + xml.startTag("RaceCourseData"); + map ctrlId2ExportId; + + // Start + xml.startTag("Control"); + xml.write("Id", "S"); + xml.endTag(); + set ids; + for (size_t k = 0; k < ctrl.size(); k++) { + if (ctrl[k]->getStatus() != oControl::StatusFinish && ctrl[k]->getStatus() != oControl::StatusStart) { + string id = writeControl(xml, *ctrl[k], ids); + ctrlId2ExportId[ctrl[k]->getId()] = id; + } + } + + // Finish + xml.startTag("Control"); + xml.write("Id", "F"); + xml.endTag(); + + oe.getCourses(crs); + for (size_t k = 0; k < crs.size(); k++) { + writeFullCourse(xml, *crs[k], ctrlId2ExportId); + } + + xml.endTag(); + + xml.endTag(); +} + +string IOF30Interface::writeControl(xmlparser &xml, const oControl &c, set &writtenId) { + int id = c.getFirstNumber(); + string ids = itos(id); + if (writtenId.count(ids) == 0) { + xml.startTag("Control"); + xml.write("Id", ids); +/* + + + + + + + */ + + xml.endTag(); + writtenId.insert(ids); + } + + return ids; + +} + +void IOF30Interface::writeFullCourse(xmlparser &xml, const oCourse &c, + const map &ctrlId2ExportId) { + + xml.startTag("Course"); + writeCourseInfo(xml, c); + + xml.startTag("CourseControl", "type", "Start"); + xml.write("Control", "S"); + xml.endTag(); + + for (int i = 0; i < c.getNumControls(); i++) { + int id = c.getControl(i)->getId(); + xml.startTag("CourseControl", "type", "Control"); + if (ctrlId2ExportId.count(id)) + xml.write("Control", ctrlId2ExportId.find(id)->second); + else + throw exception(); + xml.endTag(); + } + + xml.startTag("CourseControl", "type", "Finish"); + xml.write("Control", "F"); + xml.endTag(); + + xml.endTag(); +} + +void IOF30Interface::writeRunnerDB(const RunnerDB &db, xmlparser &xml) const { + vector props; + getProps(props); + + xml.startTag("CompetitorList", props); + + const vector &rdb = db.getRunnerDB(); + for (size_t k = 0; k < rdb.size(); k++) { + if (!rdb[k].isRemoved()) + writeXMLCompetitorDB(xml, rdb[k]); + } + + xml.endTag(); +} + +void IOF30Interface::writeClubDB(const RunnerDB &db, xmlparser &xml) const { + vector props; + getProps(props); + + xml.startTag("OrganisationList", props); + + const vector &cdb = db.getClubDB(); + for (size_t k = 0; k < cdb.size(); k++) { + if (!cdb[k].isRemoved()) + writeClub(xml, cdb[k], true); + } + + xml.endTag(); +} + diff --git a/code/iof30interface.h b/code/iof30interface.h new file mode 100644 index 0000000..359f37c --- /dev/null +++ b/code/iof30interface.h @@ -0,0 +1,290 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#pragma once +#include +#include +#include + +class oEvent; +class xmlobject; +typedef vector xmlList; +class xmlparser; +class gdioutput; +class oRunner; +class oClub; +class oTeam; +class oCourse; +class oControl; +class oClass; +class oDataInterface; +class oDataConstInterface; +class oAbstractRunner; +struct RunnerDBEntry; +class RunnerDB; + +typedef oRunner * pRunner; +typedef oClass * pClass; +typedef oClub * pClub; +typedef oTeam * pTeam; +typedef oCourse *pCourse; + +class IOF30Interface { + oEvent &oe; + + int cachedStageNumber; + int entrySourceId; + + bool splitLateFee; + bool useGMT; // Use GMT when exporting + + // Export teams as individual + bool teamsAsIndividual; + // Unroll course loops + bool unrollLoops; + // Include data on stage number + bool includeStageRaceInfo; + void operator=(const IOF30Interface &); + + struct LegInfo { + int maxRunners; + int minRunners; + LegInfo() : maxRunners(1), minRunners(1) {} + void setMinRunners(int nr) {minRunners = max(minRunners, nr); maxRunners = max(maxRunners, nr);} + void setMaxRunners(int nr) {maxRunners = max(maxRunners, nr);} + }; + + struct FeeInfo { + double fee; + double taxable; + double percentage; // Eventor / OLA stupidity + + string currency; + + string fromTime; + string toTime; + + string fromBirthDate; + string toBirthDate; + + bool includes(const FeeInfo &fo) const { + if (toBirthDate != fo.toBirthDate || fromBirthDate != fo.fromBirthDate) + return false; + if (!includeFrom(fromTime, fo.fromTime)) + return false; + if (!includeTo(toTime, fo.toTime)) + return false; + /*if (!includeFrom(fromBirthDate, fo.fromBirthDate)) + return false; + if (!includeTo(toBirthDate, fo.toBirthDate)) + return false;*/ + return true; + } + + void add(FeeInfo &fi); + + string getDateKey() const {return fromTime + " - " + toTime;} + FeeInfo() : fee(0), taxable(0), percentage(0) {} + + const bool operator<(const FeeInfo &fi) const { + return fee < fi.fee || (fee == fi.fee && taxable < fi.taxable); + } + private: + bool includeFrom(const string &a, const string &b) const { + if ( a > b || (b.empty() && !a.empty()) ) + return false; + return true; + } + + bool includeTo(const string &a, const string &b) const { + if ( (!a.empty() && a < b) || (b.empty() && !a.empty()) ) + return false; + return true; + } + }; + + struct FeeStatistics { + double fee; + double lateFactor; + }; + + vector feeStatistics; + + static void getAgeLevels(const vector &fees, const vector &ix, + int &normalIx, int &redIx, string &youthLimit, string &seniorLimit); + + void readEvent(gdioutput &gdi, const xmlobject &xo, + map > &teamClassConfig); + pRunner readPersonEntry(gdioutput &gdi, xmlobject &xo, pTeam team, + const map > &teamClassConfig, + map > > &personId2TeamLeg); + pRunner readPerson(gdioutput &gdi, const xmlobject &xo); + pClub readOrganization(gdioutput &gdi, const xmlobject &xo, bool saveToDB); + pClass readClass(const xmlobject &xo, + map > &teamClassConfig); + + pTeam readTeamEntry(gdioutput &gdi, xmlobject &xTeam, + map > &bibPatterns, + const map > &teamClassConfig, + map > > &personId2TeamLeg); + + pRunner readPersonStart(gdioutput &gdi, pClass pc, xmlobject &xo, pTeam team, + const map > &teamClassConfig); + + pTeam readTeamStart(gdioutput &gdi, pClass pc, xmlobject &xTeam, + map > &bibPatterns, + const map > &teamClassConfig); + + pTeam getCreateTeam(gdioutput &gdi, const xmlobject &xTeam, bool &newTeam); + + static int getIndexFromLegPos(int leg, int legorder, const vector &setup); + void setupClassConfig(int classId, const xmlobject &xTeam, map > &teamClassConfig); + + void setupRelayClasses(const map > &teamClassConfig); + void setupRelayClass(pClass pc, const vector &teamClassConfig); + + int parseISO8601Time(const xmlobject &xo); + string getCurrentTime() const; + + static void getNationality(const xmlobject &xCountry, oDataInterface &di); + + static void getAmount(const xmlobject &xAmount, double &amount, string ¤cy); + static void getAssignedFee(const xmlobject &xFee, double &fee, double &paid, double &taxable, double &percentage, string ¤cy); + static void getFee(const xmlobject &xFee, FeeInfo &fee); + static void getFeeAmounts(const xmlobject &xFee, double &fee, double &taxable, double &percentage, string ¤cy); + + void writeFees(xmlparser &xml, const oRunner &r) const; + + void writeAmount(xmlparser &xml, const char *tag, int amount) const; + void writeAssignedFee(xmlparser &xml, const oAbstractRunner &tr, int paidForCard) const; + void writeRentalCardService(xmlparser &xml, int cardFee, bool paid) const; + + void getProps(vector &props) const; + + void writeClassResult(xmlparser &xml, const oClass &c, const vector &r, + const vector &t); + + void writeClass(xmlparser &xml, const oClass &c); + void writeCourse(xmlparser &xml, const oCourse &c); + void writePersonResult(xmlparser &xml, const oRunner &r, bool includeCourse, + bool teamMember, bool hasInputTime); + + + void writeTeamResult(xmlparser &xml, const oTeam &t, bool hasInputTime); + + void writeResult(xmlparser &xml, const oRunner &rPerson, const oRunner &rResultCarrier, + bool includeCourse, bool includeRaceNumber, bool teamMember, bool hasInputTime); + + void writePerson(xmlparser &xml, const oRunner &r); + void writeClub(xmlparser &xml, const oClub &c, bool writeExtended) const; + + + void getRunnersToUse(const pClass cls, vector &rToUse, + vector &tToUse, int leg, bool includeUnknown) const; + + void writeClassStartList(xmlparser &xml, const oClass &c, const vector &r, + const vector &t); + + void writePersonStart(xmlparser &xml, const oRunner &r, bool includeCourse, bool teamMember); + + void writeTeamStart(xmlparser &xml, const oTeam &t); + + void writeStart(xmlparser &xml, const oRunner &r, bool includeCourse, + bool includeRaceNumber, bool teamMember); + + + pCourse haveSameCourse(const vector &r) const; + void writeLegOrder(xmlparser &xml, const oRunner &r) const; + + // Returns zero if no stage number + int getStageNumber(); + + bool readXMLCompetitorDB(const xmlobject &xCompetitor); + void writeXMLCompetitorDB(xmlparser &xml, const RunnerDBEntry &rde) const; + + int getStartIndex(const string &startId); + + bool readControl(const xmlobject &xControl); + pCourse readCourse(const xmlobject &xcrs); + + void readCourseGroups(xmlobject xClassCourse, vector< vector > &crs); + void bindClassCourse(oClass &pc, const vector< vector > &crs); + + static string constructCourseName(const xmlobject &xcrs); + static string constructCourseName(const string &family, const string &name); + + void classAssignmentObsolete(gdioutput &gdi, xmlList &xAssignment, const map &courses, + const map > &coursesFamilies); + void classCourseAssignment(gdioutput &gdi, xmlList &xAssignment, + const map &courses, + const map > &coursesFamilies); + void personCourseAssignment(gdioutput &gdi, xmlList &xAssignment, + const map &courses); + void teamCourseAssignment(gdioutput &gdi, xmlList &xAssignment, + const map &courses); + + void assignTeamCourse(gdioutput &gdi, oTeam &t, xmlList &xAssignment, + const map &courses); + + pCourse findCourse(gdioutput &gdi, const map &courses, + xmlobject &xPAssignment); + + string writeControl(xmlparser &xml, const oControl &c, set &writtenId); + + void writeCourseInfo(xmlparser &xml, const oCourse &c); + + void writeFullCourse(xmlparser &xml, const oCourse &c, + const map &ctrlId2ExportId); + +public: + IOF30Interface(oEvent *oe, bool forceSplitFee); + virtual ~IOF30Interface() {} + + void readEventList(gdioutput &gdi, xmlobject &xo); + + void readEntryList(gdioutput &gdi, xmlobject &xo, bool removeNonexisting, int &entRead, int &entFail, int &entRemoved); + + void readStartList(gdioutput &gdi, xmlobject &xo, int &entRead, int &entFail); + + void readClassList(gdioutput &gdi, xmlobject &xo, int &entRead, int &entFail); + + void readCompetitorList(gdioutput &gdi, const xmlobject &xo, int &personCount); + + void readClubList(gdioutput &gdi, const xmlobject &xo, int &clubCount); + + void readCourseData(gdioutput &gdi, const xmlobject &xo, bool updateClasses, int &courseCount, int &entFail); + + void writeResultList(xmlparser &xml, const set &classes, int leg, + bool useUTC, bool teamsAsIndividual, + bool unrollLoops, bool includeStageInfo); + + void writeStartList(xmlparser &xml, const set &classes, bool useUTC, + bool teamsAsIndividual, bool includeStageInfo); + + void writeEvent(xmlparser &xml); + + void writeCourses(xmlparser &xml); + + void writeRunnerDB(const RunnerDB &db, xmlparser &xml) const; + + void writeClubDB(const RunnerDB &db, xmlparser &xml) const; +}; diff --git a/code/lib/libhpdf.lib b/code/lib/libhpdf.lib new file mode 100644 index 0000000..672956c Binary files /dev/null and b/code/lib/libhpdf.lib differ diff --git a/code/lib/mysqlpp.lib b/code/lib/mysqlpp.lib new file mode 100644 index 0000000..f97f5e9 Binary files /dev/null and b/code/lib/mysqlpp.lib differ diff --git a/code/lib/mysqlpp_vc15.lib b/code/lib/mysqlpp_vc15.lib new file mode 100644 index 0000000..e32d155 Binary files /dev/null and b/code/lib/mysqlpp_vc15.lib differ diff --git a/code/lib/zlibstat.lib b/code/lib/zlibstat.lib new file mode 100644 index 0000000..97dc66f Binary files /dev/null and b/code/lib/zlibstat.lib differ diff --git a/code/lib_db/libhpdf.lib b/code/lib_db/libhpdf.lib new file mode 100644 index 0000000..9a905dc Binary files /dev/null and b/code/lib_db/libhpdf.lib differ diff --git a/code/lib_db/mysqlpp.lib b/code/lib_db/mysqlpp.lib new file mode 100644 index 0000000..1032125 Binary files /dev/null and b/code/lib_db/mysqlpp.lib differ diff --git a/code/lib_db/mysqlpp_vc15.lib b/code/lib_db/mysqlpp_vc15.lib new file mode 100644 index 0000000..cc3296b Binary files /dev/null and b/code/lib_db/mysqlpp_vc15.lib differ diff --git a/code/lib_db/zlibstat.lib b/code/lib_db/zlibstat.lib new file mode 100644 index 0000000..3f2f286 Binary files /dev/null and b/code/lib_db/zlibstat.lib differ diff --git a/code/lib_db/zlibstat_vc15.lib b/code/lib_db/zlibstat_vc15.lib new file mode 100644 index 0000000..021e277 Binary files /dev/null and b/code/lib_db/zlibstat_vc15.lib differ diff --git a/code/libharu/hpdf.h b/code/libharu/hpdf.h new file mode 100644 index 0000000..9d5edc9 --- /dev/null +++ b/code/libharu/hpdf.h @@ -0,0 +1,1562 @@ +/* + * << Haru Free PDF Library 2.0.8 >> -- hpdf.h + * + * URL http://libharu.org/ + * + * Copyright (c) 1999-2006 Takeshi Kanno + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_H +#define _HPDF_H + +#include "hpdf_config.h" +#include "hpdf_version.h" + +#define HPDF_UNUSED(a) ((void)(a)) + +#ifdef HPDF_DLL_MAKE +# define HPDF_EXPORT(A) __declspec(dllexport) A __stdcall +#else +# ifdef HPDF_DLL_MAKE_CDECL +# define HPDF_EXPORT(A) __declspec(dllexport) A +# else +# ifdef HPDF_SHARED_MAKE +# define HPDF_EXPORT(A) extern A +# endif /* HPDF_SHARED_MAKE */ +# endif /* HPDF_DLL_MAKE_CDECL */ +#endif /* HPDF_DLL_MAKE */ + +#ifdef HPDF_DLL +# define HPDF_SHARED +# define HPDF_EXPORT(A) __declspec(dllimport) A __stdcall +#else +# ifdef HPDF_DLL_CDECL +# define HPDF_SHARED +# define HPDF_EXPORT(A) __declspec(dllimport) A +# endif /* HPDF_DLL_CDECL */ +#endif /* HPDF_DLL */ + +#ifdef HPDF_SHARED + +#ifndef HPDF_EXPORT +#define HPDF_EXPORT(A) extern A +#endif /* HPDF_EXPORT */ + +#include "hpdf_consts.h" +#include "hpdf_types.h" + +typedef void *HPDF_HANDLE; +typedef HPDF_HANDLE HPDF_Doc; +typedef HPDF_HANDLE HPDF_Page; +typedef HPDF_HANDLE HPDF_Pages; +typedef HPDF_HANDLE HPDF_Stream; +typedef HPDF_HANDLE HPDF_Image; +typedef HPDF_HANDLE HPDF_Font; +typedef HPDF_HANDLE HPDF_Outline; +typedef HPDF_HANDLE HPDF_Encoder; +typedef HPDF_HANDLE HPDF_3DMeasure; +typedef HPDF_HANDLE HPDF_ExData; +typedef HPDF_HANDLE HPDF_Destination; +typedef HPDF_HANDLE HPDF_XObject; +typedef HPDF_HANDLE HPDF_Annotation; +typedef HPDF_HANDLE HPDF_ExtGState; +typedef HPDF_HANDLE HPDF_FontDef; +typedef HPDF_HANDLE HPDF_U3D; +typedef HPDF_HANDLE HPDF_JavaScript; +typedef HPDF_HANDLE HPDF_Error; +typedef HPDF_HANDLE HPDF_MMgr; +typedef HPDF_HANDLE HPDF_Dict; +typedef HPDF_HANDLE HPDF_EmbeddedFile; +typedef HPDF_HANDLE HPDF_OutputIntent; +typedef HPDF_HANDLE HPDF_Xref; + +#else + +#ifndef HPDF_EXPORT +#define HPDF_EXPORT(A) A +#endif /* HPDF_EXPORT */ + +#include "hpdf_consts.h" +#include "hpdf_doc.h" +#include "hpdf_error.h" +#include "hpdf_pdfa.h" + +#endif /* HPDF_SHARED */ + +#ifdef __cplusplus +extern "C" { +#endif + +HPDF_EXPORT(const char *) +HPDF_GetVersion (void); + + +HPDF_EXPORT(HPDF_Doc) +HPDF_NewEx (HPDF_Error_Handler user_error_fn, + HPDF_Alloc_Func user_alloc_fn, + HPDF_Free_Func user_free_fn, + HPDF_UINT mem_pool_buf_size, + void *user_data); + +HPDF_EXPORT(HPDF_Doc) +HPDF_New (HPDF_Error_Handler user_error_fn, + void *user_data); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_SetErrorHandler (HPDF_Doc pdf, + HPDF_Error_Handler user_error_fn); + + +HPDF_EXPORT(void) +HPDF_Free (HPDF_Doc pdf); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_NewDoc (HPDF_Doc pdf); + + +HPDF_EXPORT(void) +HPDF_FreeDoc (HPDF_Doc pdf); + + +HPDF_EXPORT(HPDF_BOOL) +HPDF_HasDoc (HPDF_Doc pdf); + + +HPDF_EXPORT(void) +HPDF_FreeDocAll (HPDF_Doc pdf); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_SaveToStream (HPDF_Doc pdf); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_GetContents (HPDF_Doc pdf, + HPDF_BYTE *buf, + HPDF_UINT32 *size); + +HPDF_EXPORT(HPDF_UINT32) +HPDF_GetStreamSize (HPDF_Doc pdf); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_ReadFromStream (HPDF_Doc pdf, + HPDF_BYTE *buf, + HPDF_UINT32 *size); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_ResetStream (HPDF_Doc pdf); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_SaveToFile (HPDF_Doc pdf, + const char *file_name); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_GetError (HPDF_Doc pdf); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_GetErrorDetail (HPDF_Doc pdf); + +HPDF_EXPORT(void) +HPDF_ResetError (HPDF_Doc pdf); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_CheckError (HPDF_Error error); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_SetPagesConfiguration (HPDF_Doc pdf, + HPDF_UINT page_per_pages); + + +HPDF_EXPORT(HPDF_Page) +HPDF_GetPageByIndex (HPDF_Doc pdf, + HPDF_UINT index); + + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ + +HPDF_EXPORT(HPDF_PageLayout) +HPDF_GetPageLayout (HPDF_Doc pdf); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_SetPageLayout (HPDF_Doc pdf, + HPDF_PageLayout layout); + + +HPDF_EXPORT(HPDF_PageMode) +HPDF_GetPageMode (HPDF_Doc pdf); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_SetPageMode (HPDF_Doc pdf, + HPDF_PageMode mode); + + +HPDF_EXPORT(HPDF_UINT) +HPDF_GetViewerPreference (HPDF_Doc pdf); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_SetViewerPreference (HPDF_Doc pdf, + HPDF_UINT value); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_SetOpenAction (HPDF_Doc pdf, + HPDF_Destination open_action); + + +/*---------------------------------------------------------------------------*/ +/*----- page handling -------------------------------------------------------*/ + + +HPDF_EXPORT(HPDF_Page) +HPDF_GetCurrentPage (HPDF_Doc pdf); + + +HPDF_EXPORT(HPDF_Page) +HPDF_AddPage (HPDF_Doc pdf); + + +HPDF_EXPORT(HPDF_Page) +HPDF_InsertPage (HPDF_Doc pdf, + HPDF_Page page); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetWidth (HPDF_Page page, + HPDF_REAL value); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetHeight (HPDF_Page page, + HPDF_REAL value); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetSize (HPDF_Page page, + HPDF_PageSizes size, + HPDF_PageDirection direction); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetRotate (HPDF_Page page, + HPDF_UINT16 angle); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetZoom (HPDF_Page page, + HPDF_REAL zoom); + +/*---------------------------------------------------------------------------*/ +/*----- font handling -------------------------------------------------------*/ + + +HPDF_EXPORT(HPDF_Font) +HPDF_GetFont (HPDF_Doc pdf, + const char *font_name, + const char *encoding_name); + + +HPDF_EXPORT(const char*) +HPDF_LoadType1FontFromFile (HPDF_Doc pdf, + const char *afm_file_name, + const char *data_file_name); + + +HPDF_EXPORT(HPDF_FontDef) +HPDF_GetTTFontDefFromFile (HPDF_Doc pdf, + const char *file_name, + HPDF_BOOL embedding); + +HPDF_EXPORT(const char*) +HPDF_LoadTTFontFromFile (HPDF_Doc pdf, + const char *file_name, + HPDF_BOOL embedding); + + +HPDF_EXPORT(const char*) +HPDF_LoadTTFontFromFile2 (HPDF_Doc pdf, + const char *file_name, + HPDF_UINT index, + HPDF_BOOL embedding); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_AddPageLabel (HPDF_Doc pdf, + HPDF_UINT page_num, + HPDF_PageNumStyle style, + HPDF_UINT first_page, + const char *prefix); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_UseJPFonts (HPDF_Doc pdf); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_UseKRFonts (HPDF_Doc pdf); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_UseCNSFonts (HPDF_Doc pdf); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_UseCNTFonts (HPDF_Doc pdf); + + +/*--------------------------------------------------------------------------*/ +/*----- outline ------------------------------------------------------------*/ + + +HPDF_EXPORT(HPDF_Outline) +HPDF_CreateOutline (HPDF_Doc pdf, + HPDF_Outline parent, + const char *title, + HPDF_Encoder encoder); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Outline_SetOpened (HPDF_Outline outline, + HPDF_BOOL opened); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Outline_SetDestination (HPDF_Outline outline, + HPDF_Destination dst); + + +/*--------------------------------------------------------------------------*/ +/*----- destination --------------------------------------------------------*/ + +HPDF_EXPORT(HPDF_Destination) +HPDF_Page_CreateDestination (HPDF_Page page); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Destination_SetXYZ (HPDF_Destination dst, + HPDF_REAL left, + HPDF_REAL top, + HPDF_REAL zoom); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Destination_SetFit (HPDF_Destination dst); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Destination_SetFitH (HPDF_Destination dst, + HPDF_REAL top); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Destination_SetFitV (HPDF_Destination dst, + HPDF_REAL left); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Destination_SetFitR (HPDF_Destination dst, + HPDF_REAL left, + HPDF_REAL bottom, + HPDF_REAL right, + HPDF_REAL top); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Destination_SetFitB (HPDF_Destination dst); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Destination_SetFitBH (HPDF_Destination dst, + HPDF_REAL top); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Destination_SetFitBV (HPDF_Destination dst, + HPDF_REAL left); + +/*--------------------------------------------------------------------------*/ +/*----- encoder ------------------------------------------------------------*/ + +HPDF_EXPORT(HPDF_Encoder) +HPDF_GetEncoder (HPDF_Doc pdf, + const char *encoding_name); + + +HPDF_EXPORT(HPDF_Encoder) +HPDF_GetCurrentEncoder (HPDF_Doc pdf); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_SetCurrentEncoder (HPDF_Doc pdf, + const char *encoding_name); + + +HPDF_EXPORT(HPDF_EncoderType) +HPDF_Encoder_GetType (HPDF_Encoder encoder); + + +HPDF_EXPORT(HPDF_ByteType) +HPDF_Encoder_GetByteType (HPDF_Encoder encoder, + const char *text, + HPDF_UINT index); + + +HPDF_EXPORT(HPDF_UNICODE) +HPDF_Encoder_GetUnicode (HPDF_Encoder encoder, + HPDF_UINT16 code); + + +HPDF_EXPORT(HPDF_WritingMode) +HPDF_Encoder_GetWritingMode (HPDF_Encoder encoder); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_UseJPEncodings (HPDF_Doc pdf); + + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_UseKREncodings (HPDF_Doc pdf); + + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_UseCNSEncodings (HPDF_Doc pdf); + + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_UseCNTEncodings (HPDF_Doc pdf); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_UseUTFEncodings (HPDF_Doc pdf); + + +/*--------------------------------------------------------------------------*/ +/*----- annotation ---------------------------------------------------------*/ + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_Create3DAnnot (HPDF_Page page, + HPDF_Rect rect, + HPDF_U3D u3d); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateTextAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateFreeTextAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateLineAnnot (HPDF_Page page, + const char *text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateLinkAnnot (HPDF_Page page, + HPDF_Rect rect, + HPDF_Destination dst); + + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateURILinkAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *uri); + + +HPDF_Annotation +HPDF_Page_CreateTextMarkupAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder, + HPDF_AnnotType subType); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateHighlightAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateUnderlineAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateSquigglyAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateStrikeOutAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreatePopupAnnot ( HPDF_Page page, + HPDF_Rect rect, + HPDF_Annotation parent); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateStampAnnot ( HPDF_Page page, + HPDF_Rect rect, + HPDF_StampAnnotName name, + const char* text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateProjectionAnnot(HPDF_Page page, + HPDF_Rect rect, + const char* text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateSquareAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateCircleAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_LinkAnnot_SetHighlightMode (HPDF_Annotation annot, + HPDF_AnnotHighlightMode mode); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_LinkAnnot_SetBorderStyle (HPDF_Annotation annot, + HPDF_REAL width, + HPDF_UINT16 dash_on, + HPDF_UINT16 dash_off); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_TextAnnot_SetIcon (HPDF_Annotation annot, + HPDF_AnnotIcon icon); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_TextAnnot_SetOpened (HPDF_Annotation annot, + HPDF_BOOL opened); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Annot_SetRGBColor (HPDF_Annotation annot, HPDF_RGBColor color); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Annot_SetCMYKColor (HPDF_Annotation annot, HPDF_CMYKColor color); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Annot_SetGrayColor (HPDF_Annotation annot, HPDF_REAL color); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Annot_SetNoColor (HPDF_Annotation annot); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetTitle (HPDF_Annotation annot, const char* name); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetSubject (HPDF_Annotation annot, const char* name); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetCreationDate (HPDF_Annotation annot, HPDF_Date value); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetTransparency (HPDF_Annotation annot, HPDF_REAL value); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetIntent (HPDF_Annotation annot, HPDF_AnnotIntent intent); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetPopup (HPDF_Annotation annot, HPDF_Annotation popup); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetRectDiff (HPDF_Annotation annot, HPDF_Rect rect); /* RD entry */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetCloudEffect (HPDF_Annotation annot, HPDF_INT cloudIntensity); /* BE entry */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetInteriorRGBColor (HPDF_Annotation annot, HPDF_RGBColor color); /* IC with RGB entry */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetInteriorCMYKColor (HPDF_Annotation annot, HPDF_CMYKColor color); /* IC with CMYK entry */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetInteriorGrayColor (HPDF_Annotation annot, HPDF_REAL color); /* IC with Gray entry */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetInteriorTransparent (HPDF_Annotation annot); /* IC with No Color entry */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_TextMarkupAnnot_SetQuadPoints ( HPDF_Annotation annot, HPDF_Point lb, HPDF_Point rb, HPDF_Point rt, HPDF_Point lt); /* l-left, r-right, b-bottom, t-top positions */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Annot_Set3DView ( HPDF_MMgr mmgr, + HPDF_Annotation annot, + HPDF_Annotation annot3d, + HPDF_Dict view); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_PopupAnnot_SetOpened (HPDF_Annotation annot, + HPDF_BOOL opened); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_FreeTextAnnot_SetLineEndingStyle (HPDF_Annotation annot, HPDF_LineAnnotEndingStyle startStyle, HPDF_LineAnnotEndingStyle endStyle); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_FreeTextAnnot_Set3PointCalloutLine (HPDF_Annotation annot, HPDF_Point startPoint, HPDF_Point kneePoint, HPDF_Point endPoint); /* Callout line will be in default user space */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_FreeTextAnnot_Set2PointCalloutLine (HPDF_Annotation annot, HPDF_Point startPoint, HPDF_Point endPoint); /* Callout line will be in default user space */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_FreeTextAnnot_SetDefaultStyle (HPDF_Annotation annot, const char* style); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_LineAnnot_SetPosition (HPDF_Annotation annot, + HPDF_Point startPoint, HPDF_LineAnnotEndingStyle startStyle, + HPDF_Point endPoint, HPDF_LineAnnotEndingStyle endStyle); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_LineAnnot_SetLeader (HPDF_Annotation annot, HPDF_INT leaderLen, HPDF_INT leaderExtLen, HPDF_INT leaderOffsetLen); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_LineAnnot_SetCaption (HPDF_Annotation annot, HPDF_BOOL showCaption, HPDF_LineAnnotCapPosition position, HPDF_INT horzOffset, HPDF_INT vertOffset); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Annotation_SetBorderStyle (HPDF_Annotation annot, + HPDF_BSSubtype subtype, + HPDF_REAL width, + HPDF_UINT16 dash_on, + HPDF_UINT16 dash_off, + HPDF_UINT16 dash_phase); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_ProjectionAnnot_SetExData(HPDF_Annotation annot, HPDF_ExData exdata); + + +/*--------------------------------------------------------------------------*/ +/*----- 3D Measure ---------------------------------------------------------*/ +HPDF_EXPORT(HPDF_3DMeasure) +HPDF_Page_Create3DC3DMeasure(HPDF_Page page, + HPDF_Point3D firstanchorpoint, + HPDF_Point3D textanchorpoint + ); + +HPDF_EXPORT(HPDF_3DMeasure) +HPDF_Page_CreatePD33DMeasure(HPDF_Page page, + HPDF_Point3D annotationPlaneNormal, + HPDF_Point3D firstAnchorPoint, + HPDF_Point3D secondAnchorPoint, + HPDF_Point3D leaderLinesDirection, + HPDF_Point3D measurementValuePoint, + HPDF_Point3D textYDirection, + HPDF_REAL value, + const char* unitsString + ); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DMeasure_SetName(HPDF_3DMeasure measure, + const char* name); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DMeasure_SetColor(HPDF_3DMeasure measure, + HPDF_RGBColor color); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DMeasure_SetTextSize(HPDF_3DMeasure measure, + HPDF_REAL textsize); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DC3DMeasure_SetTextBoxSize(HPDF_3DMeasure measure, + HPDF_INT32 x, + HPDF_INT32 y); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DC3DMeasure_SetText(HPDF_3DMeasure measure, + const char* text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DC3DMeasure_SetProjectionAnotation(HPDF_3DMeasure measure, + HPDF_Annotation projectionanotation); + +/*--------------------------------------------------------------------------*/ +/*----- External Data ---------------------------------------------------------*/ + +HPDF_EXPORT(HPDF_ExData) +HPDF_Page_Create3DAnnotExData(HPDF_Page page ); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DAnnotExData_Set3DMeasurement(HPDF_ExData exdata, HPDF_3DMeasure measure); + +/*--------------------------------------------------------------------------*/ +/*--------------------------------------------------------------------------*/ +/*----- 3D View ---------------------------------------------------------*/ + +HPDF_EXPORT(HPDF_Dict) +HPDF_Page_Create3DView (HPDF_Page page, + HPDF_U3D u3d, + HPDF_Annotation annot3d, + const char *name); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DView_Add3DC3DMeasure(HPDF_Dict view, + HPDF_3DMeasure measure); + +/*--------------------------------------------------------------------------*/ +/*----- image data ---------------------------------------------------------*/ + +HPDF_EXPORT(HPDF_Image) +HPDF_LoadPngImageFromMem (HPDF_Doc pdf, + const HPDF_BYTE *buffer, + HPDF_UINT size); + +HPDF_EXPORT(HPDF_Image) +HPDF_LoadPngImageFromFile (HPDF_Doc pdf, + const char *filename); + + +HPDF_EXPORT(HPDF_Image) +HPDF_LoadPngImageFromFile2 (HPDF_Doc pdf, + const char *filename); + + +HPDF_EXPORT(HPDF_Image) +HPDF_LoadJpegImageFromFile (HPDF_Doc pdf, + const char *filename); + +HPDF_EXPORT(HPDF_Image) +HPDF_LoadJpegImageFromMem (HPDF_Doc pdf, + const HPDF_BYTE *buffer, + HPDF_UINT size); + +HPDF_EXPORT(HPDF_Image) +HPDF_LoadU3DFromFile (HPDF_Doc pdf, + const char *filename); + +HPDF_EXPORT(HPDF_Image) +HPDF_Image_LoadRaw1BitImageFromMem (HPDF_Doc pdf, + const HPDF_BYTE *buf, + HPDF_UINT width, + HPDF_UINT height, + HPDF_UINT line_width, + HPDF_BOOL black_is1, + HPDF_BOOL top_is_first); + + +HPDF_EXPORT(HPDF_Image) +HPDF_LoadRawImageFromFile (HPDF_Doc pdf, + const char *filename, + HPDF_UINT width, + HPDF_UINT height, + HPDF_ColorSpace color_space); + + +HPDF_EXPORT(HPDF_Image) +HPDF_LoadRawImageFromMem (HPDF_Doc pdf, + const HPDF_BYTE *buf, + HPDF_UINT width, + HPDF_UINT height, + HPDF_ColorSpace color_space, + HPDF_UINT bits_per_component); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Image_AddSMask (HPDF_Image image, + HPDF_Image smask); + +HPDF_EXPORT(HPDF_Point) +HPDF_Image_GetSize (HPDF_Image image); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Image_GetSize2 (HPDF_Image image, HPDF_Point *size); + + +HPDF_EXPORT(HPDF_UINT) +HPDF_Image_GetWidth (HPDF_Image image); + + +HPDF_EXPORT(HPDF_UINT) +HPDF_Image_GetHeight (HPDF_Image image); + + +HPDF_EXPORT(HPDF_UINT) +HPDF_Image_GetBitsPerComponent (HPDF_Image image); + + +HPDF_EXPORT(const char*) +HPDF_Image_GetColorSpace (HPDF_Image image); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Image_SetColorMask (HPDF_Image image, + HPDF_UINT rmin, + HPDF_UINT rmax, + HPDF_UINT gmin, + HPDF_UINT gmax, + HPDF_UINT bmin, + HPDF_UINT bmax); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Image_SetMaskImage (HPDF_Image image, + HPDF_Image mask_image); + + +/*--------------------------------------------------------------------------*/ +/*----- info dictionary ----------------------------------------------------*/ + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_SetInfoAttr (HPDF_Doc pdf, + HPDF_InfoType type, + const char *value); + + +HPDF_EXPORT(const char*) +HPDF_GetInfoAttr (HPDF_Doc pdf, + HPDF_InfoType type); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_SetInfoDateAttr (HPDF_Doc pdf, + HPDF_InfoType type, + HPDF_Date value); + + +/*--------------------------------------------------------------------------*/ +/*----- encryption ---------------------------------------------------------*/ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_SetPassword (HPDF_Doc pdf, + const char *owner_passwd, + const char *user_passwd); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_SetPermission (HPDF_Doc pdf, + HPDF_UINT permission); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_SetEncryptionMode (HPDF_Doc pdf, + HPDF_EncryptMode mode, + HPDF_UINT key_len); + + +/*--------------------------------------------------------------------------*/ +/*----- compression --------------------------------------------------------*/ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_SetCompressionMode (HPDF_Doc pdf, + HPDF_UINT mode); + + +/*--------------------------------------------------------------------------*/ +/*----- font ---------------------------------------------------------------*/ + +HPDF_EXPORT(const char*) +HPDF_Font_GetFontName (HPDF_Font font); + + +HPDF_EXPORT(const char*) +HPDF_Font_GetEncodingName (HPDF_Font font); + + +HPDF_EXPORT(HPDF_INT) +HPDF_Font_GetUnicodeWidth (HPDF_Font font, + HPDF_UNICODE code); + +HPDF_EXPORT(HPDF_Box) +HPDF_Font_GetBBox (HPDF_Font font); + + +HPDF_EXPORT(HPDF_INT) +HPDF_Font_GetAscent (HPDF_Font font); + + +HPDF_EXPORT(HPDF_INT) +HPDF_Font_GetDescent (HPDF_Font font); + + +HPDF_EXPORT(HPDF_UINT) +HPDF_Font_GetXHeight (HPDF_Font font); + + +HPDF_EXPORT(HPDF_UINT) +HPDF_Font_GetCapHeight (HPDF_Font font); + + +HPDF_EXPORT(HPDF_TextWidth) +HPDF_Font_TextWidth (HPDF_Font font, + const HPDF_BYTE *text, + HPDF_UINT len); + + +HPDF_EXPORT(HPDF_UINT) +HPDF_Font_MeasureText (HPDF_Font font, + const HPDF_BYTE *text, + HPDF_UINT len, + HPDF_REAL width, + HPDF_REAL font_size, + HPDF_REAL char_space, + HPDF_REAL word_space, + HPDF_BOOL wordwrap, + HPDF_REAL *real_width); + + +/*--------------------------------------------------------------------------*/ +/*----- attachements -------------------------------------------------------*/ + +HPDF_EXPORT(HPDF_EmbeddedFile) +HPDF_AttachFile (HPDF_Doc pdf, + const char *file); + + +/*--------------------------------------------------------------------------*/ +/*----- extended graphics state --------------------------------------------*/ + +HPDF_EXPORT(HPDF_ExtGState) +HPDF_CreateExtGState (HPDF_Doc pdf); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_ExtGState_SetAlphaStroke (HPDF_ExtGState ext_gstate, + HPDF_REAL value); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_ExtGState_SetAlphaFill (HPDF_ExtGState ext_gstate, + HPDF_REAL value); + + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_ExtGState_SetBlendMode (HPDF_ExtGState ext_gstate, + HPDF_BlendMode mode); + + +/*--------------------------------------------------------------------------*/ +/*--------------------------------------------------------------------------*/ + +HPDF_EXPORT(HPDF_REAL) +HPDF_Page_TextWidth (HPDF_Page page, + const char *text); + + +HPDF_EXPORT(HPDF_UINT) +HPDF_Page_MeasureText (HPDF_Page page, + const char *text, + HPDF_REAL width, + HPDF_BOOL wordwrap, + HPDF_REAL *real_width); + + +HPDF_EXPORT(HPDF_REAL) +HPDF_Page_GetWidth (HPDF_Page page); + + +HPDF_EXPORT(HPDF_REAL) +HPDF_Page_GetHeight (HPDF_Page page); + + +HPDF_EXPORT(HPDF_UINT16) +HPDF_Page_GetGMode (HPDF_Page page); + + +HPDF_EXPORT(HPDF_Point) +HPDF_Page_GetCurrentPos (HPDF_Page page); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_GetCurrentPos2 (HPDF_Page page, + HPDF_Point *pos); + + +HPDF_EXPORT(HPDF_Point) +HPDF_Page_GetCurrentTextPos (HPDF_Page page); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_GetCurrentTextPos2 (HPDF_Page page, + HPDF_Point *pos); + + +HPDF_EXPORT(HPDF_Font) +HPDF_Page_GetCurrentFont (HPDF_Page page); + + +HPDF_EXPORT(HPDF_REAL) +HPDF_Page_GetCurrentFontSize (HPDF_Page page); + + +HPDF_EXPORT(HPDF_TransMatrix) +HPDF_Page_GetTransMatrix (HPDF_Page page); + + +HPDF_EXPORT(HPDF_REAL) +HPDF_Page_GetLineWidth (HPDF_Page page); + + +HPDF_EXPORT(HPDF_LineCap) +HPDF_Page_GetLineCap (HPDF_Page page); + + +HPDF_EXPORT(HPDF_LineJoin) +HPDF_Page_GetLineJoin (HPDF_Page page); + + +HPDF_EXPORT(HPDF_REAL) +HPDF_Page_GetMiterLimit (HPDF_Page page); + + +HPDF_EXPORT(HPDF_DashMode) +HPDF_Page_GetDash (HPDF_Page page); + + +HPDF_EXPORT(HPDF_REAL) +HPDF_Page_GetFlat (HPDF_Page page); + + +HPDF_EXPORT(HPDF_REAL) +HPDF_Page_GetCharSpace (HPDF_Page page); + + +HPDF_EXPORT(HPDF_REAL) +HPDF_Page_GetWordSpace (HPDF_Page page); + + +HPDF_EXPORT(HPDF_REAL) +HPDF_Page_GetHorizontalScalling (HPDF_Page page); + + +HPDF_EXPORT(HPDF_REAL) +HPDF_Page_GetTextLeading (HPDF_Page page); + + +HPDF_EXPORT(HPDF_TextRenderingMode) +HPDF_Page_GetTextRenderingMode (HPDF_Page page); + + +/* This function is obsolete. Use HPDF_Page_GetTextRise. */ +HPDF_EXPORT(HPDF_REAL) +HPDF_Page_GetTextRaise (HPDF_Page page); + + +HPDF_EXPORT(HPDF_REAL) +HPDF_Page_GetTextRise (HPDF_Page page); + + +HPDF_EXPORT(HPDF_RGBColor) +HPDF_Page_GetRGBFill (HPDF_Page page); + + +HPDF_EXPORT(HPDF_RGBColor) +HPDF_Page_GetRGBStroke (HPDF_Page page); + + +HPDF_EXPORT(HPDF_CMYKColor) +HPDF_Page_GetCMYKFill (HPDF_Page page); + + +HPDF_EXPORT(HPDF_CMYKColor) +HPDF_Page_GetCMYKStroke (HPDF_Page page); + + +HPDF_EXPORT(HPDF_REAL) +HPDF_Page_GetGrayFill (HPDF_Page page); + + +HPDF_EXPORT(HPDF_REAL) +HPDF_Page_GetGrayStroke (HPDF_Page page); + + +HPDF_EXPORT(HPDF_ColorSpace) +HPDF_Page_GetStrokingColorSpace (HPDF_Page page); + + +HPDF_EXPORT(HPDF_ColorSpace) +HPDF_Page_GetFillingColorSpace (HPDF_Page page); + + +HPDF_EXPORT(HPDF_TransMatrix) +HPDF_Page_GetTextMatrix (HPDF_Page page); + + +HPDF_EXPORT(HPDF_UINT) +HPDF_Page_GetGStateDepth (HPDF_Page page); + + +/*--------------------------------------------------------------------------*/ +/*----- GRAPHICS OPERATORS -------------------------------------------------*/ + + +/*--- General graphics state ---------------------------------------------*/ + +/* w */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetLineWidth (HPDF_Page page, + HPDF_REAL line_width); + +/* J */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetLineCap (HPDF_Page page, + HPDF_LineCap line_cap); + +/* j */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetLineJoin (HPDF_Page page, + HPDF_LineJoin line_join); + +/* M */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetMiterLimit (HPDF_Page page, + HPDF_REAL miter_limit); + +/* d */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetDash (HPDF_Page page, + const HPDF_UINT16 *dash_ptn, + HPDF_UINT num_param, + HPDF_UINT phase); + + + +/* ri --not implemented yet */ + +/* i */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetFlat (HPDF_Page page, + HPDF_REAL flatness); + +/* gs */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetExtGState (HPDF_Page page, + HPDF_ExtGState ext_gstate); + + +/*--- Special graphic state operator --------------------------------------*/ + +/* q */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_GSave (HPDF_Page page); + +/* Q */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_GRestore (HPDF_Page page); + +/* cm */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_Concat (HPDF_Page page, + HPDF_REAL a, + HPDF_REAL b, + HPDF_REAL c, + HPDF_REAL d, + HPDF_REAL x, + HPDF_REAL y); + +/*--- Path construction operator ------------------------------------------*/ + +/* m */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_MoveTo (HPDF_Page page, + HPDF_REAL x, + HPDF_REAL y); + +/* l */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_LineTo (HPDF_Page page, + HPDF_REAL x, + HPDF_REAL y); + +/* c */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_CurveTo (HPDF_Page page, + HPDF_REAL x1, + HPDF_REAL y1, + HPDF_REAL x2, + HPDF_REAL y2, + HPDF_REAL x3, + HPDF_REAL y3); + +/* v */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_CurveTo2 (HPDF_Page page, + HPDF_REAL x2, + HPDF_REAL y2, + HPDF_REAL x3, + HPDF_REAL y3); + +/* y */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_CurveTo3 (HPDF_Page page, + HPDF_REAL x1, + HPDF_REAL y1, + HPDF_REAL x3, + HPDF_REAL y3); + +/* h */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_ClosePath (HPDF_Page page); + +/* re */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_Rectangle (HPDF_Page page, + HPDF_REAL x, + HPDF_REAL y, + HPDF_REAL width, + HPDF_REAL height); + + +/*--- Path painting operator ---------------------------------------------*/ + +/* S */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_Stroke (HPDF_Page page); + +/* s */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_ClosePathStroke (HPDF_Page page); + +/* f */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_Fill (HPDF_Page page); + +/* f* */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_Eofill (HPDF_Page page); + +/* B */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_FillStroke (HPDF_Page page); + +/* B* */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_EofillStroke (HPDF_Page page); + +/* b */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_ClosePathFillStroke (HPDF_Page page); + +/* b* */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_ClosePathEofillStroke (HPDF_Page page); + +/* n */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_EndPath (HPDF_Page page); + + +/*--- Clipping paths operator --------------------------------------------*/ + +/* W */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_Clip (HPDF_Page page); + +/* W* */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_Eoclip (HPDF_Page page); + + +/*--- Text object operator -----------------------------------------------*/ + +/* BT */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_BeginText (HPDF_Page page); + +/* ET */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_EndText (HPDF_Page page); + +/*--- Text state ---------------------------------------------------------*/ + +/* Tc */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetCharSpace (HPDF_Page page, + HPDF_REAL value); + +/* Tw */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetWordSpace (HPDF_Page page, + HPDF_REAL value); + +/* Tz */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetHorizontalScalling (HPDF_Page page, + HPDF_REAL value); + +/* TL */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetTextLeading (HPDF_Page page, + HPDF_REAL value); + +/* Tf */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetFontAndSize (HPDF_Page page, + HPDF_Font font, + HPDF_REAL size); + +/* Tr */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetTextRenderingMode (HPDF_Page page, + HPDF_TextRenderingMode mode); + +/* Ts */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetTextRise (HPDF_Page page, + HPDF_REAL value); + +/* This function is obsolete. Use HPDF_Page_SetTextRise. */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetTextRaise (HPDF_Page page, + HPDF_REAL value); + +/*--- Text positioning ---------------------------------------------------*/ + +/* Td */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_MoveTextPos (HPDF_Page page, + HPDF_REAL x, + HPDF_REAL y); + +/* TD */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_MoveTextPos2 (HPDF_Page page, + HPDF_REAL x, + HPDF_REAL y); + +/* Tm */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetTextMatrix (HPDF_Page page, + HPDF_REAL a, + HPDF_REAL b, + HPDF_REAL c, + HPDF_REAL d, + HPDF_REAL x, + HPDF_REAL y); + + +/* T* */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_MoveToNextLine (HPDF_Page page); + +/*--- Text showing -------------------------------------------------------*/ + +/* Tj */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_ShowText (HPDF_Page page, + const char *text); + +/* TJ */ + +/* ' */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_ShowTextNextLine (HPDF_Page page, + const char *text); + +/* " */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_ShowTextNextLineEx (HPDF_Page page, + HPDF_REAL word_space, + HPDF_REAL char_space, + const char *text); + + +/*--- Color showing ------------------------------------------------------*/ + +/* cs --not implemented yet */ +/* CS --not implemented yet */ +/* sc --not implemented yet */ +/* scn --not implemented yet */ +/* SC --not implemented yet */ +/* SCN --not implemented yet */ + +/* g */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetGrayFill (HPDF_Page page, + HPDF_REAL gray); + +/* G */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetGrayStroke (HPDF_Page page, + HPDF_REAL gray); + +/* rg */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetRGBFill (HPDF_Page page, + HPDF_REAL r, + HPDF_REAL g, + HPDF_REAL b); + +/* RG */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetRGBStroke (HPDF_Page page, + HPDF_REAL r, + HPDF_REAL g, + HPDF_REAL b); + +/* k */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetCMYKFill (HPDF_Page page, + HPDF_REAL c, + HPDF_REAL m, + HPDF_REAL y, + HPDF_REAL k); + +/* K */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetCMYKStroke (HPDF_Page page, + HPDF_REAL c, + HPDF_REAL m, + HPDF_REAL y, + HPDF_REAL k); + +/*--- Shading patterns ---------------------------------------------------*/ + +/* sh --not implemented yet */ + +/*--- In-line images -----------------------------------------------------*/ + +/* BI --not implemented yet */ +/* ID --not implemented yet */ +/* EI --not implemented yet */ + +/*--- XObjects -----------------------------------------------------------*/ + +/* Do */ +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_ExecuteXObject (HPDF_Page page, + HPDF_XObject obj); + +/*--- Content streams ----------------------------------------------------*/ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_New_Content_Stream (HPDF_Page page, + HPDF_Dict* new_stream); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_Insert_Shared_Content_Stream (HPDF_Page page, + HPDF_Dict shared_stream); + + +/*--- Marked content -----------------------------------------------------*/ + +/* BMC --not implemented yet */ +/* BDC --not implemented yet */ +/* EMC --not implemented yet */ +/* MP --not implemented yet */ +/* DP --not implemented yet */ + +/*--- Compatibility ------------------------------------------------------*/ + +/* BX --not implemented yet */ +/* EX --not implemented yet */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_DrawImage (HPDF_Page page, + HPDF_Image image, + HPDF_REAL x, + HPDF_REAL y, + HPDF_REAL width, + HPDF_REAL height); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_Circle (HPDF_Page page, + HPDF_REAL x, + HPDF_REAL y, + HPDF_REAL ray); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_Ellipse (HPDF_Page page, + HPDF_REAL x, + HPDF_REAL y, + HPDF_REAL xray, + HPDF_REAL yray); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_Arc (HPDF_Page page, + HPDF_REAL x, + HPDF_REAL y, + HPDF_REAL ray, + HPDF_REAL ang1, + HPDF_REAL ang2); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_TextOut (HPDF_Page page, + HPDF_REAL xpos, + HPDF_REAL ypos, + const char *text); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_TextRect (HPDF_Page page, + HPDF_REAL left, + HPDF_REAL top, + HPDF_REAL right, + HPDF_REAL bottom, + const char *text, + HPDF_TextAlignment align, + HPDF_UINT *len); + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetSlideShow (HPDF_Page page, + HPDF_TransitionStyle type, + HPDF_REAL disp_time, + HPDF_REAL trans_time); + + +HPDF_EXPORT(HPDF_OutputIntent) +HPDF_ICC_LoadIccFromMem (HPDF_Doc pdf, + HPDF_MMgr mmgr, + HPDF_Stream iccdata, + HPDF_Xref xref, + int numcomponent); + +HPDF_EXPORT(HPDF_OutputIntent) +HPDF_LoadIccProfileFromFile (HPDF_Doc pdf, + const char* icc_file_name, + int numcomponent); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_H */ + diff --git a/code/libharu/hpdf_3dmeasure.h b/code/libharu/hpdf_3dmeasure.h new file mode 100644 index 0000000..1f3d8ba --- /dev/null +++ b/code/libharu/hpdf_3dmeasure.h @@ -0,0 +1,57 @@ +/* + * << Haru Free PDF Library >> -- hpdf_annotation.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_3DMEASURE_H +#define _HPDF_3DMEASURE_H + +#include "hpdf_objects.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------------------------*/ +/*------ HPDF_3DMeasure -----------------------------------------------------*/ + + +HPDF_3DMeasure +HPDF_3DC3DMeasure_New(HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Point3D firstanchorpoint, + HPDF_Point3D textanchorpoint + ); + +HPDF_3DMeasure +HPDF_PD33DMeasure_New(HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Point3D annotationPlaneNormal, + HPDF_Point3D firstAnchorPoint, + HPDF_Point3D secondAnchorPoint, + HPDF_Point3D leaderLinesDirection, + HPDF_Point3D measurementValuePoint, + HPDF_Point3D textYDirection, + HPDF_REAL value, + const char* unitsString + ); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_3DMEASURE_H */ + diff --git a/code/libharu/hpdf_annotation.h b/code/libharu/hpdf_annotation.h new file mode 100644 index 0000000..febd1f8 --- /dev/null +++ b/code/libharu/hpdf_annotation.h @@ -0,0 +1,95 @@ +/* + * << Haru Free PDF Library >> -- hpdf_annotation.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_ANNOTATION_H +#define _HPDF_ANNOTATION_H + +#include "hpdf_objects.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------------------------*/ +/*------ HPDF_Annotation -----------------------------------------------------*/ + + +HPDF_Annotation +HPDF_Annotation_New (HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_AnnotType type, + HPDF_Rect rect); + + +HPDF_Annotation +HPDF_LinkAnnot_New (HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Rect rect, + HPDF_Destination dst); + + +HPDF_Annotation +HPDF_URILinkAnnot_New (HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Rect rect, + const char *uri); + + +HPDF_Annotation +HPDF_3DAnnot_New (HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Rect rect, + HPDF_U3D u3d); + +HPDF_Annotation +HPDF_MarkupAnnot_New (HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder, + HPDF_AnnotType subtype); + +HPDF_Annotation +HPDF_PopupAnnot_New (HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Rect rect, + HPDF_Annotation parent); + +HPDF_Annotation +HPDF_StampAnnot_New (HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Rect rect, + HPDF_StampAnnotName name, + const char* text, + HPDF_Encoder encoder); + +HPDF_Annotation +HPDF_ProjectionAnnot_New (HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Rect rect, + const char* text, + HPDF_Encoder encoder); + +HPDF_BOOL +HPDF_Annotation_Validate (HPDF_Annotation annot); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_ANNOTATION_H */ + diff --git a/code/libharu/hpdf_catalog.h b/code/libharu/hpdf_catalog.h new file mode 100644 index 0000000..91ad034 --- /dev/null +++ b/code/libharu/hpdf_catalog.h @@ -0,0 +1,93 @@ +/* + * << Haru Free PDF Library >> -- hpdf_catalog.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_CATALOG_H +#define _HPDF_CATALOG_H + +#include "hpdf_objects.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef HPDF_Dict HPDF_Catalog; + +HPDF_Catalog +HPDF_Catalog_New (HPDF_MMgr mmgr, + HPDF_Xref xref); + + +HPDF_NameDict +HPDF_Catalog_GetNames (HPDF_Catalog catalog); + + +HPDF_STATUS +HPDF_Catalog_SetNames (HPDF_Catalog catalog, + HPDF_NameDict dict); + + +HPDF_Pages +HPDF_Catalog_GetRoot (HPDF_Catalog catalog); + + +HPDF_PageLayout +HPDF_Catalog_GetPageLayout (HPDF_Catalog catalog); + + +HPDF_STATUS +HPDF_Catalog_SetPageLayout (HPDF_Catalog catalog, + HPDF_PageLayout layout); + + +HPDF_PageMode +HPDF_Catalog_GetPageMode (HPDF_Catalog catalog); + + +HPDF_STATUS +HPDF_Catalog_SetPageMode (HPDF_Catalog catalog, + HPDF_PageMode mode); + + +HPDF_STATUS +HPDF_Catalog_SetOpenAction (HPDF_Catalog catalog, + HPDF_Destination open_action); + + +HPDF_STATUS +HPDF_Catalog_AddPageLabel (HPDF_Catalog catalog, + HPDF_UINT page_num, + HPDF_Dict page_label); + + +HPDF_UINT +HPDF_Catalog_GetViewerPreference (HPDF_Catalog catalog); + + +HPDF_STATUS +HPDF_Catalog_SetViewerPreference (HPDF_Catalog catalog, + HPDF_UINT value); + + +HPDF_BOOL +HPDF_Catalog_Validate (HPDF_Catalog catalog); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_CATALOG_H */ + diff --git a/code/libharu/hpdf_conf.h b/code/libharu/hpdf_conf.h new file mode 100644 index 0000000..e216910 --- /dev/null +++ b/code/libharu/hpdf_conf.h @@ -0,0 +1,85 @@ +/* + * << Haru Free PDF Library >> -- hpdf_conf.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_CONF_H +#define _HPDF_CONF_H + +#include +#include +#if defined(_MSC_VER) +#ifndef _USE_MATH_DEFINES +#define _USE_MATH_DEFINES 1 +#endif /* _USE_MATH_DEFINES */ +#endif +#ifndef __USE_XOPEN +#define __USE_XOPEN /* for M_PI */ +#endif /* __USE_XOPEN */ +#include + +/*----------------------------------------------------------------------------*/ +/*----- standard C library functions -----------------------------------------*/ + +#define HPDF_FOPEN fopen +#define HPDF_FCLOSE fclose +#define HPDF_FREAD fread +#define HPDF_FWRITE fwrite +#define HPDF_FFLUSH fflush +#define HPDF_FSEEK fseek +#define HPDF_FTELL ftell +#define HPDF_FEOF feof +#define HPDF_FERROR ferror +#define HPDF_MALLOC malloc +#define HPDF_FREE free +#define HPDF_FILEP FILE* +#define HPDF_TIME time +#define HPDF_PRINTF printf +#define HPDF_SIN sin +#define HPDF_COS cos + +/*----------------------------------------------------------------------------*/ +/*----- parameters in relation to performance --------------------------------*/ + +/* default buffer size of memory-stream-object */ +#define HPDF_STREAM_BUF_SIZ 4096 + +/* default array size of list-object */ +#define HPDF_DEF_ITEMS_PER_BLOCK 20 + +/* default array size of cross-reference-table */ +#define HPDF_DEFALUT_XREF_ENTRY_NUM 1024 + +/* default array size of widths-table of cid-fontdef */ +#define HPDF_DEF_CHAR_WIDTHS_NUM 128 + +/* default array size of page-list-tablef */ +#define HPDF_DEF_PAGE_LIST_NUM 256 + +/* default array size of range-table of cid-fontdef */ +#define HPDF_DEF_RANGE_TBL_NUM 128 + +/* default buffer size of memory-pool-object */ +#define HPDF_MPOOL_BUF_SIZ 8192 +#define HPDF_MIN_MPOOL_BUF_SIZ 256 +#define HPDF_MAX_MPOOL_BUF_SIZ 1048576 + +/* alignment size of memory-pool-object + */ +#define HPDF_ALIGN_SIZ sizeof int; + + +#endif /* _HPDF_CONF_H */ + diff --git a/code/libharu/hpdf_config.h b/code/libharu/hpdf_config.h new file mode 100644 index 0000000..242d503 --- /dev/null +++ b/code/libharu/hpdf_config.h @@ -0,0 +1,75 @@ +/* include/hpdf_config.h.in. Generated from configure.in by autoheader. */ + +/* Define to 1 if you have the header file. */ +#undef LIBHPDF_HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef LIBHPDF_HAVE_INTTYPES_H + +/* Define to 1 if you have the `png' library (-lpng). */ +#define LIBHPDF_HAVE_LIBPNG 1 + +/* Define to 1 if you have the `z' library (-lz). */ +#define LIBHPDF_HAVE_LIBZ 1 + +/* Define to 1 if you have the header file. */ +#undef LIBHPDF_HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef LIBHPDF_HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#define LIBHPDF_HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define LIBHPDF_HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define LIBHPDF_HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define LIBHPDF_HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#undef LIBHPDF_HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#define LIBHPDF_HAVE_UNISTD_H 1 + +/* define pi */ +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif /* M_PI */ + +/* debug build */ +#undef LIBHPDF_DEBUG + +/* debug trace enabled */ +#undef LIBHPDF_DEBUG_TRACE + +/* libpng is not available */ +#undef LIBHPDF_HAVE_NOPNGLIB + +/* zlib is not available */ +#undef LIBHPDF_HAVE_NOZLIB + +/* Define to the address where bug reports for this package should be sent. */ +#undef LIBHPDF_PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef LIBHPDF_PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#define LIBHPDF_PACKAGE_STRING "libhpdf 2.2.0" + +/* Define to the one symbol short name of this package. */ +#undef LIBHPDF_PACKAGE_TARNAME + +/* Define to the version of this package. */ +#define LIBHPDF_PACKAGE_VERSION "2.2.0" + +/* Define to 1 if you have the ANSI C header files. */ +#define LIBHPDF_STDC_HEADERS 1 + +/* Define to `unsigned int' if does not define. */ +#undef size_t diff --git a/code/libharu/hpdf_consts.h b/code/libharu/hpdf_consts.h new file mode 100644 index 0000000..2c6d55c --- /dev/null +++ b/code/libharu/hpdf_consts.h @@ -0,0 +1,549 @@ +/* + * << Haru Free PDF Library >> -- hpdf_consts.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + + +#ifndef _HPDF_CONSTS_H +#define _HPDF_CONSTS_H + +/*----------------------------------------------------------------------------*/ + +#define HPDF_TRUE 1 +#define HPDF_FALSE 0 + +#define HPDF_OK 0 +#define HPDF_NOERROR 0 + +/*----- default values -------------------------------------------------------*/ + +/* buffer size which is required when we convert to character string. */ +#define HPDF_TMP_BUF_SIZ 512 +#define HPDF_SHORT_BUF_SIZ 32 +#define HPDF_REAL_LEN 11 +#define HPDF_INT_LEN 11 +#define HPDF_TEXT_DEFAULT_LEN 256 +#define HPDF_UNICODE_HEADER_LEN 2 +#define HPDF_DATE_TIME_STR_LEN 23 + +/* length of each item defined in PDF */ +#define HPDF_BYTE_OFFSET_LEN 10 +#define HPDF_OBJ_ID_LEN 7 +#define HPDF_GEN_NO_LEN 5 + +/* default value of Graphic State */ +#define HPDF_DEF_FONT "Helvetica" +#define HPDF_DEF_PAGE_LAYOUT HPDF_PAGE_LAYOUT_SINGLE +#define HPDF_DEF_PAGE_MODE HPDF_PAGE_MODE_USE_NONE +#define HPDF_DEF_WORDSPACE 0 +#define HPDF_DEF_CHARSPACE 0 +#define HPDF_DEF_FONTSIZE 10 +#define HPDF_DEF_HSCALING 100 +#define HPDF_DEF_LEADING 0 +#define HPDF_DEF_RENDERING_MODE HPDF_FILL +#define HPDF_DEF_RISE 0 +#define HPDF_DEF_RAISE HPDF_DEF_RISE +#define HPDF_DEF_LINEWIDTH 1 +#define HPDF_DEF_LINECAP HPDF_BUTT_END +#define HPDF_DEF_LINEJOIN HPDF_MITER_JOIN +#define HPDF_DEF_MITERLIMIT 10 +#define HPDF_DEF_FLATNESS 1 +#define HPDF_DEF_PAGE_NUM 1 + +#define HPDF_BS_DEF_WIDTH 1 + +/* defalt page-size */ +#define HPDF_DEF_PAGE_WIDTH 595.276F +#define HPDF_DEF_PAGE_HEIGHT 841.89F + +/*---------------------------------------------------------------------------*/ +/*----- compression mode ----------------------------------------------------*/ + +#define HPDF_COMP_NONE 0x00 +#define HPDF_COMP_TEXT 0x01 +#define HPDF_COMP_IMAGE 0x02 +#define HPDF_COMP_METADATA 0x04 +#define HPDF_COMP_ALL 0x0F +/* #define HPDF_COMP_BEST_COMPRESS 0x10 + * #define HPDF_COMP_BEST_SPEED 0x20 + */ +#define HPDF_COMP_MASK 0xFF + + +/*----------------------------------------------------------------------------*/ +/*----- permission flags (only Revision 2 is supported)-----------------------*/ + +#define HPDF_ENABLE_READ 0 +#define HPDF_ENABLE_PRINT 4 +#define HPDF_ENABLE_EDIT_ALL 8 +#define HPDF_ENABLE_COPY 16 +#define HPDF_ENABLE_EDIT 32 + + +/*----------------------------------------------------------------------------*/ +/*------ viewer preferences definitions --------------------------------------*/ + +#define HPDF_HIDE_TOOLBAR 1 +#define HPDF_HIDE_MENUBAR 2 +#define HPDF_HIDE_WINDOW_UI 4 +#define HPDF_FIT_WINDOW 8 +#define HPDF_CENTER_WINDOW 16 +#define HPDF_PRINT_SCALING_NONE 32 + + +/*---------------------------------------------------------------------------*/ +/*------ limitation of object implementation (PDF1.4) -----------------------*/ + +#define HPDF_LIMIT_MAX_INT 2147483647 +#define HPDF_LIMIT_MIN_INT -2147483647 + +#define HPDF_LIMIT_MAX_REAL 32767 +#define HPDF_LIMIT_MIN_REAL -32767 + +#define HPDF_LIMIT_MAX_STRING_LEN 65535 +#define HPDF_LIMIT_MAX_NAME_LEN 127 + +#define HPDF_LIMIT_MAX_ARRAY 32767 +#define HPDF_LIMIT_MAX_DICT_ELEMENT 4095 +#define HPDF_LIMIT_MAX_XREF_ELEMENT 8388607 +#define HPDF_LIMIT_MAX_GSTATE 28 +#define HPDF_LIMIT_MAX_DEVICE_N 8 +#define HPDF_LIMIT_MAX_DEVICE_N_V15 32 +#define HPDF_LIMIT_MAX_CID 65535 +#define HPDF_MAX_GENERATION_NUM 65535 + +#define HPDF_MIN_PAGE_HEIGHT 3 +#define HPDF_MIN_PAGE_WIDTH 3 +#define HPDF_MAX_PAGE_HEIGHT 14400 +#define HPDF_MAX_PAGE_WIDTH 14400 +#define HPDF_MIN_MAGNIFICATION_FACTOR 8 +#define HPDF_MAX_MAGNIFICATION_FACTOR 3200 + +/*---------------------------------------------------------------------------*/ +/*------ limitation of various properties -----------------------------------*/ + +#define HPDF_MIN_PAGE_SIZE 3 +#define HPDF_MAX_PAGE_SIZE 14400 +#define HPDF_MIN_HORIZONTALSCALING 10 +#define HPDF_MAX_HORIZONTALSCALING 300 +#define HPDF_MIN_WORDSPACE -30 +#define HPDF_MAX_WORDSPACE 300 +#define HPDF_MIN_CHARSPACE -30 +#define HPDF_MAX_CHARSPACE 300 +#define HPDF_MAX_FONTSIZE 300 +#define HPDF_MAX_ZOOMSIZE 10 +#define HPDF_MAX_LEADING 300 +#define HPDF_MAX_LINEWIDTH 100 +#define HPDF_MAX_DASH_PATTERN 100 + +#define HPDF_MAX_JWW_NUM 128 + +/*----------------------------------------------------------------------------*/ +/*----- country code definition ----------------------------------------------*/ + +#define HPDF_COUNTRY_AF "AF" /* AFGHANISTAN */ +#define HPDF_COUNTRY_AL "AL" /* ALBANIA */ +#define HPDF_COUNTRY_DZ "DZ" /* ALGERIA */ +#define HPDF_COUNTRY_AS "AS" /* AMERICAN SAMOA */ +#define HPDF_COUNTRY_AD "AD" /* ANDORRA */ +#define HPDF_COUNTRY_AO "AO" /* ANGOLA */ +#define HPDF_COUNTRY_AI "AI" /* ANGUILLA */ +#define HPDF_COUNTRY_AQ "AQ" /* ANTARCTICA */ +#define HPDF_COUNTRY_AG "AG" /* ANTIGUA AND BARBUDA */ +#define HPDF_COUNTRY_AR "AR" /* ARGENTINA */ +#define HPDF_COUNTRY_AM "AM" /* ARMENIA */ +#define HPDF_COUNTRY_AW "AW" /* ARUBA */ +#define HPDF_COUNTRY_AU "AU" /* AUSTRALIA */ +#define HPDF_COUNTRY_AT "AT" /* AUSTRIA */ +#define HPDF_COUNTRY_AZ "AZ" /* AZERBAIJAN */ +#define HPDF_COUNTRY_BS "BS" /* BAHAMAS */ +#define HPDF_COUNTRY_BH "BH" /* BAHRAIN */ +#define HPDF_COUNTRY_BD "BD" /* BANGLADESH */ +#define HPDF_COUNTRY_BB "BB" /* BARBADOS */ +#define HPDF_COUNTRY_BY "BY" /* BELARUS */ +#define HPDF_COUNTRY_BE "BE" /* BELGIUM */ +#define HPDF_COUNTRY_BZ "BZ" /* BELIZE */ +#define HPDF_COUNTRY_BJ "BJ" /* BENIN */ +#define HPDF_COUNTRY_BM "BM" /* BERMUDA */ +#define HPDF_COUNTRY_BT "BT" /* BHUTAN */ +#define HPDF_COUNTRY_BO "BO" /* BOLIVIA */ +#define HPDF_COUNTRY_BA "BA" /* BOSNIA AND HERZEGOWINA */ +#define HPDF_COUNTRY_BW "BW" /* BOTSWANA */ +#define HPDF_COUNTRY_BV "BV" /* BOUVET ISLAND */ +#define HPDF_COUNTRY_BR "BR" /* BRAZIL */ +#define HPDF_COUNTRY_IO "IO" /* BRITISH INDIAN OCEAN TERRITORY */ +#define HPDF_COUNTRY_BN "BN" /* BRUNEI DARUSSALAM */ +#define HPDF_COUNTRY_BG "BG" /* BULGARIA */ +#define HPDF_COUNTRY_BF "BF" /* BURKINA FASO */ +#define HPDF_COUNTRY_BI "BI" /* BURUNDI */ +#define HPDF_COUNTRY_KH "KH" /* CAMBODIA */ +#define HPDF_COUNTRY_CM "CM" /* CAMEROON */ +#define HPDF_COUNTRY_CA "CA" /* CANADA */ +#define HPDF_COUNTRY_CV "CV" /* CAPE VERDE */ +#define HPDF_COUNTRY_KY "KY" /* CAYMAN ISLANDS */ +#define HPDF_COUNTRY_CF "CF" /* CENTRAL AFRICAN REPUBLIC */ +#define HPDF_COUNTRY_TD "TD" /* CHAD */ +#define HPDF_COUNTRY_CL "CL" /* CHILE */ +#define HPDF_COUNTRY_CN "CN" /* CHINA */ +#define HPDF_COUNTRY_CX "CX" /* CHRISTMAS ISLAND */ +#define HPDF_COUNTRY_CC "CC" /* COCOS (KEELING) ISLANDS */ +#define HPDF_COUNTRY_CO "CO" /* COLOMBIA */ +#define HPDF_COUNTRY_KM "KM" /* COMOROS */ +#define HPDF_COUNTRY_CG "CG" /* CONGO */ +#define HPDF_COUNTRY_CK "CK" /* COOK ISLANDS */ +#define HPDF_COUNTRY_CR "CR" /* COSTA RICA */ +#define HPDF_COUNTRY_CI "CI" /* COTE D'IVOIRE */ +#define HPDF_COUNTRY_HR "HR" /* CROATIA (local name: Hrvatska) */ +#define HPDF_COUNTRY_CU "CU" /* CUBA */ +#define HPDF_COUNTRY_CY "CY" /* CYPRUS */ +#define HPDF_COUNTRY_CZ "CZ" /* CZECH REPUBLIC */ +#define HPDF_COUNTRY_DK "DK" /* DENMARK */ +#define HPDF_COUNTRY_DJ "DJ" /* DJIBOUTI */ +#define HPDF_COUNTRY_DM "DM" /* DOMINICA */ +#define HPDF_COUNTRY_DO "DO" /* DOMINICAN REPUBLIC */ +#define HPDF_COUNTRY_TP "TP" /* EAST TIMOR */ +#define HPDF_COUNTRY_EC "EC" /* ECUADOR */ +#define HPDF_COUNTRY_EG "EG" /* EGYPT */ +#define HPDF_COUNTRY_SV "SV" /* EL SALVADOR */ +#define HPDF_COUNTRY_GQ "GQ" /* EQUATORIAL GUINEA */ +#define HPDF_COUNTRY_ER "ER" /* ERITREA */ +#define HPDF_COUNTRY_EE "EE" /* ESTONIA */ +#define HPDF_COUNTRY_ET "ET" /* ETHIOPIA */ +#define HPDF_COUNTRY_FK "FK" /* FALKLAND ISLANDS (MALVINAS) */ +#define HPDF_COUNTRY_FO "FO" /* FAROE ISLANDS */ +#define HPDF_COUNTRY_FJ "FJ" /* FIJI */ +#define HPDF_COUNTRY_FI "FI" /* FINLAND */ +#define HPDF_COUNTRY_FR "FR" /* FRANCE */ +#define HPDF_COUNTRY_FX "FX" /* FRANCE, METROPOLITAN */ +#define HPDF_COUNTRY_GF "GF" /* FRENCH GUIANA */ +#define HPDF_COUNTRY_PF "PF" /* FRENCH POLYNESIA */ +#define HPDF_COUNTRY_TF "TF" /* FRENCH SOUTHERN TERRITORIES */ +#define HPDF_COUNTRY_GA "GA" /* GABON */ +#define HPDF_COUNTRY_GM "GM" /* GAMBIA */ +#define HPDF_COUNTRY_GE "GE" /* GEORGIA */ +#define HPDF_COUNTRY_DE "DE" /* GERMANY */ +#define HPDF_COUNTRY_GH "GH" /* GHANA */ +#define HPDF_COUNTRY_GI "GI" /* GIBRALTAR */ +#define HPDF_COUNTRY_GR "GR" /* GREECE */ +#define HPDF_COUNTRY_GL "GL" /* GREENLAND */ +#define HPDF_COUNTRY_GD "GD" /* GRENADA */ +#define HPDF_COUNTRY_GP "GP" /* GUADELOUPE */ +#define HPDF_COUNTRY_GU "GU" /* GUAM */ +#define HPDF_COUNTRY_GT "GT" /* GUATEMALA */ +#define HPDF_COUNTRY_GN "GN" /* GUINEA */ +#define HPDF_COUNTRY_GW "GW" /* GUINEA-BISSAU */ +#define HPDF_COUNTRY_GY "GY" /* GUYANA */ +#define HPDF_COUNTRY_HT "HT" /* HAITI */ +#define HPDF_COUNTRY_HM "HM" /* HEARD AND MC DONALD ISLANDS */ +#define HPDF_COUNTRY_HN "HN" /* HONDURAS */ +#define HPDF_COUNTRY_HK "HK" /* HONG KONG */ +#define HPDF_COUNTRY_HU "HU" /* HUNGARY */ +#define HPDF_COUNTRY_IS "IS" /* ICELAND */ +#define HPDF_COUNTRY_IN "IN" /* INDIA */ +#define HPDF_COUNTRY_ID "ID" /* INDONESIA */ +#define HPDF_COUNTRY_IR "IR" /* IRAN (ISLAMIC REPUBLIC OF) */ +#define HPDF_COUNTRY_IQ "IQ" /* IRAQ */ +#define HPDF_COUNTRY_IE "IE" /* IRELAND */ +#define HPDF_COUNTRY_IL "IL" /* ISRAEL */ +#define HPDF_COUNTRY_IT "IT" /* ITALY */ +#define HPDF_COUNTRY_JM "JM" /* JAMAICA */ +#define HPDF_COUNTRY_JP "JP" /* JAPAN */ +#define HPDF_COUNTRY_JO "JO" /* JORDAN */ +#define HPDF_COUNTRY_KZ "KZ" /* KAZAKHSTAN */ +#define HPDF_COUNTRY_KE "KE" /* KENYA */ +#define HPDF_COUNTRY_KI "KI" /* KIRIBATI */ +#define HPDF_COUNTRY_KP "KP" /* KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF */ +#define HPDF_COUNTRY_KR "KR" /* KOREA, REPUBLIC OF */ +#define HPDF_COUNTRY_KW "KW" /* KUWAIT */ +#define HPDF_COUNTRY_KG "KG" /* KYRGYZSTAN */ +#define HPDF_COUNTRY_LA "LA" /* LAO PEOPLE'S DEMOCRATIC REPUBLIC */ +#define HPDF_COUNTRY_LV "LV" /* LATVIA */ +#define HPDF_COUNTRY_LB "LB" /* LEBANON */ +#define HPDF_COUNTRY_LS "LS" /* LESOTHO */ +#define HPDF_COUNTRY_LR "LR" /* LIBERIA */ +#define HPDF_COUNTRY_LY "LY" /* LIBYAN ARAB JAMAHIRIYA */ +#define HPDF_COUNTRY_LI "LI" /* LIECHTENSTEIN */ +#define HPDF_COUNTRY_LT "LT" /* LITHUANIA */ +#define HPDF_COUNTRY_LU "LU" /* LUXEMBOURG */ +#define HPDF_COUNTRY_MO "MO" /* MACAU */ +#define HPDF_COUNTRY_MK "MK" /* MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF */ +#define HPDF_COUNTRY_MG "MG" /* MADAGASCAR */ +#define HPDF_COUNTRY_MW "MW" /* MALAWI */ +#define HPDF_COUNTRY_MY "MY" /* MALAYSIA */ +#define HPDF_COUNTRY_MV "MV" /* MALDIVES */ +#define HPDF_COUNTRY_ML "ML" /* MALI */ +#define HPDF_COUNTRY_MT "MT" /* MALTA */ +#define HPDF_COUNTRY_MH "MH" /* MARSHALL ISLANDS */ +#define HPDF_COUNTRY_MQ "MQ" /* MARTINIQUE */ +#define HPDF_COUNTRY_MR "MR" /* MAURITANIA */ +#define HPDF_COUNTRY_MU "MU" /* MAURITIUS */ +#define HPDF_COUNTRY_YT "YT" /* MAYOTTE */ +#define HPDF_COUNTRY_MX "MX" /* MEXICO */ +#define HPDF_COUNTRY_FM "FM" /* MICRONESIA, FEDERATED STATES OF */ +#define HPDF_COUNTRY_MD "MD" /* MOLDOVA, REPUBLIC OF */ +#define HPDF_COUNTRY_MC "MC" /* MONACO */ +#define HPDF_COUNTRY_MN "MN" /* MONGOLIA */ +#define HPDF_COUNTRY_MS "MS" /* MONTSERRAT */ +#define HPDF_COUNTRY_MA "MA" /* MOROCCO */ +#define HPDF_COUNTRY_MZ "MZ" /* MOZAMBIQUE */ +#define HPDF_COUNTRY_MM "MM" /* MYANMAR */ +#define HPDF_COUNTRY_NA "NA" /* NAMIBIA */ +#define HPDF_COUNTRY_NR "NR" /* NAURU */ +#define HPDF_COUNTRY_NP "NP" /* NEPAL */ +#define HPDF_COUNTRY_NL "NL" /* NETHERLANDS */ +#define HPDF_COUNTRY_AN "AN" /* NETHERLANDS ANTILLES */ +#define HPDF_COUNTRY_NC "NC" /* NEW CALEDONIA */ +#define HPDF_COUNTRY_NZ "NZ" /* NEW ZEALAND */ +#define HPDF_COUNTRY_NI "NI" /* NICARAGUA */ +#define HPDF_COUNTRY_NE "NE" /* NIGER */ +#define HPDF_COUNTRY_NG "NG" /* NIGERIA */ +#define HPDF_COUNTRY_NU "NU" /* NIUE */ +#define HPDF_COUNTRY_NF "NF" /* NORFOLK ISLAND */ +#define HPDF_COUNTRY_MP "MP" /* NORTHERN MARIANA ISLANDS */ +#define HPDF_COUNTRY_NO "NO" /* NORWAY */ +#define HPDF_COUNTRY_OM "OM" /* OMAN */ +#define HPDF_COUNTRY_PK "PK" /* PAKISTAN */ +#define HPDF_COUNTRY_PW "PW" /* PALAU */ +#define HPDF_COUNTRY_PA "PA" /* PANAMA */ +#define HPDF_COUNTRY_PG "PG" /* PAPUA NEW GUINEA */ +#define HPDF_COUNTRY_PY "PY" /* PARAGUAY */ +#define HPDF_COUNTRY_PE "PE" /* PERU */ +#define HPDF_COUNTRY_PH "PH" /* PHILIPPINES */ +#define HPDF_COUNTRY_PN "PN" /* PITCAIRN */ +#define HPDF_COUNTRY_PL "PL" /* POLAND */ +#define HPDF_COUNTRY_PT "PT" /* PORTUGAL */ +#define HPDF_COUNTRY_PR "PR" /* PUERTO RICO */ +#define HPDF_COUNTRY_QA "QA" /* QATAR */ +#define HPDF_COUNTRY_RE "RE" /* REUNION */ +#define HPDF_COUNTRY_RO "RO" /* ROMANIA */ +#define HPDF_COUNTRY_RU "RU" /* RUSSIAN FEDERATION */ +#define HPDF_COUNTRY_RW "RW" /* RWANDA */ +#define HPDF_COUNTRY_KN "KN" /* SAINT KITTS AND NEVIS */ +#define HPDF_COUNTRY_LC "LC" /* SAINT LUCIA */ +#define HPDF_COUNTRY_VC "VC" /* SAINT VINCENT AND THE GRENADINES */ +#define HPDF_COUNTRY_WS "WS" /* SAMOA */ +#define HPDF_COUNTRY_SM "SM" /* SAN MARINO */ +#define HPDF_COUNTRY_ST "ST" /* SAO TOME AND PRINCIPE */ +#define HPDF_COUNTRY_SA "SA" /* SAUDI ARABIA */ +#define HPDF_COUNTRY_SN "SN" /* SENEGAL */ +#define HPDF_COUNTRY_SC "SC" /* SEYCHELLES */ +#define HPDF_COUNTRY_SL "SL" /* SIERRA LEONE */ +#define HPDF_COUNTRY_SG "SG" /* SINGAPORE */ +#define HPDF_COUNTRY_SK "SK" /* SLOVAKIA (Slovak Republic) */ +#define HPDF_COUNTRY_SI "SI" /* SLOVENIA */ +#define HPDF_COUNTRY_SB "SB" /* SOLOMON ISLANDS */ +#define HPDF_COUNTRY_SO "SO" /* SOMALIA */ +#define HPDF_COUNTRY_ZA "ZA" /* SOUTH AFRICA */ +#define HPDF_COUNTRY_ES "ES" /* SPAIN */ +#define HPDF_COUNTRY_LK "LK" /* SRI LANKA */ +#define HPDF_COUNTRY_SH "SH" /* ST. HELENA */ +#define HPDF_COUNTRY_PM "PM" /* ST. PIERRE AND MIQUELON */ +#define HPDF_COUNTRY_SD "SD" /* SUDAN */ +#define HPDF_COUNTRY_SR "SR" /* SURINAME */ +#define HPDF_COUNTRY_SJ "SJ" /* SVALBARD AND JAN MAYEN ISLANDS */ +#define HPDF_COUNTRY_SZ "SZ" /* SWAZILAND */ +#define HPDF_COUNTRY_SE "SE" /* SWEDEN */ +#define HPDF_COUNTRY_CH "CH" /* SWITZERLAND */ +#define HPDF_COUNTRY_SY "SY" /* SYRIAN ARAB REPUBLIC */ +#define HPDF_COUNTRY_TW "TW" /* TAIWAN, PROVINCE OF CHINA */ +#define HPDF_COUNTRY_TJ "TJ" /* TAJIKISTAN */ +#define HPDF_COUNTRY_TZ "TZ" /* TANZANIA, UNITED REPUBLIC OF */ +#define HPDF_COUNTRY_TH "TH" /* THAILAND */ +#define HPDF_COUNTRY_TG "TG" /* TOGO */ +#define HPDF_COUNTRY_TK "TK" /* TOKELAU */ +#define HPDF_COUNTRY_TO "TO" /* TONGA */ +#define HPDF_COUNTRY_TT "TT" /* TRINIDAD AND TOBAGO */ +#define HPDF_COUNTRY_TN "TN" /* TUNISIA */ +#define HPDF_COUNTRY_TR "TR" /* TURKEY */ +#define HPDF_COUNTRY_TM "TM" /* TURKMENISTAN */ +#define HPDF_COUNTRY_TC "TC" /* TURKS AND CAICOS ISLANDS */ +#define HPDF_COUNTRY_TV "TV" /* TUVALU */ +#define HPDF_COUNTRY_UG "UG" /* UGANDA */ +#define HPDF_COUNTRY_UA "UA" /* UKRAINE */ +#define HPDF_COUNTRY_AE "AE" /* UNITED ARAB EMIRATES */ +#define HPDF_COUNTRY_GB "GB" /* UNITED KINGDOM */ +#define HPDF_COUNTRY_US "US" /* UNITED STATES */ +#define HPDF_COUNTRY_UM "UM" /* UNITED STATES MINOR OUTLYING ISLANDS */ +#define HPDF_COUNTRY_UY "UY" /* URUGUAY */ +#define HPDF_COUNTRY_UZ "UZ" /* UZBEKISTAN */ +#define HPDF_COUNTRY_VU "VU" /* VANUATU */ +#define HPDF_COUNTRY_VA "VA" /* VATICAN CITY STATE (HOLY SEE) */ +#define HPDF_COUNTRY_VE "VE" /* VENEZUELA */ +#define HPDF_COUNTRY_VN "VN" /* VIET NAM */ +#define HPDF_COUNTRY_VG "VG" /* VIRGIN ISLANDS (BRITISH) */ +#define HPDF_COUNTRY_VI "VI" /* VIRGIN ISLANDS (U.S.) */ +#define HPDF_COUNTRY_WF "WF" /* WALLIS AND FUTUNA ISLANDS */ +#define HPDF_COUNTRY_EH "EH" /* WESTERN SAHARA */ +#define HPDF_COUNTRY_YE "YE" /* YEMEN */ +#define HPDF_COUNTRY_YU "YU" /* YUGOSLAVIA */ +#define HPDF_COUNTRY_ZR "ZR" /* ZAIRE */ +#define HPDF_COUNTRY_ZM "ZM" /* ZAMBIA */ +#define HPDF_COUNTRY_ZW "ZW" /* ZIMBABWE */ + +/*----------------------------------------------------------------------------*/ +/*----- lang code definition -------------------------------------------------*/ + +#define HPDF_LANG_AA "aa" /* Afar */ +#define HPDF_LANG_AB "ab" /* Abkhazian */ +#define HPDF_LANG_AF "af" /* Afrikaans */ +#define HPDF_LANG_AM "am" /* Amharic */ +#define HPDF_LANG_AR "ar" /* Arabic */ +#define HPDF_LANG_AS "as" /* Assamese */ +#define HPDF_LANG_AY "ay" /* Aymara */ +#define HPDF_LANG_AZ "az" /* Azerbaijani */ +#define HPDF_LANG_BA "ba" /* Bashkir */ +#define HPDF_LANG_BE "be" /* Byelorussian */ +#define HPDF_LANG_BG "bg" /* Bulgarian */ +#define HPDF_LANG_BH "bh" /* Bihari */ +#define HPDF_LANG_BI "bi" /* Bislama */ +#define HPDF_LANG_BN "bn" /* Bengali Bangla */ +#define HPDF_LANG_BO "bo" /* Tibetan */ +#define HPDF_LANG_BR "br" /* Breton */ +#define HPDF_LANG_CA "ca" /* Catalan */ +#define HPDF_LANG_CO "co" /* Corsican */ +#define HPDF_LANG_CS "cs" /* Czech */ +#define HPDF_LANG_CY "cy" /* Welsh */ +#define HPDF_LANG_DA "da" /* Danish */ +#define HPDF_LANG_DE "de" /* German */ +#define HPDF_LANG_DZ "dz" /* Bhutani */ +#define HPDF_LANG_EL "el" /* Greek */ +#define HPDF_LANG_EN "en" /* English */ +#define HPDF_LANG_EO "eo" /* Esperanto */ +#define HPDF_LANG_ES "es" /* Spanish */ +#define HPDF_LANG_ET "et" /* Estonian */ +#define HPDF_LANG_EU "eu" /* Basque */ +#define HPDF_LANG_FA "fa" /* Persian */ +#define HPDF_LANG_FI "fi" /* Finnish */ +#define HPDF_LANG_FJ "fj" /* Fiji */ +#define HPDF_LANG_FO "fo" /* Faeroese */ +#define HPDF_LANG_FR "fr" /* French */ +#define HPDF_LANG_FY "fy" /* Frisian */ +#define HPDF_LANG_GA "ga" /* Irish */ +#define HPDF_LANG_GD "gd" /* Scots Gaelic */ +#define HPDF_LANG_GL "gl" /* Galician */ +#define HPDF_LANG_GN "gn" /* Guarani */ +#define HPDF_LANG_GU "gu" /* Gujarati */ +#define HPDF_LANG_HA "ha" /* Hausa */ +#define HPDF_LANG_HI "hi" /* Hindi */ +#define HPDF_LANG_HR "hr" /* Croatian */ +#define HPDF_LANG_HU "hu" /* Hungarian */ +#define HPDF_LANG_HY "hy" /* Armenian */ +#define HPDF_LANG_IA "ia" /* Interlingua */ +#define HPDF_LANG_IE "ie" /* Interlingue */ +#define HPDF_LANG_IK "ik" /* Inupiak */ +#define HPDF_LANG_IN "in" /* Indonesian */ +#define HPDF_LANG_IS "is" /* Icelandic */ +#define HPDF_LANG_IT "it" /* Italian */ +#define HPDF_LANG_IW "iw" /* Hebrew */ +#define HPDF_LANG_JA "ja" /* Japanese */ +#define HPDF_LANG_JI "ji" /* Yiddish */ +#define HPDF_LANG_JW "jw" /* Javanese */ +#define HPDF_LANG_KA "ka" /* Georgian */ +#define HPDF_LANG_KK "kk" /* Kazakh */ +#define HPDF_LANG_KL "kl" /* Greenlandic */ +#define HPDF_LANG_KM "km" /* Cambodian */ +#define HPDF_LANG_KN "kn" /* Kannada */ +#define HPDF_LANG_KO "ko" /* Korean */ +#define HPDF_LANG_KS "ks" /* Kashmiri */ +#define HPDF_LANG_KU "ku" /* Kurdish */ +#define HPDF_LANG_KY "ky" /* Kirghiz */ +#define HPDF_LANG_LA "la" /* Latin */ +#define HPDF_LANG_LN "ln" /* Lingala */ +#define HPDF_LANG_LO "lo" /* Laothian */ +#define HPDF_LANG_LT "lt" /* Lithuanian */ +#define HPDF_LANG_LV "lv" /* Latvian,Lettish */ +#define HPDF_LANG_MG "mg" /* Malagasy */ +#define HPDF_LANG_MI "mi" /* Maori */ +#define HPDF_LANG_MK "mk" /* Macedonian */ +#define HPDF_LANG_ML "ml" /* Malayalam */ +#define HPDF_LANG_MN "mn" /* Mongolian */ +#define HPDF_LANG_MO "mo" /* Moldavian */ +#define HPDF_LANG_MR "mr" /* Marathi */ +#define HPDF_LANG_MS "ms" /* Malay */ +#define HPDF_LANG_MT "mt" /* Maltese */ +#define HPDF_LANG_MY "my" /* Burmese */ +#define HPDF_LANG_NA "na" /* Nauru */ +#define HPDF_LANG_NE "ne" /* Nepali */ +#define HPDF_LANG_NL "nl" /* Dutch */ +#define HPDF_LANG_NO "no" /* Norwegian */ +#define HPDF_LANG_OC "oc" /* Occitan */ +#define HPDF_LANG_OM "om" /* (Afan)Oromo */ +#define HPDF_LANG_OR "or" /* Oriya */ +#define HPDF_LANG_PA "pa" /* Punjabi */ +#define HPDF_LANG_PL "pl" /* Polish */ +#define HPDF_LANG_PS "ps" /* Pashto,Pushto */ +#define HPDF_LANG_PT "pt" /* Portuguese */ +#define HPDF_LANG_QU "qu" /* Quechua */ +#define HPDF_LANG_RM "rm" /* Rhaeto-Romance */ +#define HPDF_LANG_RN "rn" /* Kirundi */ +#define HPDF_LANG_RO "ro" /* Romanian */ +#define HPDF_LANG_RU "ru" /* Russian */ +#define HPDF_LANG_RW "rw" /* Kinyarwanda */ +#define HPDF_LANG_SA "sa" /* Sanskrit */ +#define HPDF_LANG_SD "sd" /* Sindhi */ +#define HPDF_LANG_SG "sg" /* Sangro */ +#define HPDF_LANG_SH "sh" /* Serbo-Croatian */ +#define HPDF_LANG_SI "si" /* Singhalese */ +#define HPDF_LANG_SK "sk" /* Slovak */ +#define HPDF_LANG_SL "sl" /* Slovenian */ +#define HPDF_LANG_SM "sm" /* Samoan */ +#define HPDF_LANG_SN "sn" /* Shona */ +#define HPDF_LANG_SO "so" /* Somali */ +#define HPDF_LANG_SQ "sq" /* Albanian */ +#define HPDF_LANG_SR "sr" /* Serbian */ +#define HPDF_LANG_SS "ss" /* Siswati */ +#define HPDF_LANG_ST "st" /* Sesotho */ +#define HPDF_LANG_SU "su" /* Sundanese */ +#define HPDF_LANG_SV "sv" /* Swedish */ +#define HPDF_LANG_SW "sw" /* Swahili */ +#define HPDF_LANG_TA "ta" /* Tamil */ +#define HPDF_LANG_TE "te" /* Tegulu */ +#define HPDF_LANG_TG "tg" /* Tajik */ +#define HPDF_LANG_TH "th" /* Thai */ +#define HPDF_LANG_TI "ti" /* Tigrinya */ +#define HPDF_LANG_TK "tk" /* Turkmen */ +#define HPDF_LANG_TL "tl" /* Tagalog */ +#define HPDF_LANG_TN "tn" /* Setswanato Tonga */ +#define HPDF_LANG_TR "tr" /* Turkish */ +#define HPDF_LANG_TS "ts" /* Tsonga */ +#define HPDF_LANG_TT "tt" /* Tatar */ +#define HPDF_LANG_TW "tw" /* Twi */ +#define HPDF_LANG_UK "uk" /* Ukrainian */ +#define HPDF_LANG_UR "ur" /* Urdu */ +#define HPDF_LANG_UZ "uz" /* Uzbek */ +#define HPDF_LANG_VI "vi" /* Vietnamese */ +#define HPDF_LANG_VO "vo" /* Volapuk */ +#define HPDF_LANG_WO "wo" /* Wolof */ +#define HPDF_LANG_XH "xh" /* Xhosa */ +#define HPDF_LANG_YO "yo" /* Yoruba */ +#define HPDF_LANG_ZH "zh" /* Chinese */ +#define HPDF_LANG_ZU "zu" /* Zulu */ + + +/*----------------------------------------------------------------------------*/ +/*----- Graphis mode ---------------------------------------------------------*/ + +#define HPDF_GMODE_PAGE_DESCRIPTION 0x0001 +#define HPDF_GMODE_PATH_OBJECT 0x0002 +#define HPDF_GMODE_TEXT_OBJECT 0x0004 +#define HPDF_GMODE_CLIPPING_PATH 0x0008 +#define HPDF_GMODE_SHADING 0x0010 +#define HPDF_GMODE_INLINE_IMAGE 0x0020 +#define HPDF_GMODE_EXTERNAL_OBJECT 0x0040 + + +/*----------------------------------------------------------------------------*/ + +#endif /* _HPDF_CONSTS_H */ diff --git a/code/libharu/hpdf_destination.h b/code/libharu/hpdf_destination.h new file mode 100644 index 0000000..d7ec27a --- /dev/null +++ b/code/libharu/hpdf_destination.h @@ -0,0 +1,44 @@ +/* + * << Haru Free PDF Library >> -- hpdf_destination.c + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_DESTINATION_H +#define _HPDF_DESTINATION_H + +#include "hpdf_objects.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------------------------*/ +/*----- HPDF_Destination -----------------------------------------------------*/ + +HPDF_Destination +HPDF_Destination_New (HPDF_MMgr mmgr, + HPDF_Page target, + HPDF_Xref xref); + + +HPDF_BOOL +HPDF_Destination_Validate (HPDF_Destination dst); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_DESTINATION_H */ + diff --git a/code/libharu/hpdf_doc.h b/code/libharu/hpdf_doc.h new file mode 100644 index 0000000..89779c0 --- /dev/null +++ b/code/libharu/hpdf_doc.h @@ -0,0 +1,162 @@ +/* + * << Haru Free PDF Library >> -- hpdf_doc.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + + +#ifndef _HPDF_DOC_H +#define _HPDF_DOC_H + +#define HPDF_SIG_BYTES 0x41504446L + +#include "hpdf_catalog.h" +#include "hpdf_image.h" +#include "hpdf_pages.h" +#include "hpdf_outline.h" +#include "hpdf_ext_gstate.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define HPDF_VER_DEFAULT HPDF_VER_12 + +typedef struct _HPDF_Doc_Rec { + HPDF_UINT32 sig_bytes; + HPDF_PDFVer pdf_version; + + HPDF_MMgr mmgr; + HPDF_Catalog catalog; + HPDF_Outline outlines; + HPDF_Xref xref; + HPDF_Pages root_pages; + HPDF_Pages cur_pages; + HPDF_Page cur_page; + HPDF_List page_list; + HPDF_Error_Rec error; + HPDF_Dict info; + HPDF_Dict trailer; + + HPDF_List font_mgr; + HPDF_BYTE ttfont_tag[6]; + + /* list for loaded fontdefs */ + HPDF_List fontdef_list; + + /* list for loaded encodings */ + HPDF_List encoder_list; + + HPDF_Encoder cur_encoder; + + /* default compression mode */ + HPDF_BOOL compression_mode; + + HPDF_BOOL encrypt_on; + HPDF_EncryptDict encrypt_dict; + + HPDF_Encoder def_encoder; + + HPDF_UINT page_per_pages; + HPDF_UINT cur_page_num; + + /* buffer for saving into memory stream */ + HPDF_Stream stream; +} HPDF_Doc_Rec; + +typedef struct _HPDF_Doc_Rec *HPDF_Doc; + + +HPDF_Encoder +HPDF_Doc_FindEncoder (HPDF_Doc pdf, + const char *encoding_name); + + +HPDF_FontDef +HPDF_Doc_FindFontDef (HPDF_Doc pdf, + const char *font_name); + + +HPDF_Font +HPDF_Doc_FindFont (HPDF_Doc pdf, + const char *font_name, + const char *encoding_name); + + +HPDF_BOOL +HPDF_Doc_Validate (HPDF_Doc pdf); + + +/*----- page handling -------------------------------------------------------*/ + +HPDF_Pages +HPDF_Doc_GetCurrentPages (HPDF_Doc pdf); + + +HPDF_Pages +HPDF_Doc_AddPagesTo (HPDF_Doc pdf, + HPDF_Pages parent); + + +HPDF_STATUS +HPDF_Doc_SetCurrentPages (HPDF_Doc pdf, + HPDF_Pages pages); + + +HPDF_STATUS +HPDF_Doc_SetCurrentPage (HPDF_Doc pdf, + HPDF_Page page); + + + + +/*----- font handling -------------------------------------------------------*/ + +HPDF_FontDef +HPDF_GetFontDef (HPDF_Doc pdf, + const char *font_name); + + +HPDF_STATUS +HPDF_Doc_RegisterFontDef (HPDF_Doc pdf, + HPDF_FontDef fontdef); + + +/*----- encoding handling ---------------------------------------------------*/ + +HPDF_STATUS +HPDF_Doc_RegisterEncoder (HPDF_Doc pdf, + HPDF_Encoder encoder); + + + +/*----- encryptio------------------------------------------------------------*/ + +HPDF_STATUS +HPDF_Doc_SetEncryptOn (HPDF_Doc pdf); + + +HPDF_STATUS +HPDF_Doc_SetEncryptOff (HPDF_Doc pdf); + + +HPDF_STATUS +HPDF_Doc_PrepareEncryption (HPDF_Doc pdf); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_DOC_H */ + diff --git a/code/libharu/hpdf_encoder.h b/code/libharu/hpdf_encoder.h new file mode 100644 index 0000000..411d78d --- /dev/null +++ b/code/libharu/hpdf_encoder.h @@ -0,0 +1,318 @@ +/* + * << Haru Free PDF Library >> -- hpdf_encoder.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_ENCODER_H +#define _HPDF_ENCODER_H + +#include "hpdf_consts.h" +#include "hpdf_streams.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*-- HPDF_Encoder ---------------------------------------*/ + +#define HPDF_ENCODER_SIG_BYTES 0x454E4344L + +/*----------------------------------------------------------------------------*/ +/*------ predefined font encodings -------------------------------------------*/ + +#define HPDF_ENCODING_FONT_SPECIFIC "FontSpecific" +#define HPDF_ENCODING_STANDARD "StandardEncoding" +#define HPDF_ENCODING_MAC_ROMAN "MacRomanEncoding" +#define HPDF_ENCODING_WIN_ANSI "WinAnsiEncoding" +#define HPDF_ENCODING_ISO8859_2 "ISO8859-2" +#define HPDF_ENCODING_ISO8859_3 "ISO8859-3" +#define HPDF_ENCODING_ISO8859_4 "ISO8859-4" +#define HPDF_ENCODING_ISO8859_5 "ISO8859-5" +#define HPDF_ENCODING_ISO8859_6 "ISO8859-6" +#define HPDF_ENCODING_ISO8859_7 "ISO8859-7" +#define HPDF_ENCODING_ISO8859_8 "ISO8859-8" +#define HPDF_ENCODING_ISO8859_9 "ISO8859-9" +#define HPDF_ENCODING_ISO8859_10 "ISO8859-10" +#define HPDF_ENCODING_ISO8859_11 "ISO8859-11" +#define HPDF_ENCODING_ISO8859_13 "ISO8859-13" +#define HPDF_ENCODING_ISO8859_14 "ISO8859-14" +#define HPDF_ENCODING_ISO8859_15 "ISO8859-15" +#define HPDF_ENCODING_ISO8859_16 "ISO8859-16" +#define HPDF_ENCODING_CP1250 "CP1250" +#define HPDF_ENCODING_CP1251 "CP1251" +#define HPDF_ENCODING_CP1252 "CP1252" +#define HPDF_ENCODING_CP1253 "CP1253" +#define HPDF_ENCODING_CP1254 "CP1254" +#define HPDF_ENCODING_CP1255 "CP1255" +#define HPDF_ENCODING_CP1256 "CP1256" +#define HPDF_ENCODING_CP1257 "CP1257" +#define HPDF_ENCODING_CP1258 "CP1258" +#define HPDF_ENCODING_KOI8_R "KOI8-R" + +/*----------------------------------------------------------------------------*/ +/*----- definition for font encoding -----------------------------------------*/ + +#define char_NOTDEF ".notdef" + +typedef enum _HPDF_EncodingType { + HPDF_STANDARD_ENCODING = 0, + HPDF_MAC_ROMAN_ENCODING, + HPDF_WIN_ANSI_ENCODING, + HPDF_FONT_SPECIFIC, + HPDF_ENCODING_EOF +} HPDF_EncodingType; + + +typedef struct _HPDF_ParseText_Rec { + const HPDF_BYTE *text; + HPDF_UINT index; + HPDF_UINT len; + HPDF_ByteType byte_type; +} HPDF_ParseText_Rec; + + +typedef struct _HPDF_Encoder_Rec *HPDF_Encoder; + +typedef HPDF_ByteType +(*HPDF_Encoder_ByteType_Func) (HPDF_Encoder encoder, + HPDF_ParseText_Rec *state); + +typedef HPDF_UNICODE +(*HPDF_Encoder_ToUnicode_Func) (HPDF_Encoder encoder, + HPDF_UINT16 code); + +typedef char * +(*HPDF_Encoder_EncodeText_Func) (HPDF_Encoder encoder, + const char *text, + HPDF_UINT len, + HPDF_UINT *encoded_length); + +typedef HPDF_STATUS +(*HPDF_Encoder_Write_Func) (HPDF_Encoder encoder, + HPDF_Stream out); + + +typedef HPDF_STATUS +(*HPDF_Encoder_Init_Func) (HPDF_Encoder encoder); + + +typedef void +(*HPDF_Encoder_Free_Func) (HPDF_Encoder encoder); + + +typedef struct _HPDF_Encoder_Rec { + HPDF_UINT32 sig_bytes; + char name[HPDF_LIMIT_MAX_NAME_LEN + 1]; + HPDF_MMgr mmgr; + HPDF_Error error; + HPDF_EncoderType type; + + HPDF_Encoder_ByteType_Func byte_type_fn; + HPDF_Encoder_ToUnicode_Func to_unicode_fn; + HPDF_Encoder_EncodeText_Func encode_text_fn; + HPDF_Encoder_Write_Func write_fn; + HPDF_Encoder_Free_Func free_fn; + HPDF_Encoder_Init_Func init_fn; + /* + char lang_code[3]; + char country_code[3]; + */ + void *attr; +} HPDF_Encoder_Rec; + + +typedef enum _HPDF_BaseEncodings { + HPDF_BASE_ENCODING_STANDARD, + HPDF_BASE_ENCODING_WIN_ANSI, + HPDF_BASE_ENCODING_MAC_ROMAN, + HPDF_BASE_ENCODING_FONT_SPECIFIC, + HPDF_BASE_ENCODING_EOF +} HPDF_BaseEncodings; + +HPDF_STATUS +HPDF_Encoder_Validate (HPDF_Encoder encoder); + +void +HPDF_Encoder_SetParseText (HPDF_Encoder encoder, + HPDF_ParseText_Rec *state, + const HPDF_BYTE *text, + HPDF_UINT len); + +HPDF_ByteType +HPDF_Encoder_ByteType (HPDF_Encoder encoder, + HPDF_ParseText_Rec *state); + + + +HPDF_UNICODE +HPDF_Encoder_ToUnicode (HPDF_Encoder encoder, + HPDF_UINT16 code); + + +void +HPDF_Encoder_Free (HPDF_Encoder encoder); + +/*-- HPDF_BasicEncoder ----------------------------------*/ + + +typedef struct _HPDF_BasicEncoderAttr_Rec *HPDF_BasicEncoderAttr; + +typedef struct _HPDF_BasicEncoderAttr_Rec { + char base_encoding[HPDF_LIMIT_MAX_NAME_LEN + 1]; + HPDF_BYTE first_char; + HPDF_BYTE last_char; + HPDF_UNICODE unicode_map[256]; + HPDF_BOOL has_differences; + HPDF_BYTE differences[256]; +} HPDF_BasicEncoderAttr_Rec; + + +HPDF_Encoder +HPDF_BasicEncoder_New (HPDF_MMgr mmgr, + const char *encoding_name); + + +void +HPDF_BasicEncoder_Free (HPDF_Encoder encoder); + + +HPDF_STATUS +HPDF_BasicEncoder_Write (HPDF_Encoder encoder, + HPDF_Stream out); + + +HPDF_UNICODE +HPDF_BasicEncoder_ToUnicode (HPDF_Encoder encoder, + HPDF_UINT16 code); + +/*-- HPDF_CMapEncoder ----------------------------------*/ + +typedef HPDF_BOOL +(*HPDF_CMapEncoder_ByteType_Func) (HPDF_Encoder encoder, + HPDF_BYTE b); + +typedef struct _HPDF_CidRange_Rec { + HPDF_UINT16 from; + HPDF_UINT16 to; + HPDF_UINT16 cid; +} HPDF_CidRange_Rec; + + +typedef struct _HPDF_UnicodeMap_Rec { + HPDF_UINT16 code; + HPDF_UINT16 unicode; +} HPDF_UnicodeMap_Rec; + +typedef struct _HPDF_CMapEncoderAttr_Rec *HPDF_CMapEncoderAttr; + +typedef struct _HPDF_CMapEncoderAttr_Rec { + HPDF_UNICODE unicode_map[256][256]; + HPDF_UINT16 cid_map[256][256]; + HPDF_UINT16 jww_line_head[HPDF_MAX_JWW_NUM]; + HPDF_List cmap_range; + HPDF_List notdef_range; + HPDF_List code_space_range; + HPDF_WritingMode writing_mode; + char registry[HPDF_LIMIT_MAX_NAME_LEN + 1]; + char ordering[HPDF_LIMIT_MAX_NAME_LEN + 1]; + HPDF_INT suppliment; + HPDF_CMapEncoder_ByteType_Func is_lead_byte_fn; + HPDF_CMapEncoder_ByteType_Func is_trial_byte_fn; + HPDF_INT uid_offset; + HPDF_UINT xuid[3]; +} HPDF_CMapEncoderAttr_Rec; + + +HPDF_Encoder +HPDF_CMapEncoder_New (HPDF_MMgr mmgr, + char *name, + HPDF_Encoder_Init_Func init_fn); + + +HPDF_STATUS +HPDF_CMapEncoder_InitAttr (HPDF_Encoder encoder); + + +void +HPDF_CMapEncoder_Free (HPDF_Encoder encoder); + + +HPDF_STATUS +HPDF_CMapEncoder_Write (HPDF_Encoder encoder, + HPDF_Stream out); + + +HPDF_UNICODE +HPDF_CMapEncoder_ToUnicode (HPDF_Encoder encoder, + HPDF_UINT16 code); + +HPDF_UINT16 +HPDF_CMapEncoder_ToCID (HPDF_Encoder encoder, + HPDF_UINT16 code); + +HPDF_STATUS +HPDF_CMapEncoder_SetParseText (HPDF_Encoder encoder, + HPDF_ParseText_Rec *state, + const HPDF_BYTE *text, + HPDF_UINT len); + +HPDF_ByteType +HPDF_CMapEncoder_ByteType (HPDF_Encoder encoder, + HPDF_ParseText_Rec *state); + + +HPDF_STATUS +HPDF_CMapEncoder_AddCMap (HPDF_Encoder encoder, + const HPDF_CidRange_Rec *range); + + +HPDF_STATUS +HPDF_CMapEncoder_AddNotDefRange (HPDF_Encoder encoder, + HPDF_CidRange_Rec range); + + +HPDF_STATUS +HPDF_CMapEncoder_AddCodeSpaceRange (HPDF_Encoder encoder, + HPDF_CidRange_Rec range); + + +void +HPDF_CMapEncoder_SetUnicodeArray (HPDF_Encoder encoder, + const HPDF_UnicodeMap_Rec *array1); + + +HPDF_STATUS +HPDF_CMapEncoder_AddJWWLineHead (HPDF_Encoder encoder, + const HPDF_UINT16 *code); + +HPDF_BOOL +HPDF_Encoder_CheckJWWLineHead (HPDF_Encoder encoder, + const HPDF_UINT16 code); + +/*-- utility functions ----------------------------------*/ + +const char* +HPDF_UnicodeToGryphName (HPDF_UNICODE unicode); + + +HPDF_UNICODE +HPDF_GryphNameToUnicode (const char *gryph_name); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_ENCODER_H */ + diff --git a/code/libharu/hpdf_encrypt.h b/code/libharu/hpdf_encrypt.h new file mode 100644 index 0000000..f9fddb8 --- /dev/null +++ b/code/libharu/hpdf_encrypt.h @@ -0,0 +1,159 @@ +/* + * << Haru Free PDF Library >> -- hpdf_encrypt.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + *------------------------------------------------------------------------------ + * + * The code implements MD5 message-digest algorithm is based on the code + * written by Colin Plumb. + * The copyright of it is as follows. + * + * This code implements the MD5 message-digest algorithm. + * The algorithm is due to Ron Rivest. This code was + * written by Colin Plumb in 1993, no copyright is claimed. + * This code is in the public domain; do with it what you wish. + * + * Equivalent code is available from RSA Data Security, Inc. + * This code has been tested against that, and is equivalent, + * except that you don't need to include two pages of legalese + * with every copy. + * + * To compute the message digest of a chunk of bytes, declare an + * MD5Context structure, pass it to MD5Init, call MD5Update as + * needed on buffers full of bytes, and then call MD5Final, which + * will fill a supplied 16-byte array with the digest. + * + *---------------------------------------------------------------------------*/ + +#ifndef HPDF_ENCRYPT_H +#define HPDF_ENCRYPT_H + +#include "hpdf_mmgr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------------------------*/ +/*----- encrypt-dict ---------------------------------------------------------*/ + +#define HPDF_ID_LEN 16 +#define HPDF_PASSWD_LEN 32 +#define HPDF_ENCRYPT_KEY_MAX 16 +#define HPDF_MD5_KEY_LEN 16 +#define HPDF_PERMISSION_PAD 0xFFFFFFC0 +#define HPDF_ARC4_BUF_SIZE 256 + + +typedef struct HPDF_MD5Context +{ + HPDF_UINT32 buf[4]; + HPDF_UINT32 bits[2]; + HPDF_BYTE in[64]; +} HPDF_MD5_CTX; + + +typedef struct _HPDF_ARC4_Ctx_Rec { + HPDF_BYTE idx1; + HPDF_BYTE idx2; + HPDF_BYTE state[HPDF_ARC4_BUF_SIZE]; +} HPDF_ARC4_Ctx_Rec; + + +typedef struct _HPDF_Encrypt_Rec *HPDF_Encrypt; + +typedef struct _HPDF_Encrypt_Rec { + HPDF_EncryptMode mode; + + /* key_len must be a multiple of 8, and between 40 to 128 */ + HPDF_UINT key_len; + + /* owner-password (not encrypted) */ + HPDF_BYTE owner_passwd[HPDF_PASSWD_LEN]; + + /* user-password (not encrypted) */ + HPDF_BYTE user_passwd[HPDF_PASSWD_LEN]; + + /* owner-password (encrypted) */ + HPDF_BYTE owner_key[HPDF_PASSWD_LEN]; + + /* user-password (encrypted) */ + HPDF_BYTE user_key[HPDF_PASSWD_LEN]; + + HPDF_INT permission; + HPDF_BYTE encrypt_id[HPDF_ID_LEN]; + HPDF_BYTE encryption_key[HPDF_MD5_KEY_LEN + 5]; + HPDF_BYTE md5_encryption_key[HPDF_MD5_KEY_LEN]; + HPDF_ARC4_Ctx_Rec arc4ctx; +} HPDF_Encrypt_Rec; + + +void +HPDF_MD5Init (struct HPDF_MD5Context *ctx); + + +void +HPDF_MD5Update (struct HPDF_MD5Context *ctx, + const HPDF_BYTE *buf, + HPDF_UINT32 len); + + +void +HPDF_MD5Final (HPDF_BYTE digest[16], + struct HPDF_MD5Context *ctx); + +void +HPDF_PadOrTrancatePasswd (const char *pwd, + HPDF_BYTE *new_pwd); + + +void +HPDF_Encrypt_Init (HPDF_Encrypt attr); + + +void +HPDF_Encrypt_CreateUserKey (HPDF_Encrypt attr); + + +void +HPDF_Encrypt_CreateOwnerKey (HPDF_Encrypt attr); + + +void +HPDF_Encrypt_CreateEncryptionKey (HPDF_Encrypt attr); + + +void +HPDF_Encrypt_InitKey (HPDF_Encrypt attr, + HPDF_UINT32 object_id, + HPDF_UINT16 gen_no); + + +void +HPDF_Encrypt_Reset (HPDF_Encrypt attr); + + +void +HPDF_Encrypt_CryptBuf (HPDF_Encrypt attr, + const HPDF_BYTE *src, + HPDF_BYTE *dst, + HPDF_UINT len); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_ENCRYPT_H */ + + diff --git a/code/libharu/hpdf_encryptdict.h b/code/libharu/hpdf_encryptdict.h new file mode 100644 index 0000000..433eb67 --- /dev/null +++ b/code/libharu/hpdf_encryptdict.h @@ -0,0 +1,69 @@ +/* + * << Haru Free PDF Library >> -- hpdf_encryptdict.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_ENCRYPTDICT_H +#define _HPDF_ENCRYPTDICT_H + +#include "hpdf_objects.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*---------------------------------------------------------------------------*/ +/*------ HPDF_EncryptDict ---------------------------------------------------*/ + +HPDF_EncryptDict +HPDF_EncryptDict_New (HPDF_MMgr mmgr, + HPDF_Xref xref); + + +void +HPDF_EncryptDict_CreateID (HPDF_EncryptDict dict, + HPDF_Dict info, + HPDF_Xref xref); + + +void +HPDF_EncryptDict_OnFree (HPDF_Dict obj); + + +HPDF_STATUS +HPDF_EncryptDict_SetPassword (HPDF_EncryptDict dict, + const char *owner_passwd, + const char *user_passwd); + + +HPDF_BOOL +HPDF_EncryptDict_Validate (HPDF_EncryptDict dict); + + +HPDF_STATUS +HPDF_EncryptDict_Prepare (HPDF_EncryptDict dict, + HPDF_Dict info, + HPDF_Xref xref); + + +HPDF_Encrypt +HPDF_EncryptDict_GetAttr (HPDF_EncryptDict dict); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_ENCRYPTDICT_H */ + diff --git a/code/libharu/hpdf_error.h b/code/libharu/hpdf_error.h new file mode 100644 index 0000000..49374fe --- /dev/null +++ b/code/libharu/hpdf_error.h @@ -0,0 +1,203 @@ +/* + * << Haru Free PDF Library >> -- hpdf_error.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_ERROR_H +#define _HPDF_ERROR_H + +#include "hpdf_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* error-code */ +#define HPDF_ARRAY_COUNT_ERR 0x1001 +#define HPDF_ARRAY_ITEM_NOT_FOUND 0x1002 +#define HPDF_ARRAY_ITEM_UNEXPECTED_TYPE 0x1003 +#define HPDF_BINARY_LENGTH_ERR 0x1004 +#define HPDF_CANNOT_GET_PALLET 0x1005 +#define HPDF_DICT_COUNT_ERR 0x1007 +#define HPDF_DICT_ITEM_NOT_FOUND 0x1008 +#define HPDF_DICT_ITEM_UNEXPECTED_TYPE 0x1009 +#define HPDF_DICT_STREAM_LENGTH_NOT_FOUND 0x100A +#define HPDF_DOC_ENCRYPTDICT_NOT_FOUND 0x100B +#define HPDF_DOC_INVALID_OBJECT 0x100C +/* 0x100D */ +#define HPDF_DUPLICATE_REGISTRATION 0x100E +#define HPDF_EXCEED_JWW_CODE_NUM_LIMIT 0x100F +/* 0x1010 */ +#define HPDF_ENCRYPT_INVALID_PASSWORD 0x1011 +/* 0x1012 */ +#define HPDF_ERR_UNKNOWN_CLASS 0x1013 +#define HPDF_EXCEED_GSTATE_LIMIT 0x1014 +#define HPDF_FAILD_TO_ALLOC_MEM 0x1015 +#define HPDF_FILE_IO_ERROR 0x1016 +#define HPDF_FILE_OPEN_ERROR 0x1017 +/* 0x1018 */ +#define HPDF_FONT_EXISTS 0x1019 +#define HPDF_FONT_INVALID_WIDTHS_TABLE 0x101A +#define HPDF_INVALID_AFM_HEADER 0x101B +#define HPDF_INVALID_ANNOTATION 0x101C +/* 0x101D */ +#define HPDF_INVALID_BIT_PER_COMPONENT 0x101E +#define HPDF_INVALID_CHAR_MATRICS_DATA 0x101F +#define HPDF_INVALID_COLOR_SPACE 0x1020 +#define HPDF_INVALID_COMPRESSION_MODE 0x1021 +#define HPDF_INVALID_DATE_TIME 0x1022 +#define HPDF_INVALID_DESTINATION 0x1023 +/* 0x1024 */ +#define HPDF_INVALID_DOCUMENT 0x1025 +#define HPDF_INVALID_DOCUMENT_STATE 0x1026 +#define HPDF_INVALID_ENCODER 0x1027 +#define HPDF_INVALID_ENCODER_TYPE 0x1028 +/* 0x1029 */ +/* 0x102A */ +#define HPDF_INVALID_ENCODING_NAME 0x102B +#define HPDF_INVALID_ENCRYPT_KEY_LEN 0x102C +#define HPDF_INVALID_FONTDEF_DATA 0x102D +#define HPDF_INVALID_FONTDEF_TYPE 0x102E +#define HPDF_INVALID_FONT_NAME 0x102F +#define HPDF_INVALID_IMAGE 0x1030 +#define HPDF_INVALID_JPEG_DATA 0x1031 +#define HPDF_INVALID_N_DATA 0x1032 +#define HPDF_INVALID_OBJECT 0x1033 +#define HPDF_INVALID_OBJ_ID 0x1034 +#define HPDF_INVALID_OPERATION 0x1035 +#define HPDF_INVALID_OUTLINE 0x1036 +#define HPDF_INVALID_PAGE 0x1037 +#define HPDF_INVALID_PAGES 0x1038 +#define HPDF_INVALID_PARAMETER 0x1039 +/* 0x103A */ +#define HPDF_INVALID_PNG_IMAGE 0x103B +#define HPDF_INVALID_STREAM 0x103C +#define HPDF_MISSING_FILE_NAME_ENTRY 0x103D +/* 0x103E */ +#define HPDF_INVALID_TTC_FILE 0x103F +#define HPDF_INVALID_TTC_INDEX 0x1040 +#define HPDF_INVALID_WX_DATA 0x1041 +#define HPDF_ITEM_NOT_FOUND 0x1042 +#define HPDF_LIBPNG_ERROR 0x1043 +#define HPDF_NAME_INVALID_VALUE 0x1044 +#define HPDF_NAME_OUT_OF_RANGE 0x1045 +/* 0x1046 */ +/* 0x1047 */ +#define HPDF_PAGE_INVALID_PARAM_COUNT 0x1048 +#define HPDF_PAGES_MISSING_KIDS_ENTRY 0x1049 +#define HPDF_PAGE_CANNOT_FIND_OBJECT 0x104A +#define HPDF_PAGE_CANNOT_GET_ROOT_PAGES 0x104B +#define HPDF_PAGE_CANNOT_RESTORE_GSTATE 0x104C +#define HPDF_PAGE_CANNOT_SET_PARENT 0x104D +#define HPDF_PAGE_FONT_NOT_FOUND 0x104E +#define HPDF_PAGE_INVALID_FONT 0x104F +#define HPDF_PAGE_INVALID_FONT_SIZE 0x1050 +#define HPDF_PAGE_INVALID_GMODE 0x1051 +#define HPDF_PAGE_INVALID_INDEX 0x1052 +#define HPDF_PAGE_INVALID_ROTATE_VALUE 0x1053 +#define HPDF_PAGE_INVALID_SIZE 0x1054 +#define HPDF_PAGE_INVALID_XOBJECT 0x1055 +#define HPDF_PAGE_OUT_OF_RANGE 0x1056 +#define HPDF_REAL_OUT_OF_RANGE 0x1057 +#define HPDF_STREAM_EOF 0x1058 +#define HPDF_STREAM_READLN_CONTINUE 0x1059 +/* 0x105A */ +#define HPDF_STRING_OUT_OF_RANGE 0x105B +#define HPDF_THIS_FUNC_WAS_SKIPPED 0x105C +#define HPDF_TTF_CANNOT_EMBEDDING_FONT 0x105D +#define HPDF_TTF_INVALID_CMAP 0x105E +#define HPDF_TTF_INVALID_FOMAT 0x105F +#define HPDF_TTF_MISSING_TABLE 0x1060 +#define HPDF_UNSUPPORTED_FONT_TYPE 0x1061 +#define HPDF_UNSUPPORTED_FUNC 0x1062 +#define HPDF_UNSUPPORTED_JPEG_FORMAT 0x1063 +#define HPDF_UNSUPPORTED_TYPE1_FONT 0x1064 +#define HPDF_XREF_COUNT_ERR 0x1065 +#define HPDF_ZLIB_ERROR 0x1066 +#define HPDF_INVALID_PAGE_INDEX 0x1067 +#define HPDF_INVALID_URI 0x1068 +#define HPDF_PAGE_LAYOUT_OUT_OF_RANGE 0x1069 +#define HPDF_PAGE_MODE_OUT_OF_RANGE 0x1070 +#define HPDF_PAGE_NUM_STYLE_OUT_OF_RANGE 0x1071 +#define HPDF_ANNOT_INVALID_ICON 0x1072 +#define HPDF_ANNOT_INVALID_BORDER_STYLE 0x1073 +#define HPDF_PAGE_INVALID_DIRECTION 0x1074 +#define HPDF_INVALID_FONT 0x1075 +#define HPDF_PAGE_INSUFFICIENT_SPACE 0x1076 +#define HPDF_PAGE_INVALID_DISPLAY_TIME 0x1077 +#define HPDF_PAGE_INVALID_TRANSITION_TIME 0x1078 +#define HPDF_INVALID_PAGE_SLIDESHOW_TYPE 0x1079 +#define HPDF_EXT_GSTATE_OUT_OF_RANGE 0x1080 +#define HPDF_INVALID_EXT_GSTATE 0x1081 +#define HPDF_EXT_GSTATE_READ_ONLY 0x1082 +#define HPDF_INVALID_U3D_DATA 0x1083 +#define HPDF_NAME_CANNOT_GET_NAMES 0x1084 +#define HPDF_INVALID_ICC_COMPONENT_NUM 0x1085 + +/*---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------*/ +/*----- HPDF_Error ----------------------------------------------------------*/ + +typedef struct _HPDF_Error_Rec *HPDF_Error; + +typedef struct _HPDF_Error_Rec { + HPDF_STATUS error_no; + HPDF_STATUS detail_no; + HPDF_Error_Handler error_fn; + void *user_data; +} HPDF_Error_Rec; + + +/* HPDF_Error_init + * + * if error_fn is NULL, the default-handlers are set as error-handler. + * user_data is used to identify the object which threw an error. + * + */ +void +HPDF_Error_Init (HPDF_Error error, + void *user_data); + + +void +HPDF_Error_Reset (HPDF_Error error); + + +HPDF_STATUS +HPDF_Error_GetCode (HPDF_Error error); + + +HPDF_STATUS +HPDF_Error_GetDetailCode (HPDF_Error error); + + +HPDF_STATUS +HPDF_SetError (HPDF_Error error, + HPDF_STATUS error_no, + HPDF_STATUS detail_no); + + +HPDF_STATUS +HPDF_RaiseError (HPDF_Error error, + HPDF_STATUS error_no, + HPDF_STATUS detail_no); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_ERROR_H */ + diff --git a/code/libharu/hpdf_exdata.h b/code/libharu/hpdf_exdata.h new file mode 100644 index 0000000..e14245f --- /dev/null +++ b/code/libharu/hpdf_exdata.h @@ -0,0 +1,41 @@ +/* + * << Haru Free PDF Library >> -- hpdf_annotation.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_EXDATA_H +#define _HPDF_EXDATA_H + +#include "hpdf_objects.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------------------------*/ +/*------ HPDF_ExData -----------------------------------------------------*/ + +HPDF_ExData +HPDF_3DAnnotExData_New(HPDF_MMgr mmgr, + HPDF_Xref xref ); + + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_EXDATA_H */ + diff --git a/code/libharu/hpdf_ext_gstate.h b/code/libharu/hpdf_ext_gstate.h new file mode 100644 index 0000000..415f117 --- /dev/null +++ b/code/libharu/hpdf_ext_gstate.h @@ -0,0 +1,41 @@ +/* + * << Haru Free PDF Library >> -- hpdf_ext_gstate.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_EXT_GSTATE_H +#define _HPDF_EXT_GSTATE_H + +#include "hpdf_objects.h" + +#ifdef __cplusplus +extern "C" { +#endif + +HPDF_Dict +HPDF_ExtGState_New (HPDF_MMgr mmgr, + HPDF_Xref xref); + + +HPDF_BOOL +HPDF_ExtGState_Validate (HPDF_ExtGState ext_gstate); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_EXT_GSTATE_H */ + diff --git a/code/libharu/hpdf_font.h b/code/libharu/hpdf_font.h new file mode 100644 index 0000000..140e128 --- /dev/null +++ b/code/libharu/hpdf_font.h @@ -0,0 +1,115 @@ +/* + * << Haru Free PDF Library >> -- hpdf_font.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_FONT_H +#define _HPDF_FONT_H + +#include "hpdf_fontdef.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/*----------------------------------------------------------------------------*/ +/*----- Writing Mode ---------------------------------------------------------*/ + +typedef enum _HPDF_FontType { + HPDF_FONT_TYPE1 = 0, + HPDF_FONT_TRUETYPE, + HPDF_FONT_TYPE3, + HPDF_FONT_TYPE0_CID, + HPDF_FONT_TYPE0_TT, + HPDF_FONT_CID_TYPE0, + HPDF_FONT_CID_TYPE2, + HPDF_FONT_MMTYPE1 +} HPDF_FontType; + + +typedef HPDF_Dict HPDF_Font; + + +typedef HPDF_TextWidth +(*HPDF_Font_TextWidths_Func) (HPDF_Font font, + const HPDF_BYTE *text, + HPDF_UINT len); + + +typedef HPDF_UINT +(*HPDF_Font_MeasureText_Func) (HPDF_Font font, + const HPDF_BYTE *text, + HPDF_UINT len, + HPDF_REAL width, + HPDF_REAL fontsize, + HPDF_REAL charspace, + HPDF_REAL wordspace, + HPDF_BOOL wordwrap, + HPDF_REAL *real_width); + + +typedef struct _HPDF_FontAttr_Rec *HPDF_FontAttr; + +typedef struct _HPDF_FontAttr_Rec { + HPDF_FontType type; + HPDF_WritingMode writing_mode; + HPDF_Font_TextWidths_Func text_width_fn; + HPDF_Font_MeasureText_Func measure_text_fn; + HPDF_FontDef fontdef; + HPDF_Encoder encoder; + + /* if the encoding-type is HPDF_ENCODER_TYPE_SINGLE_BYTE, the width of + * each charactors are cashed in 'widths'. + * when HPDF_ENCODER_TYPE_DOUBLE_BYTE the width is calculate each time. + */ + HPDF_INT16* widths; + HPDF_BYTE* used; + + HPDF_Xref xref; + HPDF_Font descendant_font; + HPDF_Dict map_stream; + HPDF_Dict cmap_stream; +} HPDF_FontAttr_Rec; + + +HPDF_Font +HPDF_Type1Font_New (HPDF_MMgr mmgr, + HPDF_FontDef fontdef, + HPDF_Encoder encoder, + HPDF_Xref xref); + +HPDF_Font +HPDF_TTFont_New (HPDF_MMgr mmgr, + HPDF_FontDef fontdef, + HPDF_Encoder encoder, + HPDF_Xref xref); + +HPDF_Font +HPDF_Type0Font_New (HPDF_MMgr mmgr, + HPDF_FontDef fontdef, + HPDF_Encoder encoder, + HPDF_Xref xref); + + +HPDF_BOOL +HPDF_Font_Validate (HPDF_Font font); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_FONT_H */ + diff --git a/code/libharu/hpdf_fontdef.h b/code/libharu/hpdf_fontdef.h new file mode 100644 index 0000000..27679b5 --- /dev/null +++ b/code/libharu/hpdf_fontdef.h @@ -0,0 +1,406 @@ +/* + * << Haru Free PDF Library >> -- hpdf_fontdef.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_FONTDEF_H +#define _HPDF_FONTDEF_H + +#include "hpdf_objects.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +#define HPDF_FONTDEF_SIG_BYTES 0x464F4E54L + +/*------ collection of flags for defining characteristics. ---*/ + +#define HPDF_FONT_FIXED_WIDTH 1 +#define HPDF_FONT_SERIF 2 +#define HPDF_FONT_SYMBOLIC 4 +#define HPDF_FONT_SCRIPT 8 + /* Reserved 16 */ +#define HPDF_FONT_STD_CHARSET 32 +#define HPDF_FONT_ITALIC 64 + /* Reserved 128 + Reserved 256 + Reserved 512 + Reserved 1024 + Reserved 2048 + Reserved 4096 + Reserved 8192 + Reserved 16384 + Reserved 32768 */ +#define HPDF_FONT_ALL_CAP 65536 +#define HPDF_FONT_SMALL_CAP 131072 +#define HPDF_FONT_FOURCE_BOLD 262144 + +#define HPDF_CID_W_TYPE_FROM_TO 0 +#define HPDF_CID_W_TYPE_FROM_ARRAY 1 + +/*-- HPDF_FontDef ---------------------------------------*/ + +typedef struct _HPDF_CharData { + HPDF_INT16 char_cd; + HPDF_UNICODE unicode; + HPDF_INT16 width; +} HPDF_CharData; + +typedef enum _HPDF_FontDefType { + HPDF_FONTDEF_TYPE_TYPE1, + HPDF_FONTDEF_TYPE_TRUETYPE, + HPDF_FONTDEF_TYPE_CID, + HPDF_FONTDEF_TYPE_UNINITIALIZED, + HPDF_FONTDEF_TYPE_EOF +} HPDF_FontDefType; + +typedef struct _HPDF_CID_Width { + HPDF_UINT16 cid; + HPDF_INT16 width; +} HPDF_CID_Width; + +/*----------------------------------------------------------------------------*/ +/*----- HPDF_FontDef ---------------------------------------------------------*/ + +typedef struct _HPDF_FontDef_Rec *HPDF_FontDef; + +typedef void (*HPDF_FontDef_FreeFunc) (HPDF_FontDef fontdef); + +typedef void (*HPDF_FontDef_CleanFunc) (HPDF_FontDef fontdef); + +typedef HPDF_STATUS (*HPDF_FontDef_InitFunc) (HPDF_FontDef fontdef); + +typedef struct _HPDF_FontDef_Rec { + HPDF_UINT32 sig_bytes; + char base_font[HPDF_LIMIT_MAX_NAME_LEN + 1]; + HPDF_MMgr mmgr; + HPDF_Error error; + HPDF_FontDefType type; + HPDF_FontDef_CleanFunc clean_fn; + HPDF_FontDef_FreeFunc free_fn; + HPDF_FontDef_InitFunc init_fn; + + HPDF_INT16 ascent; + HPDF_INT16 descent; + HPDF_UINT flags; + HPDF_Box font_bbox; + HPDF_INT16 italic_angle; + HPDF_UINT16 stemv; + HPDF_INT16 avg_width; + HPDF_INT16 max_width; + HPDF_INT16 missing_width; + HPDF_UINT16 stemh; + HPDF_UINT16 x_height; + HPDF_UINT16 cap_height; + + /* the initial value of descriptor entry is NULL. + * when first font-object besed on the fontdef object is created, + * the font-descriptor object is created and descriptor entry is set. + */ + HPDF_Dict descriptor; + HPDF_Stream data; + + HPDF_BOOL valid; + void *attr; +} HPDF_FontDef_Rec; + + +void +HPDF_FontDef_Free (HPDF_FontDef fontdef); + + +void +HPDF_FontDef_Cleanup (HPDF_FontDef fontdef); + + +HPDF_BOOL +HPDF_FontDef_Validate (HPDF_FontDef fontdef); + + +/*----------------------------------------------------------------------------*/ +/*----- HPDF_Type1FontDef ---------------------------------------------------*/ + +typedef struct _HPDF_Type1FontDefAttrRec *HPDF_Type1FontDefAttr; + +typedef struct _HPDF_Type1FontDefAttrRec { + HPDF_BYTE first_char; /* Required */ + HPDF_BYTE last_char; /* Required */ + HPDF_CharData *widths; /* Required */ + HPDF_UINT widths_count; + + HPDF_INT16 leading; + char *char_set; + char encoding_scheme[HPDF_LIMIT_MAX_NAME_LEN + 1]; + HPDF_UINT length1; + HPDF_UINT length2; + HPDF_UINT length3; + HPDF_BOOL is_base14font; + HPDF_BOOL is_fixed_pitch; + + HPDF_Stream font_data; +} HPDF_Type1FontDefAttr_Rec; + + + +HPDF_FontDef +HPDF_Type1FontDef_New (HPDF_MMgr mmgr); + + +HPDF_FontDef +HPDF_Type1FontDef_Load (HPDF_MMgr mmgr, + HPDF_Stream afm, + HPDF_Stream font_data); + + +HPDF_FontDef +HPDF_Type1FontDef_Duplicate (HPDF_MMgr mmgr, + HPDF_FontDef src); + + +HPDF_STATUS +HPDF_Type1FontDef_SetWidths (HPDF_FontDef fontdef, + const HPDF_CharData *widths); + + +HPDF_INT16 +HPDF_Type1FontDef_GetWidthByName (HPDF_FontDef fontdef, + const char *gryph_name); + + +HPDF_INT16 +HPDF_Type1FontDef_GetWidth (HPDF_FontDef fontdef, + HPDF_UNICODE unicode); + + +HPDF_FontDef +HPDF_Base14FontDef_New (HPDF_MMgr mmgr, + const char *font_name); + + + +/*----------------------------------------------------------------------------*/ +/*----- HPDF_TTFontDef ------------------------------------------------------*/ + +#define HPDF_TTF_FONT_TAG_LEN 6 + +typedef struct _HPDF_TTF_Table { + char tag[4]; + HPDF_UINT32 check_sum; + HPDF_UINT32 offset; + HPDF_UINT32 length; +} HPDF_TTFTable; + + +typedef struct _HPDF_TTF_OffsetTbl { + HPDF_UINT32 sfnt_version; + HPDF_UINT16 num_tables; + HPDF_UINT16 search_range; + HPDF_UINT16 entry_selector; + HPDF_UINT16 range_shift; + HPDF_TTFTable *table; +} HPDF_TTF_OffsetTbl; + + +typedef struct _HPDF_TTF_CmapRange { + HPDF_UINT16 format; + HPDF_UINT16 length; + HPDF_UINT16 language; + HPDF_UINT16 seg_count_x2; + HPDF_UINT16 search_range; + HPDF_UINT16 entry_selector; + HPDF_UINT16 range_shift; + HPDF_UINT16 *end_count; + HPDF_UINT16 reserved_pad; + HPDF_UINT16 *start_count; + HPDF_INT16 *id_delta; + HPDF_UINT16 *id_range_offset; + HPDF_UINT16 *glyph_id_array; + HPDF_UINT glyph_id_array_count; +} HPDF_TTF_CmapRange; + + +typedef struct _HPDF_TTF_GryphOffsets { + HPDF_UINT32 base_offset; + HPDF_UINT32 *offsets; + HPDF_BYTE *flgs; /* 0: unused, 1: used */ +} HPDF_TTF_GryphOffsets; + + +typedef struct _HPDF_TTF_LongHorMetric { + HPDF_UINT16 advance_width; + HPDF_INT16 lsb; +} HPDF_TTF_LongHorMetric; + + +typedef struct _HPDF_TTF_FontHeader { + HPDF_BYTE version_number[4]; + HPDF_UINT32 font_revision; + HPDF_UINT32 check_sum_adjustment; + HPDF_UINT32 magic_number; + HPDF_UINT16 flags; + HPDF_UINT16 units_per_em; + HPDF_BYTE created[8]; + HPDF_BYTE modified[8]; + HPDF_INT16 x_min; + HPDF_INT16 y_min; + HPDF_INT16 x_max; + HPDF_INT16 y_max; + HPDF_UINT16 mac_style; + HPDF_UINT16 lowest_rec_ppem; + HPDF_INT16 font_direction_hint; + HPDF_INT16 index_to_loc_format; + HPDF_INT16 glyph_data_format; +} HPDF_TTF_FontHeader; + + +typedef struct _HPDF_TTF_NameRecord { + HPDF_UINT16 platform_id; + HPDF_UINT16 encoding_id; + HPDF_UINT16 language_id; + HPDF_UINT16 name_id; + HPDF_UINT16 length; + HPDF_UINT16 offset; +} HPDF_TTF_NameRecord; + + +typedef struct _HPDF_TTF_NamingTable { + HPDF_UINT16 format; + HPDF_UINT16 count; + HPDF_UINT16 string_offset; + HPDF_TTF_NameRecord *name_records; +} HPDF_TTF_NamingTable; + + +typedef struct _HPDF_TTFontDefAttr_Rec *HPDF_TTFontDefAttr; + +typedef struct _HPDF_TTFontDefAttr_Rec { + char base_font[HPDF_LIMIT_MAX_NAME_LEN + 1]; + HPDF_BYTE first_char; + HPDF_BYTE last_char; + char *char_set; + char tag_name[HPDF_TTF_FONT_TAG_LEN + 1]; + char tag_name2[(HPDF_TTF_FONT_TAG_LEN + 1) * 2]; + HPDF_TTF_FontHeader header; + HPDF_TTF_GryphOffsets glyph_tbl; + HPDF_UINT16 num_glyphs; + HPDF_TTF_NamingTable name_tbl; + HPDF_TTF_LongHorMetric *h_metric; + HPDF_UINT16 num_h_metric; + HPDF_TTF_OffsetTbl offset_tbl; + HPDF_TTF_CmapRange cmap; + HPDF_UINT16 fs_type; + HPDF_BYTE sfamilyclass[2]; + HPDF_BYTE panose[10]; + HPDF_UINT32 code_page_range1; + HPDF_UINT32 code_page_range2; + + HPDF_UINT length1; + + HPDF_BOOL embedding; + HPDF_BOOL is_cidfont; + + HPDF_Stream stream; +} HPDF_TTFontDefAttr_Rec; + + + +HPDF_FontDef +HPDF_TTFontDef_New (HPDF_MMgr mmgr); + + +HPDF_FontDef +HPDF_TTFontDef_Load (HPDF_MMgr mmgr, + HPDF_Stream stream, + HPDF_BOOL embedding); + + +HPDF_FontDef +HPDF_TTFontDef_Load2 (HPDF_MMgr mmgr, + HPDF_Stream stream, + HPDF_UINT index, + HPDF_BOOL embedding); + + +HPDF_UINT16 +HPDF_TTFontDef_GetGlyphid (HPDF_FontDef fontdef, + HPDF_UINT16 unicode); + + +HPDF_INT16 +HPDF_TTFontDef_GetCharWidth (HPDF_FontDef fontdef, + HPDF_UINT16 unicode); + + +HPDF_INT16 +HPDF_TTFontDef_GetGidWidth (HPDF_FontDef fontdef, + HPDF_UINT16 gid); + + +HPDF_STATUS +HPDF_TTFontDef_SaveFontData (HPDF_FontDef fontdef, + HPDF_Stream stream); + + +HPDF_Box +HPDF_TTFontDef_GetCharBBox (HPDF_FontDef fontdef, + HPDF_UINT16 unicode); + + +void +HPDF_TTFontDef_SetTagName (HPDF_FontDef fontdef, + char *tag); + + +/*----------------------------------------------------------------------------*/ +/*----- HPDF_CIDFontDef -----------------------------------------------------*/ + +typedef struct _HPDF_CIDFontDefAttrRec *HPDF_CIDFontDefAttr; + +typedef struct _HPDF_CIDFontDefAttrRec { + HPDF_List widths; + HPDF_INT16 DW; + HPDF_INT16 DW2[2]; +} HPDF_CIDFontDefAttr_Rec; + + +HPDF_FontDef +HPDF_CIDFontDef_New (HPDF_MMgr mmgr, + char *name, + HPDF_FontDef_InitFunc init_fn); + + +HPDF_STATUS +HPDF_CIDFontDef_AddWidth (HPDF_FontDef fontdef, + const HPDF_CID_Width *widths); + + +HPDF_INT16 +HPDF_CIDFontDef_GetCIDWidth (HPDF_FontDef fontdef, + HPDF_UINT16 cid); + + + +HPDF_STATUS +HPDF_CIDFontDef_ChangeStyle (HPDF_FontDef fontdef, + HPDF_BOOL bold, + HPDF_BOOL italic); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_FONTDEF_H */ diff --git a/code/libharu/hpdf_gstate.h b/code/libharu/hpdf_gstate.h new file mode 100644 index 0000000..8f120ac --- /dev/null +++ b/code/libharu/hpdf_gstate.h @@ -0,0 +1,83 @@ +/* + * << Haru Free PDF Library >> -- hpdf_gstate.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_GSTATE_H +#define _HPDF_GSTATE_H + +#include "hpdf_font.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/*----------------------------------------------------------------------------*/ +/*------ graphic state stack -------------------------------------------------*/ + +typedef struct _HPDF_GState_Rec *HPDF_GState; + +typedef struct _HPDF_GState_Rec { + HPDF_TransMatrix trans_matrix; + HPDF_REAL line_width; + HPDF_LineCap line_cap; + HPDF_LineJoin line_join; + HPDF_REAL miter_limit; + HPDF_DashMode dash_mode; + HPDF_REAL flatness; + + HPDF_REAL char_space; + HPDF_REAL word_space; + HPDF_REAL h_scalling; + HPDF_REAL text_leading; + HPDF_TextRenderingMode rendering_mode; + HPDF_REAL text_rise; + + HPDF_ColorSpace cs_fill; + HPDF_ColorSpace cs_stroke; + HPDF_RGBColor rgb_fill; + HPDF_RGBColor rgb_stroke; + HPDF_CMYKColor cmyk_fill; + HPDF_CMYKColor cmyk_stroke; + HPDF_REAL gray_fill; + HPDF_REAL gray_stroke; + + HPDF_Font font; + HPDF_REAL font_size; + HPDF_WritingMode writing_mode; + + HPDF_GState prev; + HPDF_UINT depth; +} HPDF_GState_Rec; + +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ + +HPDF_GState +HPDF_GState_New (HPDF_MMgr mmgr, + HPDF_GState current); + + +HPDF_GState +HPDF_GState_Free (HPDF_MMgr mmgr, + HPDF_GState gstate); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_GSTATE_H */ + diff --git a/code/libharu/hpdf_image.h b/code/libharu/hpdf_image.h new file mode 100644 index 0000000..909c8fe --- /dev/null +++ b/code/libharu/hpdf_image.h @@ -0,0 +1,99 @@ +/* + * << Haru Free PDF Library >> -- hpdf_image.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_IMAGE_H +#define _HPDF_IMAGE_H + +#include "hpdf_objects.h" + +#ifdef __cplusplus +extern "C" { +#endif + +HPDF_Image +HPDF_Image_Load1BitImageFromMem (HPDF_MMgr mmgr, + const HPDF_BYTE *buf, + HPDF_Xref xref, + HPDF_UINT width, + HPDF_UINT height, + HPDF_UINT line_width, + HPDF_BOOL top_is_first + ); + + +#ifndef LIBHPDF_HAVE_NOPNGLIB + +HPDF_Image +HPDF_Image_LoadPngImage (HPDF_MMgr mmgr, + HPDF_Stream png_data, + HPDF_Xref xref, + HPDF_BOOL delayed_loading); + +#endif + +HPDF_Image +HPDF_Image_LoadJpegImage (HPDF_MMgr mmgr, + HPDF_Stream jpeg_data, + HPDF_Xref xref); + +HPDF_Image +HPDF_Image_LoadJpegImageFromMem (HPDF_MMgr mmgr, + const HPDF_BYTE *buf, + HPDF_UINT size, + HPDF_Xref xref); + +HPDF_Image +HPDF_Image_LoadRawImage (HPDF_MMgr mmgr, + HPDF_Stream stream, + HPDF_Xref xref, + HPDF_UINT width, + HPDF_UINT height, + HPDF_ColorSpace color_space); + + +HPDF_Image +HPDF_Image_LoadRawImageFromMem (HPDF_MMgr mmgr, + const HPDF_BYTE *buf, + HPDF_Xref xref, + HPDF_UINT width, + HPDF_UINT height, + HPDF_ColorSpace color_space, + HPDF_UINT bits_per_component); + + +HPDF_BOOL +HPDF_Image_Validate (HPDF_Image image); + + +HPDF_STATUS +HPDF_Image_SetMask (HPDF_Image image, + HPDF_BOOL mask); + +HPDF_STATUS +HPDF_Image_SetColorSpace (HPDF_Image image, + HPDF_Array colorspace); + +HPDF_STATUS +HPDF_Image_SetRenderingIntent (HPDF_Image image, + const char* intent); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_XOBJECTS_H */ + diff --git a/code/libharu/hpdf_info.h b/code/libharu/hpdf_info.h new file mode 100644 index 0000000..9fb2a7f --- /dev/null +++ b/code/libharu/hpdf_info.h @@ -0,0 +1,51 @@ +/* + * << Haru Free PDF Library >> -- hpdf_info.c + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + + +#ifndef _HPDF_INFO_H +#define _HPDF_INFO_H + +#include "hpdf_objects.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +HPDF_STATUS +HPDF_Info_SetInfoAttr (HPDF_Dict info, + HPDF_InfoType type, + const char *value, + HPDF_Encoder encoder); + + +const char* +HPDF_Info_GetInfoAttr (HPDF_Dict info, + HPDF_InfoType type); + + +HPDF_STATUS +HPDF_Info_SetInfoDateAttr (HPDF_Dict info, + HPDF_InfoType type, + HPDF_Date value); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_INFO_H */ + diff --git a/code/libharu/hpdf_list.h b/code/libharu/hpdf_list.h new file mode 100644 index 0000000..09a7047 --- /dev/null +++ b/code/libharu/hpdf_list.h @@ -0,0 +1,88 @@ +/* + * << Haru Free PDF Library >> -- hpdf_list.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_LIST_H +#define _HPDF_LIST_H + +#include "hpdf_error.h" +#include "hpdf_mmgr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _HPDF_List_Rec *HPDF_List; + +typedef struct _HPDF_List_Rec { + HPDF_MMgr mmgr; + HPDF_Error error; + HPDF_UINT block_siz; + HPDF_UINT items_per_block; + HPDF_UINT count; + void **obj; +} HPDF_List_Rec; + + +HPDF_List +HPDF_List_New (HPDF_MMgr mmgr, + HPDF_UINT items_per_block); + + +void +HPDF_List_Free (HPDF_List list); + + +HPDF_STATUS +HPDF_List_Add (HPDF_List list, + void *item); + + +HPDF_STATUS +HPDF_List_Insert (HPDF_List list, + void *target, + void *item); + + +HPDF_STATUS +HPDF_List_Remove (HPDF_List list, + void *item); + + +void* +HPDF_List_RemoveByIndex (HPDF_List list, + HPDF_UINT index); + + +void* +HPDF_List_ItemAt (HPDF_List list, + HPDF_UINT index); + + +HPDF_INT32 +HPDF_List_Find (HPDF_List list, + void *item); + + +void +HPDF_List_Clear (HPDF_List list); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_LIST_H */ + diff --git a/code/libharu/hpdf_mmgr.h b/code/libharu/hpdf_mmgr.h new file mode 100644 index 0000000..11ec9b8 --- /dev/null +++ b/code/libharu/hpdf_mmgr.h @@ -0,0 +1,85 @@ +/* + * << Haru Free PDF Library >> -- hpdf_mmgr.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_MMGR_H +#define _HPDF_MMGR_H + +#include "hpdf_types.h" +#include "hpdf_error.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _HPDF_MPool_Node_Rec *HPDF_MPool_Node; + +typedef struct _HPDF_MPool_Node_Rec { + HPDF_BYTE* buf; + HPDF_UINT size; + HPDF_UINT used_size; + HPDF_MPool_Node next_node; +} HPDF_MPool_Node_Rec; + + +typedef struct _HPDF_MMgr_Rec *HPDF_MMgr; + +typedef struct _HPDF_MMgr_Rec { + HPDF_Error error; + HPDF_Alloc_Func alloc_fn; + HPDF_Free_Func free_fn; + HPDF_MPool_Node mpool; + HPDF_UINT buf_size; + +#ifdef HPDF_MEM_DEBUG + HPDF_UINT alloc_cnt; + HPDF_UINT free_cnt; +#endif +} HPDF_MMgr_Rec; + + +/* HPDF_mpool_new + * + * create new HPDF_mpool object. when memory allocation goes wrong, + * it returns NULL and error handling function will be called. + * if buf_size is non-zero, mmgr is configured to be using memory-pool + */ +HPDF_MMgr +HPDF_MMgr_New (HPDF_Error error, + HPDF_UINT buf_size, + HPDF_Alloc_Func alloc_fn, + HPDF_Free_Func free_fn); + + +void +HPDF_MMgr_Free (HPDF_MMgr mmgr); + + +void* +HPDF_GetMem (HPDF_MMgr mmgr, + HPDF_UINT size); + + +void +HPDF_FreeMem (HPDF_MMgr mmgr, + void *aptr); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_MMGR_H */ + diff --git a/code/libharu/hpdf_namedict.h b/code/libharu/hpdf_namedict.h new file mode 100644 index 0000000..5632f99 --- /dev/null +++ b/code/libharu/hpdf_namedict.h @@ -0,0 +1,76 @@ +/* + * << Haru Free PDF Library >> -- hpdf_namedict.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_NAMEDICT_H +#define _HPDF_NAMEDICT_H + +#include "hpdf_objects.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +HPDF_NameDict +HPDF_NameDict_New (HPDF_MMgr mmgr, + HPDF_Xref xref); + +HPDF_NameTree +HPDF_NameDict_GetNameTree (HPDF_NameDict namedict, + HPDF_NameDictKey key); + +HPDF_STATUS +HPDF_NameDict_SetNameTree (HPDF_NameDict namedict, + HPDF_NameDictKey key, + HPDF_NameTree tree); + +HPDF_BOOL +HPDF_NameDict_Validate (HPDF_NameDict namedict); + + +/*------- NameTree -------*/ + +HPDF_NameTree +HPDF_NameTree_New (HPDF_MMgr mmgr, + HPDF_Xref xref); + +HPDF_STATUS +HPDF_NameTree_Add (HPDF_NameTree tree, + HPDF_String name, + void *obj); + +HPDF_BOOL +HPDF_NameTree_Validate (HPDF_NameTree tree); + + +/*------- EmbeddedFile -------*/ + +HPDF_EmbeddedFile +HPDF_EmbeddedFile_New (HPDF_MMgr mmgr, + HPDF_Xref xref, + const char *file); + +HPDF_BOOL +HPDF_EmbeddedFile_Validate (HPDF_EmbeddedFile emfile); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_NAMEDICT_H */ + diff --git a/code/libharu/hpdf_objects.h b/code/libharu/hpdf_objects.h new file mode 100644 index 0000000..74fc445 --- /dev/null +++ b/code/libharu/hpdf_objects.h @@ -0,0 +1,604 @@ +/* + * << Haru Free PDF Library >> -- hpdf_objects.c + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_OBJECTS_H +#define _HPDF_OBJECTS_H + +#include "hpdf_encoder.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/* if HPDF_OTYPE_DIRECT bit is set, the object owned by other container + * object. if HPDF_OTYPE_INDIRECT bit is set, the object managed by xref. + */ + +#define HPDF_OTYPE_NONE 0x00000000 +#define HPDF_OTYPE_DIRECT 0x80000000 +#define HPDF_OTYPE_INDIRECT 0x40000000 +#define HPDF_OTYPE_ANY (HPDF_OTYPE_DIRECT | HPDF_OTYPE_INDIRECT) +#define HPDF_OTYPE_HIDDEN 0x10000000 + +#define HPDF_OCLASS_UNKNOWN 0x0001 +#define HPDF_OCLASS_NULL 0x0002 +#define HPDF_OCLASS_BOOLEAN 0x0003 +#define HPDF_OCLASS_NUMBER 0x0004 +#define HPDF_OCLASS_REAL 0x0005 +#define HPDF_OCLASS_NAME 0x0006 +#define HPDF_OCLASS_STRING 0x0007 +#define HPDF_OCLASS_BINARY 0x0008 +#define HPDF_OCLASS_ARRAY 0x0010 +#define HPDF_OCLASS_DICT 0x0011 +#define HPDF_OCLASS_PROXY 0x0012 +#define HPDF_OCLASS_ANY 0x00FF + +#define HPDF_OSUBCLASS_FONT 0x0100 +#define HPDF_OSUBCLASS_CATALOG 0x0200 +#define HPDF_OSUBCLASS_PAGES 0x0300 +#define HPDF_OSUBCLASS_PAGE 0x0400 +#define HPDF_OSUBCLASS_XOBJECT 0x0500 +#define HPDF_OSUBCLASS_OUTLINE 0x0600 +#define HPDF_OSUBCLASS_DESTINATION 0x0700 +#define HPDF_OSUBCLASS_ANNOTATION 0x0800 +#define HPDF_OSUBCLASS_ENCRYPT 0x0900 +#define HPDF_OSUBCLASS_EXT_GSTATE 0x0A00 +#define HPDF_OSUBCLASS_EXT_GSTATE_R 0x0B00 /* read only object */ +#define HPDF_OSUBCLASS_NAMEDICT 0x0C00 +#define HPDF_OSUBCLASS_NAMETREE 0x0D00 + + + +/*----------------------------------------------------------------------------*/ +/*------ Values related xref -------------------------------------------------*/ + +#define HPDF_FREE_ENTRY 'f' +#define HPDF_IN_USE_ENTRY 'n' + + +/* + * structure of Object-ID + * + * 1 direct-object + * 2 indirect-object + * 3 reserved + * 4 shadow-object + * 5-8 reserved + * 9-32 object-idi0-8388607j + * + * the real Object-ID is described "obj_id & 0x00FFFFFF" + */ + +typedef struct _HPDF_Obj_Header { + HPDF_UINT32 obj_id; + HPDF_UINT16 gen_no; + HPDF_UINT16 obj_class; +} HPDF_Obj_Header; + + + +HPDF_STATUS +HPDF_Obj_WriteValue (void *obj, + HPDF_Stream stream, + HPDF_Encrypt e); + + +HPDF_STATUS +HPDF_Obj_Write (void *obj, + HPDF_Stream stream, + HPDF_Encrypt e); + + +void +HPDF_Obj_Free (HPDF_MMgr mmgr, + void *obj); + + +void +HPDF_Obj_ForceFree (HPDF_MMgr mmgr, + void *obj); + + +/*---------------------------------------------------------------------------*/ +/*----- HPDF_Null -----------------------------------------------------------*/ + +typedef struct _HPDF_Null_Rec *HPDF_Null; + +typedef struct _HPDF_Null_Rec { + HPDF_Obj_Header header; +} HPDF_Null_Rec; + + + +HPDF_Null +HPDF_Null_New (HPDF_MMgr mmgr); + + +/*---------------------------------------------------------------------------*/ +/*----- HPDF_Boolean --------------------------------------------------------*/ + +typedef struct _HPDF_Boolean_Rec *HPDF_Boolean; + +typedef struct _HPDF_Boolean_Rec { + HPDF_Obj_Header header; + HPDF_BOOL value; +} HPDF_Boolean_Rec; + + + +HPDF_Boolean +HPDF_Boolean_New (HPDF_MMgr mmgr, + HPDF_BOOL value); + + +HPDF_STATUS +HPDF_Boolean_Write (HPDF_Boolean obj, + HPDF_Stream stream); + + +/*---------------------------------------------------------------------------*/ +/*----- HPDF_Number ---------------------------------------------------------*/ + +typedef struct _HPDF_Number_Rec *HPDF_Number; + +typedef struct _HPDF_Number_Rec { + HPDF_Obj_Header header; + HPDF_INT32 value; +} HPDF_Number_Rec; + + + +HPDF_Number +HPDF_Number_New (HPDF_MMgr mmgr, + HPDF_INT32 value); + + +void +HPDF_Number_SetValue (HPDF_Number obj, + HPDF_INT32 value); + + +HPDF_STATUS +HPDF_Number_Write (HPDF_Number obj, + HPDF_Stream stream); + + +/*---------------------------------------------------------------------------*/ +/*----- HPDF_Real -----------------------------------------------------------*/ + +typedef struct _HPDF_Real_Rec *HPDF_Real; + +typedef struct _HPDF_Real_Rec { + HPDF_Obj_Header header; + HPDF_Error error; + HPDF_REAL value; +} HPDF_Real_Rec; + + + +HPDF_Real +HPDF_Real_New (HPDF_MMgr mmgr, + HPDF_REAL value); + + +HPDF_STATUS +HPDF_Real_Write (HPDF_Real obj, + HPDF_Stream stream); + + +HPDF_STATUS +HPDF_Real_SetValue (HPDF_Real obj, + HPDF_REAL value); + + +/*---------------------------------------------------------------------------*/ +/*----- HPDF_Name -----------------------------------------------------------*/ + +typedef struct _HPDF_Name_Rec *HPDF_Name; + +typedef struct _HPDF_Name_Rec { + HPDF_Obj_Header header; + HPDF_Error error; + char value[HPDF_LIMIT_MAX_NAME_LEN + 1]; +} HPDF_Name_Rec; + + + +HPDF_Name +HPDF_Name_New (HPDF_MMgr mmgr, + const char *value); + + +HPDF_STATUS +HPDF_Name_SetValue (HPDF_Name obj, + const char *value); + + +HPDF_STATUS +HPDF_Name_Write (HPDF_Name obj, + HPDF_Stream stream); + +const char* +HPDF_Name_GetValue (HPDF_Name obj); + + +/*---------------------------------------------------------------------------*/ +/*----- HPDF_String ---------------------------------------------------------*/ + +typedef struct _HPDF_String_Rec *HPDF_String; + +typedef struct _HPDF_String_Rec { + HPDF_Obj_Header header; + HPDF_MMgr mmgr; + HPDF_Error error; + HPDF_Encoder encoder; + HPDF_BYTE *value; + HPDF_UINT len; +} HPDF_String_Rec; + + + +HPDF_String +HPDF_String_New (HPDF_MMgr mmgr, + const char *value, + HPDF_Encoder encoder); + + +HPDF_STATUS +HPDF_String_SetValue (HPDF_String obj, + const char *value); + + +void +HPDF_String_Free (HPDF_String obj); + + +HPDF_STATUS +HPDF_String_Write (HPDF_String obj, + HPDF_Stream stream, + HPDF_Encrypt e); + +HPDF_INT32 +HPDF_String_Cmp (HPDF_String s1, + HPDF_String s2); + + +/*---------------------------------------------------------------------------*/ +/*----- HPDF_Binary ---------------------------------------------------------*/ + +typedef struct _HPDF_Binary_Rec *HPDF_Binary; + +typedef struct _HPDF_Binary_Rec { + HPDF_Obj_Header header; + HPDF_MMgr mmgr; + HPDF_Error error; + HPDF_BYTE *value; + HPDF_UINT len; +} HPDF_Binary_Rec; + + + +HPDF_Binary +HPDF_Binary_New (HPDF_MMgr mmgr, + HPDF_BYTE *value, + HPDF_UINT len); + + +HPDF_STATUS +HPDF_Binary_SetValue (HPDF_Binary obj, + HPDF_BYTE *value, + HPDF_UINT len); + + +HPDF_BYTE* +HPDF_Binary_GetValue (HPDF_Binary obj); + + +void +HPDF_Binary_Free (HPDF_Binary obj); + + +HPDF_STATUS +HPDF_Binary_Write (HPDF_Binary obj, + HPDF_Stream stream, + HPDF_Encrypt e); + + +HPDF_UINT +HPDF_Binary_GetLen (HPDF_Binary obj); + + +/*---------------------------------------------------------------------------*/ +/*----- HPDF_Array ----------------------------------------------------------*/ + +typedef struct _HPDF_Array_Rec *HPDF_Array; + +typedef struct _HPDF_Array_Rec { + HPDF_Obj_Header header; + HPDF_MMgr mmgr; + HPDF_Error error; + HPDF_List list; +} HPDF_Array_Rec; + + +HPDF_Array +HPDF_Array_New (HPDF_MMgr mmgr); + + +HPDF_Array +HPDF_Box_Array_New (HPDF_MMgr mmgr, + HPDF_Box box); + + +void +HPDF_Array_Free (HPDF_Array array); + + +HPDF_STATUS +HPDF_Array_Write (HPDF_Array array, + HPDF_Stream stream, + HPDF_Encrypt e); + + +HPDF_STATUS +HPDF_Array_Add (HPDF_Array array, + void *obj); + + +HPDF_STATUS +HPDF_Array_Insert (HPDF_Array array, + void *target, + void *obj); + + +void* +HPDF_Array_GetItem (HPDF_Array array, + HPDF_UINT index, + HPDF_UINT16 obj_class); + + +HPDF_STATUS +HPDF_Array_AddNumber (HPDF_Array array, + HPDF_INT32 value); + + +HPDF_STATUS +HPDF_Array_AddReal (HPDF_Array array, + HPDF_REAL value); + + +HPDF_STATUS +HPDF_Array_AddName (HPDF_Array array, + const char *value); + +void +HPDF_Array_Clear (HPDF_Array array); + + +HPDF_UINT +HPDF_Array_Items (HPDF_Array array); + + +/*---------------------------------------------------------------------------*/ +/*----- HPDF_Dict -----------------------------------------------------------*/ + +typedef struct _HPDF_Xref_Rec *HPDF_Xref; + +typedef struct _HPDF_Dict_Rec *HPDF_Dict; + +typedef void +(*HPDF_Dict_FreeFunc) (HPDF_Dict obj); + +typedef HPDF_STATUS +(*HPDF_Dict_BeforeWriteFunc) (HPDF_Dict obj); + +typedef HPDF_STATUS +(*HPDF_Dict_AfterWriteFunc) (HPDF_Dict obj); + +typedef HPDF_STATUS +(*HPDF_Dict_OnWriteFunc) (HPDF_Dict obj, + HPDF_Stream stream); + +typedef struct _HPDF_Dict_Rec { + HPDF_Obj_Header header; + HPDF_MMgr mmgr; + HPDF_Error error; + HPDF_List list; + HPDF_Dict_BeforeWriteFunc before_write_fn; + HPDF_Dict_OnWriteFunc write_fn; + HPDF_Dict_AfterWriteFunc after_write_fn; + HPDF_Dict_FreeFunc free_fn; + HPDF_Stream stream; + HPDF_UINT filter; + HPDF_Dict filterParams; + void *attr; +} HPDF_Dict_Rec; + + +typedef struct _HPDF_DictElement_Rec *HPDF_DictElement; + +typedef struct _HPDF_DictElement_Rec { + char key[HPDF_LIMIT_MAX_NAME_LEN + 1]; + void *value; +} HPDF_DictElement_Rec; + + +HPDF_Dict +HPDF_Dict_New (HPDF_MMgr mmgr); + + +HPDF_Dict +HPDF_DictStream_New (HPDF_MMgr mmgr, + HPDF_Xref xref); + + +void +HPDF_Dict_Free (HPDF_Dict dict); + + +HPDF_STATUS +HPDF_Dict_Write (HPDF_Dict dict, + HPDF_Stream stream, + HPDF_Encrypt e); + + +const char* +HPDF_Dict_GetKeyByObj (HPDF_Dict dict, + void *obj); + + +HPDF_STATUS +HPDF_Dict_Add (HPDF_Dict dict, + const char *key, + void *obj); + + +void* +HPDF_Dict_GetItem (HPDF_Dict dict, + const char *key, + HPDF_UINT16 obj_class); + + +HPDF_STATUS +HPDF_Dict_AddName (HPDF_Dict dict, + const char *key, + const char *value); + + +HPDF_STATUS +HPDF_Dict_AddNumber (HPDF_Dict dict, + const char *key, + HPDF_INT32 value); + + +HPDF_STATUS +HPDF_Dict_AddReal (HPDF_Dict dict, + const char *key, + HPDF_REAL value); + + +HPDF_STATUS +HPDF_Dict_AddBoolean (HPDF_Dict dict, + const char *key, + HPDF_BOOL value); + + +HPDF_STATUS +HPDF_Dict_RemoveElement (HPDF_Dict dict, + const char *key); + + +/*---------------------------------------------------------------------------*/ +/*----- HPDF_ProxyObject ----------------------------------------------------*/ + + + +typedef struct _HPDF_Proxy_Rec *HPDF_Proxy; + +typedef struct _HPDF_Proxy_Rec { + HPDF_Obj_Header header; + void *obj; +} HPDF_Proxy_Rec; + + +HPDF_Proxy +HPDF_Proxy_New (HPDF_MMgr mmgr, + void *obj); + + + +/*---------------------------------------------------------------------------*/ +/*----- HPDF_Xref -----------------------------------------------------------*/ + +typedef struct _HPDF_XrefEntry_Rec *HPDF_XrefEntry; + +typedef struct _HPDF_XrefEntry_Rec { + char entry_typ; + HPDF_UINT byte_offset; + HPDF_UINT16 gen_no; + void* obj; +} HPDF_XrefEntry_Rec; + + +typedef struct _HPDF_Xref_Rec { + HPDF_MMgr mmgr; + HPDF_Error error; + HPDF_UINT32 start_offset; + HPDF_List entries; + HPDF_UINT addr; + HPDF_Xref prev; + HPDF_Dict trailer; +} HPDF_Xref_Rec; + + +HPDF_Xref +HPDF_Xref_New (HPDF_MMgr mmgr, + HPDF_UINT32 offset); + + +void +HPDF_Xref_Free (HPDF_Xref xref); + + +HPDF_STATUS +HPDF_Xref_Add (HPDF_Xref xref, + void *obj); + + +HPDF_XrefEntry +HPDF_Xref_GetEntry (HPDF_Xref xref, + HPDF_UINT index); + + +HPDF_STATUS +HPDF_Xref_WriteToStream (HPDF_Xref xref, + HPDF_Stream stream, + HPDF_Encrypt e); + + +HPDF_XrefEntry +HPDF_Xref_GetEntryByObjectId (HPDF_Xref xref, + HPDF_UINT obj_id); + + + +typedef HPDF_Dict HPDF_EmbeddedFile; +typedef HPDF_Dict HPDF_NameDict; +typedef HPDF_Dict HPDF_NameTree; +typedef HPDF_Dict HPDF_Pages; +typedef HPDF_Dict HPDF_Page; +typedef HPDF_Dict HPDF_Annotation; +typedef HPDF_Dict HPDF_3DMeasure; +typedef HPDF_Dict HPDF_ExData; +typedef HPDF_Dict HPDF_XObject; +typedef HPDF_Dict HPDF_Image; +typedef HPDF_Dict HPDF_Outline; +typedef HPDF_Dict HPDF_EncryptDict; +typedef HPDF_Dict HPDF_Action; +typedef HPDF_Dict HPDF_ExtGState; +typedef HPDF_Array HPDF_Destination; +typedef HPDF_Dict HPDF_U3D; +typedef HPDF_Dict HPDF_OutputIntent; +typedef HPDF_Dict HPDF_JavaScript; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_OBJECTS_H */ + diff --git a/code/libharu/hpdf_outline.h b/code/libharu/hpdf_outline.h new file mode 100644 index 0000000..840f5b0 --- /dev/null +++ b/code/libharu/hpdf_outline.h @@ -0,0 +1,77 @@ +/* + * << Haru Free PDF Library >> -- hpdf_outline.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_OUTLINE_H +#define _HPDF_OUTLINE_H + +#include "hpdf_objects.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/*----------------------------------------------------------------------------*/ +/*----- HPDF_Outline ---------------------------------------------------------*/ + +HPDF_Outline +HPDF_OutlineRoot_New (HPDF_MMgr mmgr, + HPDF_Xref xref); + + +HPDF_Outline +HPDF_Outline_New (HPDF_MMgr mmgr, + HPDF_Outline parent, + const char *title, + HPDF_Encoder encoder, + HPDF_Xref xref); + + +HPDF_Outline +HPDF_Outline_GetFirst (HPDF_Outline outline); + + +HPDF_Outline +HPDF_Outline_GetLast (HPDF_Outline outline); + + +HPDF_Outline +HPDF_Outline_GetPrev(HPDF_Outline outline); + + +HPDF_Outline +HPDF_Outline_GetNext (HPDF_Outline outline); + + +HPDF_Outline +HPDF_Outline_GetParent (HPDF_Outline outline); + + +HPDF_BOOL +HPDF_Outline_GetOpened (HPDF_Outline outline); + + + +HPDF_BOOL +HPDF_Outline_Validate (HPDF_Outline obj); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_OUTLINE_H */ + diff --git a/code/libharu/hpdf_page_label.h b/code/libharu/hpdf_page_label.h new file mode 100644 index 0000000..077a354 --- /dev/null +++ b/code/libharu/hpdf_page_label.h @@ -0,0 +1,38 @@ +/* + * << Haru Free PDF Library >> -- hpdf_page_label.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_PAGE_LABEL_H +#define _HPDF_PAGE_LABEL_H + +#include "hpdf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +HPDF_Dict +HPDF_PageLabel_New (HPDF_Doc pdf, + HPDF_PageNumStyle style, + HPDF_INT first_page, + const char *prefix); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif + diff --git a/code/libharu/hpdf_pages.h b/code/libharu/hpdf_pages.h new file mode 100644 index 0000000..dc42062 --- /dev/null +++ b/code/libharu/hpdf_pages.h @@ -0,0 +1,131 @@ +/* + * << Haru Free PDF Library >> -- hpdf_pages.c + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_PAGES_H +#define _HPDF_PAGES_H + +#include "hpdf_gstate.h" +#include "hpdf_ext_gstate.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------------------------*/ +/*----- HPDF_Pages -----------------------------------------------------------*/ + +HPDF_Pages +HPDF_Pages_New (HPDF_MMgr mmgr, + HPDF_Pages parent, + HPDF_Xref xref); + + +HPDF_BOOL +HPDF_Pages_Validate (HPDF_Pages pages); + + +HPDF_STATUS +HPDF_Pages_AddKids (HPDF_Pages parent, + HPDF_Dict kid); + + +HPDF_STATUS +HPDF_Page_InsertBefore (HPDF_Page page, + HPDF_Page target); + + +typedef struct _HPDF_PageAttr_Rec *HPDF_PageAttr; + +typedef struct _HPDF_PageAttr_Rec { + HPDF_Pages parent; + HPDF_Dict fonts; + HPDF_Dict xobjects; + HPDF_Dict ext_gstates; + HPDF_GState gstate; + HPDF_Point str_pos; + HPDF_Point cur_pos; + HPDF_Point text_pos; + HPDF_TransMatrix text_matrix; + HPDF_UINT16 gmode; + HPDF_Dict contents; + HPDF_Stream stream; + HPDF_Xref xref; + HPDF_UINT compression_mode; + HPDF_PDFVer *ver; +} HPDF_PageAttr_Rec; + + +/*----------------------------------------------------------------------------*/ +/*----- HPDF_Page ------------------------------------------------------------*/ + +HPDF_BOOL +HPDF_Page_Validate (HPDF_Page page); + + +HPDF_Page +HPDF_Page_New (HPDF_MMgr mmgr, + HPDF_Xref xref); + + +void* +HPDF_Page_GetInheritableItem (HPDF_Page page, + const char *key, + HPDF_UINT16 obj_class); + + +const char* +HPDF_Page_GetXObjectName (HPDF_Page page, + HPDF_XObject xobj); + + +const char* +HPDF_Page_GetLocalFontName (HPDF_Page page, + HPDF_Font font); + + +const char* +HPDF_Page_GetExtGStateName (HPDF_Page page, + HPDF_ExtGState gstate); + + +HPDF_Box +HPDF_Page_GetMediaBox (HPDF_Page page); + + +HPDF_STATUS +HPDF_Page_SetBoxValue (HPDF_Page page, + const char *name, + HPDF_UINT index, + HPDF_REAL value); + + +void +HPDF_Page_SetFilter (HPDF_Page page, + HPDF_UINT filter); + + +HPDF_STATUS +HPDF_Page_CheckState (HPDF_Page page, + HPDF_UINT mode); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_PAGES_H */ + diff --git a/code/libharu/hpdf_pdfa.h b/code/libharu/hpdf_pdfa.h new file mode 100644 index 0000000..e3e5b08 --- /dev/null +++ b/code/libharu/hpdf_pdfa.h @@ -0,0 +1,43 @@ +/* + * << Haru Free PDF Library >> -- hpdf_pdfa.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_PDFA_H +#define _HPDF_PDFA_H + +#include "hpdf_doc.h" +#include "hpdf_objects.h" + + + +#ifdef __cplusplus +extern "C" { +#endif + +HPDF_STATUS +HPDF_PDFA_AppendOutputIntents(HPDF_Doc pdf, const char *iccname, HPDF_Dict iccdict); + +HPDF_STATUS +HPDF_PDFA_SetPDFAConformance (HPDF_Doc pdf, + HPDF_PDFAType pdfatype); + +HPDF_STATUS +HPDF_PDFA_GenerateID(HPDF_Doc); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/code/libharu/hpdf_streams.h b/code/libharu/hpdf_streams.h new file mode 100644 index 0000000..18336f0 --- /dev/null +++ b/code/libharu/hpdf_streams.h @@ -0,0 +1,280 @@ +/* + * << Haru Free PDF Library >> -- hpdf_streams.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + * 2005.12.20 Created. + * + */ + +#ifndef _HPDF_STREAMS_H +#define _HPDF_STREAMS_H + +#include "hpdf_list.h" +#include "hpdf_encrypt.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +#define HPDF_STREAM_SIG_BYTES 0x5354524DL + +typedef enum _HPDF_StreamType { + HPDF_STREAM_UNKNOWN = 0, + HPDF_STREAM_CALLBACK, + HPDF_STREAM_FILE, + HPDF_STREAM_MEMORY +} HPDF_StreamType; + +#define HPDF_STREAM_FILTER_NONE 0x0000 +#define HPDF_STREAM_FILTER_ASCIIHEX 0x0100 +#define HPDF_STREAM_FILTER_ASCII85 0x0200 +#define HPDF_STREAM_FILTER_FLATE_DECODE 0x0400 +#define HPDF_STREAM_FILTER_DCT_DECODE 0x0800 +#define HPDF_STREAM_FILTER_CCITT_DECODE 0x1000 + +typedef enum _HPDF_WhenceMode { + HPDF_SEEK_SET = 0, + HPDF_SEEK_CUR, + HPDF_SEEK_END +} HPDF_WhenceMode; + +typedef struct _HPDF_Stream_Rec *HPDF_Stream; + +typedef HPDF_STATUS +(*HPDF_Stream_Write_Func) (HPDF_Stream stream, + const HPDF_BYTE *ptr, + HPDF_UINT siz); + + +typedef HPDF_STATUS +(*HPDF_Stream_Read_Func) (HPDF_Stream stream, + HPDF_BYTE *ptr, + HPDF_UINT *siz); + + +typedef HPDF_STATUS +(*HPDF_Stream_Seek_Func) (HPDF_Stream stream, + HPDF_INT pos, + HPDF_WhenceMode mode); + + +typedef HPDF_INT32 +(*HPDF_Stream_Tell_Func) (HPDF_Stream stream); + + +typedef void +(*HPDF_Stream_Free_Func) (HPDF_Stream stream); + + +typedef HPDF_UINT32 +(*HPDF_Stream_Size_Func) (HPDF_Stream stream); + + +typedef struct _HPDF_MemStreamAttr_Rec *HPDF_MemStreamAttr; + + +typedef struct _HPDF_MemStreamAttr_Rec { + HPDF_List buf; + HPDF_UINT buf_siz; + HPDF_UINT w_pos; + HPDF_BYTE *w_ptr; + HPDF_UINT r_ptr_idx; + HPDF_UINT r_pos; + HPDF_BYTE *r_ptr; +} HPDF_MemStreamAttr_Rec; + + +typedef struct _HPDF_Stream_Rec { + HPDF_UINT32 sig_bytes; + HPDF_StreamType type; + HPDF_MMgr mmgr; + HPDF_Error error; + HPDF_UINT size; + HPDF_Stream_Write_Func write_fn; + HPDF_Stream_Read_Func read_fn; + HPDF_Stream_Seek_Func seek_fn; + HPDF_Stream_Free_Func free_fn; + HPDF_Stream_Tell_Func tell_fn; + HPDF_Stream_Size_Func size_fn; + void* attr; +} HPDF_Stream_Rec; + + + +HPDF_Stream +HPDF_MemStream_New (HPDF_MMgr mmgr, + HPDF_UINT buf_siz); + + +HPDF_BYTE* +HPDF_MemStream_GetBufPtr (HPDF_Stream stream, + HPDF_UINT index, + HPDF_UINT *length); + + +HPDF_UINT +HPDF_MemStream_GetBufSize (HPDF_Stream stream); + + +HPDF_UINT +HPDF_MemStream_GetBufCount (HPDF_Stream stream); + + +HPDF_STATUS +HPDF_MemStream_Rewrite (HPDF_Stream stream, + HPDF_BYTE *buf, + HPDF_UINT size); + + +void +HPDF_MemStream_FreeData (HPDF_Stream stream); + + +HPDF_STATUS +HPDF_Stream_WriteToStream (HPDF_Stream src, + HPDF_Stream dst, + HPDF_UINT filter, + HPDF_Encrypt e); + + +HPDF_Stream +HPDF_FileReader_New (HPDF_MMgr mmgr, + const char *fname); + + +HPDF_Stream +HPDF_FileWriter_New (HPDF_MMgr mmgr, + const char *fname); + + +HPDF_Stream +HPDF_CallbackReader_New (HPDF_MMgr mmgr, + HPDF_Stream_Read_Func read_fn, + HPDF_Stream_Seek_Func seek_fn, + HPDF_Stream_Tell_Func tell_fn, + HPDF_Stream_Size_Func size_fn, + void* data); + + +HPDF_Stream +HPDF_CallbackWriter_New (HPDF_MMgr mmgr, + HPDF_Stream_Write_Func write_fn, + void* data); + + +void +HPDF_Stream_Free (HPDF_Stream stream); + + +HPDF_STATUS +HPDF_Stream_WriteChar (HPDF_Stream stream, + char value); + + +HPDF_STATUS +HPDF_Stream_WriteStr (HPDF_Stream stream, + const char *value); + + +HPDF_STATUS +HPDF_Stream_WriteUChar (HPDF_Stream stream, + HPDF_BYTE value); + + +HPDF_STATUS +HPDF_Stream_WriteInt (HPDF_Stream stream, + HPDF_INT value); + + +HPDF_STATUS +HPDF_Stream_WriteUInt (HPDF_Stream stream, + HPDF_UINT value); + + +HPDF_STATUS +HPDF_Stream_WriteReal (HPDF_Stream stream, + HPDF_REAL value); + + +HPDF_STATUS +HPDF_Stream_Write (HPDF_Stream stream, + const HPDF_BYTE *ptr, + HPDF_UINT size); + + +HPDF_STATUS +HPDF_Stream_Read (HPDF_Stream stream, + HPDF_BYTE *ptr, + HPDF_UINT *size); + +HPDF_STATUS +HPDF_Stream_ReadLn (HPDF_Stream stream, + char *s, + HPDF_UINT *size); + + +HPDF_INT32 +HPDF_Stream_Tell (HPDF_Stream stream); + + +HPDF_STATUS +HPDF_Stream_Seek (HPDF_Stream stream, + HPDF_INT pos, + HPDF_WhenceMode mode); + + +HPDF_BOOL +HPDF_Stream_EOF (HPDF_Stream stream); + + +HPDF_UINT32 +HPDF_Stream_Size (HPDF_Stream stream); + +HPDF_STATUS +HPDF_Stream_Flush (HPDF_Stream stream); + + +HPDF_STATUS +HPDF_Stream_WriteEscapeName (HPDF_Stream stream, + const char *value); + + +HPDF_STATUS +HPDF_Stream_WriteEscapeText2 (HPDF_Stream stream, + const char *text, + HPDF_UINT len); + + +HPDF_STATUS +HPDF_Stream_WriteEscapeText (HPDF_Stream stream, + const char *text); + + +HPDF_STATUS +HPDF_Stream_WriteBinary (HPDF_Stream stream, + const HPDF_BYTE *data, + HPDF_UINT len, + HPDF_Encrypt e); + + +HPDF_STATUS +HPDF_Stream_Validate (HPDF_Stream stream); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_STREAMS_H */ diff --git a/code/libharu/hpdf_types.h b/code/libharu/hpdf_types.h new file mode 100644 index 0000000..b9c4589 --- /dev/null +++ b/code/libharu/hpdf_types.h @@ -0,0 +1,565 @@ +/* + * << Haru Free PDF Library >> -- hpdf_types.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_TYPES_H +#define _HPDF_TYPES_H + +#ifndef HPDF_STDCALL +#ifdef HPDF_DLL_MAKE +#define HPDF_STDCALL __stdcall +#else +#ifdef HPDF_DLL +#define HPDF_STDCALL __stdcall +#else +#define HPDF_STDCALL +#endif +#endif +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------------------------*/ +/*----- type definition ------------------------------------------------------*/ + + +/* native OS integer types */ +typedef signed int HPDF_INT; +typedef unsigned int HPDF_UINT; + + +/* 32bit integer types + */ +typedef signed int HPDF_INT32; +typedef unsigned int HPDF_UINT32; + + +/* 16bit integer types + */ +typedef signed short HPDF_INT16; +typedef unsigned short HPDF_UINT16; + + +/* 8bit integer types + */ +typedef signed char HPDF_INT8; +typedef unsigned char HPDF_UINT8; + + +/* 8bit binary types + */ +typedef unsigned char HPDF_BYTE; + + +/* float type (32bit IEEE754) + */ +typedef float HPDF_REAL; + + +/* double type (64bit IEEE754) + */ +typedef double HPDF_DOUBLE; + + +/* boolean type (0: False, !0: True) + */ +typedef signed int HPDF_BOOL; + + +/* error-no type (32bit unsigned integer) + */ +typedef unsigned long HPDF_STATUS; + + +/* charactor-code type (16bit) + */ +typedef HPDF_UINT16 HPDF_CID; +typedef HPDF_UINT16 HPDF_UNICODE; + + +/* HPDF_Point struct + */ +typedef struct _HPDF_Point { + HPDF_REAL x; + HPDF_REAL y; +} HPDF_Point; + +typedef struct _HPDF_Rect { + HPDF_REAL left; + HPDF_REAL bottom; + HPDF_REAL right; + HPDF_REAL top; +} HPDF_Rect; + +/* HPDF_Point3D struct +*/ +typedef struct _HPDF_Point3D { + HPDF_REAL x; + HPDF_REAL y; + HPDF_REAL z; +} HPDF_Point3D; + +typedef struct _HPDF_Rect HPDF_Box; + +/* HPDF_Date struct + */ +typedef struct _HPDF_Date { + HPDF_INT year; + HPDF_INT month; + HPDF_INT day; + HPDF_INT hour; + HPDF_INT minutes; + HPDF_INT seconds; + char ind; + HPDF_INT off_hour; + HPDF_INT off_minutes; +} HPDF_Date; + + +typedef enum _HPDF_InfoType { + /* date-time type parameters */ + HPDF_INFO_CREATION_DATE = 0, + HPDF_INFO_MOD_DATE, + + /* string type parameters */ + HPDF_INFO_AUTHOR, + HPDF_INFO_CREATOR, + HPDF_INFO_PRODUCER, + HPDF_INFO_TITLE, + HPDF_INFO_SUBJECT, + HPDF_INFO_KEYWORDS, + HPDF_INFO_TRAPPED, + HPDF_INFO_GTS_PDFX, + HPDF_INFO_EOF +} HPDF_InfoType; + +/* PDF-A Types */ + +typedef enum _HPDF_PDFA_TYPE +{ + HPDF_PDFA_1A = 0, + HPDF_PDFA_1B = 1 +} HPDF_PDFAType; + + +typedef enum _HPDF_PdfVer { + HPDF_VER_12 = 0, + HPDF_VER_13, + HPDF_VER_14, + HPDF_VER_15, + HPDF_VER_16, + HPDF_VER_17, + HPDF_VER_EOF +} HPDF_PDFVer; + +typedef enum _HPDF_EncryptMode { + HPDF_ENCRYPT_R2 = 2, + HPDF_ENCRYPT_R3 = 3 +} HPDF_EncryptMode; + + +typedef void +(HPDF_STDCALL *HPDF_Error_Handler) (HPDF_STATUS error_no, + HPDF_STATUS detail_no, + void *user_data); + +typedef void* +(HPDF_STDCALL *HPDF_Alloc_Func) (HPDF_UINT size); + + +typedef void +(HPDF_STDCALL *HPDF_Free_Func) (void *aptr); + + +/*---------------------------------------------------------------------------*/ +/*------ text width struct --------------------------------------------------*/ + +typedef struct _HPDF_TextWidth { + HPDF_UINT numchars; + + /* don't use this value (it may be change in the feature). + use numspace as alternated. */ + HPDF_UINT numwords; + + HPDF_UINT width; + HPDF_UINT numspace; +} HPDF_TextWidth; + + +/*---------------------------------------------------------------------------*/ +/*------ dash mode ----------------------------------------------------------*/ + +typedef struct _HPDF_DashMode { + HPDF_UINT16 ptn[8]; + HPDF_UINT num_ptn; + HPDF_UINT phase; +} HPDF_DashMode; + + +/*---------------------------------------------------------------------------*/ +/*----- HPDF_TransMatrix struct ---------------------------------------------*/ + +typedef struct _HPDF_TransMatrix { + HPDF_REAL a; + HPDF_REAL b; + HPDF_REAL c; + HPDF_REAL d; + HPDF_REAL x; + HPDF_REAL y; +} HPDF_TransMatrix; + + +/*---------------------------------------------------------------------------*/ + +typedef enum _HPDF_ColorSpace { + HPDF_CS_DEVICE_GRAY = 0, + HPDF_CS_DEVICE_RGB, + HPDF_CS_DEVICE_CMYK, + HPDF_CS_CAL_GRAY, + HPDF_CS_CAL_RGB, + HPDF_CS_LAB, + HPDF_CS_ICC_BASED, + HPDF_CS_SEPARATION, + HPDF_CS_DEVICE_N, + HPDF_CS_INDEXED, + HPDF_CS_PATTERN, + HPDF_CS_EOF +} HPDF_ColorSpace; + +/*---------------------------------------------------------------------------*/ +/*----- HPDF_RGBColor struct ------------------------------------------------*/ + +typedef struct _HPDF_RGBColor { + HPDF_REAL r; + HPDF_REAL g; + HPDF_REAL b; +} HPDF_RGBColor; + +/*---------------------------------------------------------------------------*/ +/*----- HPDF_CMYKColor struct -----------------------------------------------*/ + +typedef struct _HPDF_CMYKColor { + HPDF_REAL c; + HPDF_REAL m; + HPDF_REAL y; + HPDF_REAL k; +} HPDF_CMYKColor; + +/*---------------------------------------------------------------------------*/ +/*------ The line cap style -------------------------------------------------*/ + +typedef enum _HPDF_LineCap { + HPDF_BUTT_END = 0, + HPDF_ROUND_END, + HPDF_PROJECTING_SCUARE_END, + HPDF_LINECAP_EOF +} HPDF_LineCap; + +/*----------------------------------------------------------------------------*/ +/*------ The line join style -------------------------------------------------*/ + +typedef enum _HPDF_LineJoin { + HPDF_MITER_JOIN = 0, + HPDF_ROUND_JOIN, + HPDF_BEVEL_JOIN, + HPDF_LINEJOIN_EOF +} HPDF_LineJoin; + +/*----------------------------------------------------------------------------*/ +/*------ The text rendering mode ---------------------------------------------*/ + +typedef enum _HPDF_TextRenderingMode { + HPDF_FILL = 0, + HPDF_STROKE, + HPDF_FILL_THEN_STROKE, + HPDF_INVISIBLE, + HPDF_FILL_CLIPPING, + HPDF_STROKE_CLIPPING, + HPDF_FILL_STROKE_CLIPPING, + HPDF_CLIPPING, + HPDF_RENDERING_MODE_EOF +} HPDF_TextRenderingMode; + + +typedef enum _HPDF_WritingMode { + HPDF_WMODE_HORIZONTAL = 0, + HPDF_WMODE_VERTICAL, + HPDF_WMODE_EOF +} HPDF_WritingMode; + + +typedef enum _HPDF_PageLayout { + HPDF_PAGE_LAYOUT_SINGLE = 0, + HPDF_PAGE_LAYOUT_ONE_COLUMN, + HPDF_PAGE_LAYOUT_TWO_COLUMN_LEFT, + HPDF_PAGE_LAYOUT_TWO_COLUMN_RIGHT, + HPDF_PAGE_LAYOUT_TWO_PAGE_LEFT, + HPDF_PAGE_LAYOUT_TWO_PAGE_RIGHT, + HPDF_PAGE_LAYOUT_EOF +} HPDF_PageLayout; + + +typedef enum _HPDF_PageMode { + HPDF_PAGE_MODE_USE_NONE = 0, + HPDF_PAGE_MODE_USE_OUTLINE, + HPDF_PAGE_MODE_USE_THUMBS, + HPDF_PAGE_MODE_FULL_SCREEN, +/* HPDF_PAGE_MODE_USE_OC, + HPDF_PAGE_MODE_USE_ATTACHMENTS, + */ + HPDF_PAGE_MODE_EOF +} HPDF_PageMode; + + +typedef enum _HPDF_PageNumStyle { + HPDF_PAGE_NUM_STYLE_DECIMAL = 0, + HPDF_PAGE_NUM_STYLE_UPPER_ROMAN, + HPDF_PAGE_NUM_STYLE_LOWER_ROMAN, + HPDF_PAGE_NUM_STYLE_UPPER_LETTERS, + HPDF_PAGE_NUM_STYLE_LOWER_LETTERS, + HPDF_PAGE_NUM_STYLE_EOF +} HPDF_PageNumStyle; + + +typedef enum _HPDF_DestinationType { + HPDF_XYZ = 0, + HPDF_FIT, + HPDF_FIT_H, + HPDF_FIT_V, + HPDF_FIT_R, + HPDF_FIT_B, + HPDF_FIT_BH, + HPDF_FIT_BV, + HPDF_DST_EOF +} HPDF_DestinationType; + + +typedef enum _HPDF_AnnotType { + HPDF_ANNOT_TEXT_NOTES, + HPDF_ANNOT_LINK, + HPDF_ANNOT_SOUND, + HPDF_ANNOT_FREE_TEXT, + HPDF_ANNOT_STAMP, + HPDF_ANNOT_SQUARE, + HPDF_ANNOT_CIRCLE, + HPDF_ANNOT_STRIKE_OUT, + HPDF_ANNOT_HIGHTLIGHT, + HPDF_ANNOT_UNDERLINE, + HPDF_ANNOT_INK, + HPDF_ANNOT_FILE_ATTACHMENT, + HPDF_ANNOT_POPUP, + HPDF_ANNOT_3D, + HPDF_ANNOT_SQUIGGLY, + HPDF_ANNOT_LINE, + HPDF_ANNOT_PROJECTION +} HPDF_AnnotType; + + +typedef enum _HPDF_AnnotFlgs { + HPDF_ANNOT_INVISIBLE, + HPDF_ANNOT_HIDDEN, + HPDF_ANNOT_PRINT, + HPDF_ANNOT_NOZOOM, + HPDF_ANNOT_NOROTATE, + HPDF_ANNOT_NOVIEW, + HPDF_ANNOT_READONLY +} HPDF_AnnotFlgs; + + +typedef enum _HPDF_AnnotHighlightMode { + HPDF_ANNOT_NO_HIGHTLIGHT = 0, + HPDF_ANNOT_INVERT_BOX, + HPDF_ANNOT_INVERT_BORDER, + HPDF_ANNOT_DOWN_APPEARANCE, + HPDF_ANNOT_HIGHTLIGHT_MODE_EOF +} HPDF_AnnotHighlightMode; + + +typedef enum _HPDF_AnnotIcon { + HPDF_ANNOT_ICON_COMMENT = 0, + HPDF_ANNOT_ICON_KEY, + HPDF_ANNOT_ICON_NOTE, + HPDF_ANNOT_ICON_HELP, + HPDF_ANNOT_ICON_NEW_PARAGRAPH, + HPDF_ANNOT_ICON_PARAGRAPH, + HPDF_ANNOT_ICON_INSERT, + HPDF_ANNOT_ICON_EOF +} HPDF_AnnotIcon; + +typedef enum _HPDF_AnnotIntent { + HPDF_ANNOT_INTENT_FREETEXTCALLOUT = 0, + HPDF_ANNOT_INTENT_FREETEXTTYPEWRITER, + HPDF_ANNOT_INTENT_LINEARROW, + HPDF_ANNOT_INTENT_LINEDIMENSION, + HPDF_ANNOT_INTENT_POLYGONCLOUD, + HPDF_ANNOT_INTENT_POLYLINEDIMENSION, + HPDF_ANNOT_INTENT_POLYGONDIMENSION +} HPDF_AnnotIntent; + +typedef enum _HPDF_LineAnnotEndingStyle { + HPDF_LINE_ANNOT_NONE = 0, + HPDF_LINE_ANNOT_SQUARE, + HPDF_LINE_ANNOT_CIRCLE, + HPDF_LINE_ANNOT_DIAMOND, + HPDF_LINE_ANNOT_OPENARROW, + HPDF_LINE_ANNOT_CLOSEDARROW, + HPDF_LINE_ANNOT_BUTT, + HPDF_LINE_ANNOT_ROPENARROW, + HPDF_LINE_ANNOT_RCLOSEDARROW, + HPDF_LINE_ANNOT_SLASH +} HPDF_LineAnnotEndingStyle; + +typedef enum _HPDF_LineAnnotCapPosition{ + HPDF_LINE_ANNOT_CAP_INLINE = 0, + HPDF_LINE_ANNOT_CAP_TOP +} HPDF_LineAnnotCapPosition; + +typedef enum _HPDF_StampAnnotName{ + HPDF_STAMP_ANNOT_APPROVED = 0, + HPDF_STAMP_ANNOT_EXPERIMENTAL, + HPDF_STAMP_ANNOT_NOTAPPROVED, + HPDF_STAMP_ANNOT_ASIS, + HPDF_STAMP_ANNOT_EXPIRED, + HPDF_STAMP_ANNOT_NOTFORPUBLICRELEASE, + HPDF_STAMP_ANNOT_CONFIDENTIAL, + HPDF_STAMP_ANNOT_FINAL, + HPDF_STAMP_ANNOT_SOLD, + HPDF_STAMP_ANNOT_DEPARTMENTAL, + HPDF_STAMP_ANNOT_FORCOMMENT, + HPDF_STAMP_ANNOT_TOPSECRET, + HPDF_STAMP_ANNOT_DRAFT, + HPDF_STAMP_ANNOT_FORPUBLICRELEASE +} HPDF_StampAnnotName; + +/*----------------------------------------------------------------------------*/ +/*------ border stype --------------------------------------------------------*/ + +typedef enum _HPDF_BSSubtype { + HPDF_BS_SOLID, + HPDF_BS_DASHED, + HPDF_BS_BEVELED, + HPDF_BS_INSET, + HPDF_BS_UNDERLINED +} HPDF_BSSubtype; + + +/*----- blend modes ----------------------------------------------------------*/ + +typedef enum _HPDF_BlendMode { + HPDF_BM_NORMAL, + HPDF_BM_MULTIPLY, + HPDF_BM_SCREEN, + HPDF_BM_OVERLAY, + HPDF_BM_DARKEN, + HPDF_BM_LIGHTEN, + HPDF_BM_COLOR_DODGE, + HPDF_BM_COLOR_BUM, + HPDF_BM_HARD_LIGHT, + HPDF_BM_SOFT_LIGHT, + HPDF_BM_DIFFERENCE, + HPDF_BM_EXCLUSHON, + HPDF_BM_EOF +} HPDF_BlendMode; + +/*----- slide show -----------------------------------------------------------*/ + +typedef enum _HPDF_TransitionStyle { + HPDF_TS_WIPE_RIGHT = 0, + HPDF_TS_WIPE_UP, + HPDF_TS_WIPE_LEFT, + HPDF_TS_WIPE_DOWN, + HPDF_TS_BARN_DOORS_HORIZONTAL_OUT, + HPDF_TS_BARN_DOORS_HORIZONTAL_IN, + HPDF_TS_BARN_DOORS_VERTICAL_OUT, + HPDF_TS_BARN_DOORS_VERTICAL_IN, + HPDF_TS_BOX_OUT, + HPDF_TS_BOX_IN, + HPDF_TS_BLINDS_HORIZONTAL, + HPDF_TS_BLINDS_VERTICAL, + HPDF_TS_DISSOLVE, + HPDF_TS_GLITTER_RIGHT, + HPDF_TS_GLITTER_DOWN, + HPDF_TS_GLITTER_TOP_LEFT_TO_BOTTOM_RIGHT, + HPDF_TS_REPLACE, + HPDF_TS_EOF +} HPDF_TransitionStyle; + +/*----------------------------------------------------------------------------*/ + +typedef enum _HPDF_PageSizes { + HPDF_PAGE_SIZE_LETTER = 0, + HPDF_PAGE_SIZE_LEGAL, + HPDF_PAGE_SIZE_A3, + HPDF_PAGE_SIZE_A4, + HPDF_PAGE_SIZE_A5, + HPDF_PAGE_SIZE_B4, + HPDF_PAGE_SIZE_B5, + HPDF_PAGE_SIZE_EXECUTIVE, + HPDF_PAGE_SIZE_US4x6, + HPDF_PAGE_SIZE_US4x8, + HPDF_PAGE_SIZE_US5x7, + HPDF_PAGE_SIZE_COMM10, + HPDF_PAGE_SIZE_EOF +} HPDF_PageSizes; + + +typedef enum _HPDF_PageDirection { + HPDF_PAGE_PORTRAIT = 0, + HPDF_PAGE_LANDSCAPE +} HPDF_PageDirection; + + +typedef enum _HPDF_EncoderType { + HPDF_ENCODER_TYPE_SINGLE_BYTE, + HPDF_ENCODER_TYPE_DOUBLE_BYTE, + HPDF_ENCODER_TYPE_UNINITIALIZED, + HPDF_ENCODER_UNKNOWN +} HPDF_EncoderType; + + +typedef enum _HPDF_ByteType { + HPDF_BYTE_TYPE_SINGLE = 0, + HPDF_BYTE_TYPE_LEAD, + HPDF_BYTE_TYPE_TRIAL, + HPDF_BYTE_TYPE_UNKNOWN +} HPDF_ByteType; + + +typedef enum _HPDF_TextAlignment { + HPDF_TALIGN_LEFT = 0, + HPDF_TALIGN_RIGHT, + HPDF_TALIGN_CENTER, + HPDF_TALIGN_JUSTIFY +} HPDF_TextAlignment; + +/*----------------------------------------------------------------------------*/ + +/* Name Dictionary values -- see PDF reference section 7.7.4 */ +typedef enum _HPDF_NameDictKey { + HPDF_NAME_EMBEDDED_FILES = 0, /* TODO the rest */ + HPDF_NAME_EOF +} HPDF_NameDictKey; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_TYPES_H */ + diff --git a/code/libharu/hpdf_u3d.h b/code/libharu/hpdf_u3d.h new file mode 100644 index 0000000..bc1420b --- /dev/null +++ b/code/libharu/hpdf_u3d.h @@ -0,0 +1,52 @@ +/* + * << Haru Free PDF Library >> -- hpdf_u3d.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_U3D_H +#define _HPDF_U3D_H + +#include "hpdf_objects.h" + +#ifdef __cplusplus +extern "C" { +#endif + +HPDF_EXPORT(HPDF_JavaScript) HPDF_CreateJavaScript(HPDF_Doc pdf, const char *code); + + +HPDF_EXPORT(HPDF_U3D) HPDF_LoadU3DFromFile (HPDF_Doc pdf, const char *filename); +HPDF_EXPORT(HPDF_Dict) HPDF_Create3DView (HPDF_MMgr mmgr, const char *name); +HPDF_EXPORT(HPDF_STATUS) HPDF_U3D_Add3DView(HPDF_U3D u3d, HPDF_Dict view); +HPDF_EXPORT(HPDF_STATUS) HPDF_U3D_SetDefault3DView(HPDF_U3D u3d, const char *name); +HPDF_EXPORT(HPDF_STATUS) HPDF_U3D_AddOnInstanciate(HPDF_U3D u3d, HPDF_JavaScript javaScript); +HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_AddNode(HPDF_Dict view, const char *name, HPDF_REAL opacity, HPDF_BOOL visible); +HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_SetLighting(HPDF_Dict view, const char *scheme); +HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_SetBackgroundColor(HPDF_Dict view, HPDF_REAL r, HPDF_REAL g, HPDF_REAL b); +HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_SetPerspectiveProjection(HPDF_Dict view, HPDF_REAL fov); +HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_SetOrthogonalProjection(HPDF_Dict view, HPDF_REAL mag); +HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_SetCamera(HPDF_Dict view, HPDF_REAL coox, HPDF_REAL cooy, HPDF_REAL cooz, HPDF_REAL c2cx, HPDF_REAL c2cy, HPDF_REAL c2cz, HPDF_REAL roo, HPDF_REAL roll); + +HPDF_Dict +HPDF_3DView_New ( HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_U3D u3d, + const char *name); +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_U3D_H */ + diff --git a/code/libharu/hpdf_utils.h b/code/libharu/hpdf_utils.h new file mode 100644 index 0000000..690ed6c --- /dev/null +++ b/code/libharu/hpdf_utils.h @@ -0,0 +1,165 @@ +/* + * << Haru Free PDF Library >> -- fpdf_utils.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_UTILS_H +#define _HPDF_UTILS_H + +#include "hpdf_config.h" +#include "hpdf_types.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +HPDF_INT +HPDF_AToI (const char* s); + + +HPDF_DOUBLE +HPDF_AToF (const char* s); + + +char* +HPDF_IToA (char* s, + HPDF_INT32 val, + char* eptr); + + +char* +HPDF_IToA2 (char *s, + HPDF_UINT32 val, + HPDF_UINT len); + + +char* +HPDF_FToA (char *s, + HPDF_REAL val, + char *eptr); + + +HPDF_BYTE* +HPDF_MemCpy (HPDF_BYTE* out, + const HPDF_BYTE* in, + HPDF_UINT n); + + +HPDF_BYTE* +HPDF_StrCpy (char* out, + const char* in, + char* eptr); + + +HPDF_INT +HPDF_MemCmp (const HPDF_BYTE* s1, + const HPDF_BYTE* s2, + HPDF_UINT n); + + +HPDF_INT +HPDF_StrCmp (const char* s1, + const char* s2); + + +const char* +HPDF_StrStr (const char *s1, + const char *s2, + HPDF_UINT maxlen); + + +void* +HPDF_MemSet (void* s, + HPDF_BYTE c, + HPDF_UINT n); + + +HPDF_UINT +HPDF_StrLen (const char* s, + HPDF_INT maxlen); + + +HPDF_Box +HPDF_ToBox (HPDF_INT16 left, + HPDF_INT16 bottom, + HPDF_INT16 right, + HPDF_INT16 top); + + +HPDF_Point +HPDF_ToPoint (HPDF_INT16 x, + HPDF_INT16 y); + + +HPDF_Rect +HPDF_ToRect (HPDF_REAL left, + HPDF_REAL bottom, + HPDF_REAL right, + HPDF_REAL top); + + +void +HPDF_UInt16Swap (HPDF_UINT16 *value); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#define HPDF_NEEDS_ESCAPE(c) (c < 0x20 || \ + c > 0x7e || \ + c == '\\' || \ + c == '%' || \ + c == '#' || \ + c == '/' || \ + c == '(' || \ + c == ')' || \ + c == '<' || \ + c == '>' || \ + c == '[' || \ + c == ']' || \ + c == '{' || \ + c == '}' ) \ + +#define HPDF_IS_WHITE_SPACE(c) (c == 0x00 || \ + c == 0x09 || \ + c == 0x0A || \ + c == 0x0C || \ + c == 0x0D || \ + c == 0x20 ) \ + +/*----------------------------------------------------------------------------*/ +/*----- macros for debug -----------------------------------------------------*/ + +#ifdef LIBHPDF_DEBUG_TRACE +#ifndef HPDF_PTRACE_ON +#define HPDF_PTRACE_ON +#endif /* HPDF_PTRACE_ON */ +#endif /* LIBHPDF_DEBUG_TRACE */ + +#ifdef HPDF_PTRACE_ON +#define HPDF_PTRACE(ARGS) HPDF_PRINTF ARGS +#else +#define HPDF_PTRACE(ARGS) /* do nothing */ +#endif /* HPDF_PTRACE */ + +#ifdef LIBHPDF_DEBUG +#define HPDF_PRINT_BINARY(BUF, LEN, CAPTION) HPDF_PrintBinary(BUF, LEN, CAPTION) +#else +#define HPDF_PRINT_BINARY(BUF, LEN, CAPTION) /* do nothing */ +#endif + +#endif /* _HPDF_UTILS_H */ + diff --git a/code/libharu/hpdf_version.h b/code/libharu/hpdf_version.h new file mode 100644 index 0000000..b7906e7 --- /dev/null +++ b/code/libharu/hpdf_version.h @@ -0,0 +1,8 @@ +/* automatically generated by configure */ +/* edit configure.in to change version number */ +#define HPDF_MAJOR_VERSION 2 +#define HPDF_MINOR_VERSION 3 +#define HPDF_BUGFIX_VERSION 0 +#define HPDF_EXTRA_VERSION "RC2" +#define HPDF_VERSION_TEXT "2.3.0RC2" +#define HPDF_VERSION_ID 20300 diff --git a/code/license.txt b/code/license.txt new file mode 100644 index 0000000..e6589a1 --- /dev/null +++ b/code/license.txt @@ -0,0 +1,688 @@ +This product is made available subject to the terms of GNU General Public License Version 3. A copy of the GPL license can be found at http://www.melin.nu/meos/license.html + +------------------------------------ +Third Party Code. Additional copyright notices and license terms applicable to portions of the Software are set forth in the thirdpartylicense.txt file. + +------------------------------------ +All trademarks and registered trademarks mentioned herein are the property of their respective owners. + +------------------------------------ +Copyright 2007-2013 Melin Software HB. + +------------------------------------ + + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/code/listeditor.cpp b/code/listeditor.cpp new file mode 100644 index 0000000..934717d --- /dev/null +++ b/code/listeditor.cpp @@ -0,0 +1,1201 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ +#include "stdafx.h" + +#include + +#include "listeditor.h" +#include "metalist.h" +#include "gdioutput.h" +#include "meosexception.h" +#include "gdistructures.h" +#include "meos_util.h" +#include "localizer.h" +#include "gdifonts.h" +#include "oEvent.h" +#include "tabbase.h" +#include "CommDlg.h" + +ListEditor::ListEditor(oEvent *oe_) { + oe = oe_; + currentList = 0; + currentIndex = -1; + dirtyExt = false; + dirtyInt = false; + lastSaved = NotSaved; + oe->loadGeneralResults(false); +} + +ListEditor::~ListEditor() { + setCurrentList(0); +} + +void ListEditor::setCurrentList(MetaList *lst) { + delete currentList; + currentList = lst; +} +/* +void ListEditor::load(MetaList *list) { + currentList = list; + currentIndex = -1; + dirtyInt = true; + dirtyExt = true; +}*/ + +void ListEditor::load(const MetaListContainer &mlc, int index) { + const MetaList &mc = mlc.getList(index); + setCurrentList(new MetaList()); + *currentList = mc; + + if (mlc.isInternal(index)) { + currentIndex = -1; + currentList->clearTag(); + } + else + currentIndex = index; + + dirtyExt = true; + dirtyInt = false; + savedFileName.clear(); +} + +void ListEditor::show(gdioutput &gdi) { + + gdi.setRestorePoint("BeginListEdit"); + + gdi.pushX(); + gdi.setCX(gdi.getCX() + gdi.scaleLength(6)); + + int bx = gdi.getCX(); + int by = gdi.getCY(); + + if (currentList) + gdi.addString("", boldLarge, MakeDash("Listredigerare - X#") + currentList->getListName()); + else + gdi.addString("", boldLarge, "Listredigerare"); + + gdi.setOnClearCb(editListCB); + gdi.setData("ListEditorClz", this); + gdi.dropLine(0.5); + gdi.fillRight(); + + gdi.addButton("EditList", "Egenskaper", editListCB); + gdi.setCX(gdi.getCX() + gdi.scaleLength(32)); + gdi.addButton("OpenFile", "Öppna fil", editListCB); + gdi.addButton("OpenInside", "Öppna från aktuell tävling", editListCB); + + if (savedFileName.empty()) + gdi.addButton("SaveFile", "Spara som fil", editListCB); + else { + gdi.addButton("SaveFile", "Spara fil", editListCB, "#" + savedFileName); + gdi.addButton("SaveFileCopy", "Spara som...", editListCB); + } + + gdi.addButton("SaveInside", "Spara i aktuell tävling", editListCB); + gdi.addButton("NewList", "Ny lista", editListCB); + gdi.addButton("RemoveInside", "Radera", editListCB, "Radera listan från aktuell tävling"); + gdi.setInputStatus("RemoveInside", currentIndex != -1); + gdi.addButton("Close", "Stäng", editListCB); + + gdi.dropLine(2); + + int dx = gdi.getCX(); + int dy = gdi.getCY(); + + RECT rc; + int off = gdi.scaleLength(6); + rc.left = bx - 2 * off; + rc.right = dx + 2 * off; + + rc.top = by - off; + rc.bottom = dy + off; + + gdi.addRectangle(rc, colorWindowBar); + + gdi.dropLine(); + gdi.popX(); + + + makeDirty(gdi, NoTouch, NoTouch); + if (!currentList) { + gdi.disableInput("EditList"); + gdi.disableInput("SaveFile"); + gdi.disableInput("SaveFileCopy", true); + gdi.disableInput("SaveInside"); + gdi.refresh(); + return; + } + + MetaList &list = *currentList; + + const vector< vector > &head = list.getHead(); + gdi.fillDown(); + gdi.addString("", 1, "Rubrik"); + gdi.pushX(); + gdi.fillRight(); + const double buttonDrop = 2.2; + int lineIx = 100; + for (size_t k = 0; k < head.size(); k++) { + showLine(gdi, head[k], lineIx++); + gdi.popX(); + gdi.dropLine(buttonDrop); + } + gdi.fillDown(); + gdi.addButton("AddLine0", "Lägg till rad", editListCB); + + gdi.dropLine(0.5); + gdi.addString("", 1, "Underrubrik"); + gdi.pushX(); + gdi.fillRight(); + const vector< vector > &subHead = list.getSubHead(); + lineIx = 200; + for (size_t k = 0; k < subHead.size(); k++) { + showLine(gdi, subHead[k], lineIx++); + gdi.popX(); + gdi.dropLine(buttonDrop); + } + gdi.fillDown(); + gdi.addButton("AddLine1", "Lägg till rad", editListCB); + + gdi.dropLine(0.5); + gdi.addString("", 1, "Huvudlista"); + gdi.pushX(); + gdi.fillRight(); + const vector< vector > &mainList = list.getList(); + lineIx = 300; + for (size_t k = 0; k < mainList.size(); k++) { + showLine(gdi, mainList[k], lineIx++); + gdi.popX(); + gdi.dropLine(buttonDrop); + } + gdi.fillDown(); + gdi.addButton("AddLine2", "Lägg till rad", editListCB); + + gdi.dropLine(0.5); + gdi.addString("", 1, "Underlista"); + gdi.pushX(); + gdi.fillRight(); + const vector< vector > &subList = list.getSubList(); + lineIx = 400; + for (size_t k = 0; k < subList.size(); k++) { + showLine(gdi, subList[k], lineIx++); + gdi.popX(); + gdi.dropLine(buttonDrop); + } + gdi.fillDown(); + gdi.addButton("AddLine3", "Lägg till rad", editListCB); + + gdi.setRestorePoint("EditList"); + + gdi.dropLine(2); + + oListInfo li; + oListParam par; + par.pageBreak = false; + par.splitAnalysis = true; + par.setLegNumberCoded(-1); + par.inputNumber = 0; + gdi.fillDown(); + + try { + currentList->interpret(oe, gdi, par, gdi.getLineHeight(), li); + rc.left = gdi.getCX(); + rc.right = gdi.getCX() + gdi.getWidth() - 20; + rc.top = gdi.getCY(); + rc.bottom = rc.top + 4; + + gdi.addRectangle(rc, colorDarkGreen, false, false); + gdi.dropLine(); + + oe->generateList(gdi, false, li, true); + } + catch (std::exception &ex) { + gdi.addString("", 1, "Listan kan inte visas").setColor(colorRed); + gdi.addString("", 0, ex.what()); + } + + gdi.refresh(); +} + +int editListCB(gdioutput *gdi, int type, void *data) +{ + void *clz = gdi->getData("ListEditorClz"); + ListEditor *le = (ListEditor *)clz; + BaseInfo *bi = (BaseInfo *)data; + if (le) + return le->editList(*gdi, type, *bi); + + throw meosException("Unexpected error"); +} + +void ListEditor::showLine(gdioutput &gdi, const vector &line, int ix) const { + for (size_t k = 0; k < line.size(); k++) { + addButton(gdi, line[k], gdi.getCX(), gdi.getCY(), ix, k); + } + + gdi.addButton("AddPost" + itos(ix), "Lägg till ny", editListCB); +} + +ButtonInfo &ListEditor::addButton(gdioutput &gdi, const MetaListPost &mlp, int x, int y, int lineIx, int ix) const { + string cap; + if (mlp.getType() == "String") { + cap = "Text: X#" + mlp.getText(); + } + else { + const string &text = mlp.getText(); + if (text.length() > 0) { + if (text[0] == '@') { + vector part; + split(text.substr(1), ";", part); + unsplit(part, "|", cap); + } + else + cap = text + "#" + lang.tl(mlp.getType()); + } + else { + cap = mlp.getType(); + } + } + + ButtonInfo &bi = gdi.addButton(x, y, "EditPost" + itos(lineIx * 100 + ix), cap, editListCB); + return bi; +} + +static void getPosFromId(int id, int &groupIx, int &lineIx, int &ix) { + lineIx = id / 100; + ix = id % 100; + groupIx = (lineIx / 100) - 1; + lineIx = lineIx % 100; +} + +int ListEditor::editList(gdioutput &gdi, int type, BaseInfo &data) { + int lineIx, groupIx, ix; + if (type == GUI_BUTTON) { + ButtonInfo bi = dynamic_cast(data); + ButtonInfo &biSrc = dynamic_cast(data); + + if (bi.id == "Color") { + CHOOSECOLOR cc; + memset(&cc, 0, sizeof(cc)); + cc.lStructSize = sizeof(cc); + cc.hwndOwner = gdi.getHWND(); + cc.rgbResult = COLORREF(bi.getExtra()); + if (GDICOLOR((int)bi.getExtra()) != colorDefault) + cc.Flags |= CC_RGBINIT; + + COLORREF staticColor[16]; + memset(staticColor, 0, 16*sizeof(COLORREF)); + + const string &c = oe->getPropertyString("Colors", ""); + const char *end = c.c_str() + c.length(); + const char * pEnd = c.c_str(); + int pix = 0; + while(pEnd < end && pix < 16) { + staticColor[pix++] = strtol(pEnd,(char **)&pEnd,16); + } + + //vector splitvector; + //split(c, ";", splitvector); + cc.lpCustColors = staticColor; + if (ChooseColor(&cc)) { + data.setExtra((int)cc.rgbResult); + + string co; + for (ix = 0; ix < 16; ix++) { + char bf[16]; + sprintf_s(bf, "%x ", staticColor[ix]); + co += bf; + } + oe->setProperty("Colors", co); + } + } + if ( bi.id.substr(0, 8) == "EditPost" ) { + int id = atoi(bi.id.substr(8).c_str()); + getPosFromId(id, groupIx, lineIx, ix); + MetaListPost &mlp = currentList->getMLP(groupIx, lineIx, ix); + editListPost(gdi, mlp, id); + } + else if ( bi.id.substr(0, 7) == "AddPost" ) { + checkUnsaved(gdi); + gdi.restore("EditList", true); + gdi.pushX(); + lineIx = atoi(bi.id.substr(7).c_str()); + groupIx = (lineIx / 100) - 1; + int ixOutput = 0; + MetaListPost &mlp = currentList->addNew(groupIx, lineIx % 100, ixOutput); + int xp = bi.xp; + int yp = bi.yp; + ButtonInfo &nb = addButton(gdi, mlp, xp, yp, lineIx, ixOutput); + //gdi.addButton(xp, yp, string("Foo"), string("FoooBar"), 0); + int w, h; + nb.getDimension(gdi, w, h); + biSrc.moveButton(gdi, xp+w, yp); + gdi.popX(); + gdi.setRestorePoint("EditList"); + makeDirty(gdi, MakeDirty, MakeDirty); + gdi.sendCtrlMessage(nb.id); + } + else if ( bi.id.substr(0, 7) == "AddLine" ) { + checkUnsaved(gdi); + groupIx = atoi(bi.id.substr(7).c_str()); + int ixOutput = 0; + currentList->addNew(groupIx, -1, ixOutput); + + gdi.restore("BeginListEdit", false); + makeDirty(gdi, MakeDirty, MakeDirty); + show(gdi); + } + else if ( bi.id == "Remove" ) { + DWORD id; + gdi.getData("CurrentId", id); + getPosFromId(id, groupIx, lineIx, ix); + currentList->removeMLP(groupIx, lineIx, ix); + gdi.restore("BeginListEdit", false); + makeDirty(gdi, MakeDirty, MakeDirty); + show(gdi); + } + else if (bi.id == "UseLeg") { + gdi.setInputStatus("Leg", gdi.isChecked(bi.id)); + } + else if (bi.id == "Cancel") { + gdi.restore("EditList"); + gdi.enableInput("EditList"); + } + else if (bi.id == "CancelNew") { + gdi.clearPage(false); + currentList = 0; + show(gdi); + } + else if (bi.id == "Apply" || bi.id == "MoveLeft" || bi.id == "MoveRight") { + DWORD id; + gdi.getData("CurrentId", id); + getPosFromId(id, groupIx, lineIx, ix); + + if (bi.id == "MoveLeft") + currentList->moveOnRow(groupIx, lineIx, ix, -1); + else if (bi.id == "MoveRight") + currentList->moveOnRow(groupIx, lineIx, ix, 1); + + MetaListPost &mlp = currentList->getMLP(groupIx, lineIx, ix); + + ListBoxInfo lbi; + bool force = false; + gdi.getSelectedItem("Type", lbi); + + EPostType ptype = EPostType(lbi.data); + + string str = gdi.getText("Text"); + if (ptype != lString) { + if (!str.empty() && str.find_first_of('X') == string::npos && str[0]!='@') { + throw meosException("Texten ska innehålla tecknet X, som byts ut mot tävlingsspecifik data"); + } + } + + string t1 = mlp.getType(); + EPostType newType = EPostType(lbi.data); + mlp.setType(newType); + if (t1 != mlp.getType()) + force = true; + mlp.setText(str); + + gdi.getSelectedItem("AlignType", lbi); + mlp.align(EPostType(lbi.data), gdi.isChecked("BlockAlign")); + mlp.alignText(gdi.getText("AlignText")); + mlp.mergePrevious(gdi.isChecked("MergeText")); + + gdi.getSelectedItem("TextAdjust", lbi); + mlp.setTextAdjust(lbi.data); + + mlp.setColor(GDICOLOR(gdi.getExtraInt("Color"))); + + if (gdi.isChecked("UseLeg")) { + int leg = gdi.getTextNo("Leg"); + if (newType == lResultModuleNumber || newType == lResultModuleTime || + newType == lResultModuleNumberTeam || newType == lResultModuleTimeTeam) { + if (leg < 0 || leg > 1000) + throw meosException("X är inget giltigt index#" + itos(leg)); + mlp.setLeg(leg); + } + else { + if (leg < 1 || leg > 1000) + throw meosException("X är inget giltigt sträcknummer#" + itos(leg)); + mlp.setLeg(leg - 1); + } + } + else + mlp.setLeg(-1); + + if (gdi.hasField("UseResultModule") && gdi.isChecked("UseResultModule")) + mlp.setResultModule(currentList->getResultModule()); + else + mlp.setResultModule(""); + + mlp.setBlock(gdi.getTextNo("BlockSize")); + mlp.indent(gdi.getTextNo("MinIndeent")); + + gdi.getSelectedItem("Fonts", lbi); + mlp.setFont(gdiFonts(lbi.data)); + makeDirty(gdi, MakeDirty, MakeDirty); + if (!gdi.hasData("NoRedraw") || force) { + gdi.restore("BeginListEdit", false); + show(gdi); + } + } + else if (bi.id == "ApplyListProp") { + string name = gdi.getText("Name"); + + if (name.empty()) + throw meosException("Namnet kan inte vara tomt"); + + MetaList &list = *currentList; + list.setListName(name); + ListBoxInfo lbi; + + if (gdi.getSelectedItem("SortOrder", lbi)) + list.setSortOrder(SortOrder(lbi.data)); + + if (gdi.getSelectedItem("BaseType", lbi)) + list.setListType(oListInfo::EBaseType(lbi.data)); + + if (gdi.getSelectedItem("ResultType", lbi)) + list.setResultModule(*oe, lbi.data); + + if (gdi.getSelectedItem("SubType", lbi)) + list.setSubListType(oListInfo::EBaseType(lbi.data)); + + vector< pair > filtersIn; + vector< bool > filtersOut; + list.getFilters(filtersIn); + for (size_t k = 0; k < filtersIn.size(); k++) + filtersOut.push_back(gdi.isChecked("filter" + itos(k))); + + list.setFilters(filtersOut); + + vector< pair > subFiltersIn; + vector< bool > subFiltersOut; + list.getSubFilters(subFiltersIn); + for (size_t k = 0; k < subFiltersIn.size(); k++) + subFiltersOut.push_back(gdi.isChecked("subfilter" + itos(k))); + + list.setSubFilters(subFiltersOut); + + + for (int k = 0; k < 4; k++) { + list.setFontFace(k, gdi.getText("Font" + itos(k)), + gdi.getTextNo("FontFactor" + itos(k))); + + int f = gdi.getTextNo("ExtraSpace" + itos(k)); + list.setExtraSpace(k, f); + } + + list.setSupportFromTo(gdi.isChecked("SupportFrom"), gdi.isChecked("SupportTo")); + + makeDirty(gdi, MakeDirty, MakeDirty); + + if (!gdi.hasData("NoRedraw")) { + gdi.clearPage(false); + show(gdi); + } + } + else if (bi.id == "EditList") { + editListProp(gdi, false); + } + else if (bi.id == "NewList") { + if (!checkSave(gdi)) + return 0; + gdi.clearPage(false); + gdi.setData("ListEditorClz", this); + gdi.addString("", boldLarge, "Ny lista"); + + setCurrentList(new MetaList()); + currentIndex = -1; + lastSaved = NotSaved; + makeDirty(gdi, ClearDirty, ClearDirty); + + editListProp(gdi, true); + } + else if (bi.id == "MakeNewList") { + /* + currentList->setListName(lang.tl("Ny lista")); + currentIndex = -1; + + lastSaved = NotSaved; + makeDirty(gdi, ClearDirty, ClearDirty); + + gdi.clearPage(false); + show(gdi);*/ + } + else if (bi.id == "SaveFile" || bi.id == "SaveFileCopy") { + if (!currentList) + return 0; + + bool copy = bi.id == "SaveFileCopy"; + + string fileName = copy ? "" : savedFileName; + + if (fileName.empty()) { + int ix = 0; + vector< pair > ext; + ext.push_back(make_pair("xml-data", "*.xml")); + fileName = gdi.browseForSave(ext, "xml", ix); + if (fileName.empty()) + return 0; + } + + currentList->save(fileName, oe); + + lastSaved = SavedFile; + makeDirty(gdi, NoTouch, ClearDirty); + savedFileName = fileName; + return 1; + } + else if (bi.id == "OpenFile") { + if (!checkSave(gdi)) + return 0; + + vector< pair > ext; + ext.push_back(make_pair("xml-data", "*.xml")); + string fileName = gdi.browseForOpen(ext, "xml"); + if (fileName.empty()) + return 0; + + MetaList *tmp = new MetaList(); + try { + tmp->setListName(lang.tl("Ny lista")); + tmp->load(fileName); + } + catch(...) { + delete tmp; + throw; + } + + setCurrentList(tmp); + currentIndex = -1; + gdi.clearPage(false); + lastSaved = SavedFile; + + savedFileName = fileName; + oe->loadGeneralResults(true); + makeDirty(gdi, ClearDirty, ClearDirty); + show(gdi); + } + else if (bi.id == "OpenInside") { + if (!checkSave(gdi)) + return 0; + + savedFileName.clear(); + gdi.clearPage(true); + gdi.setOnClearCb(editListCB); + gdi.setData("ListEditorClz", this); + + gdi.pushX(); + vector< pair > lists; + oe->getListContainer().getLists(lists, true, false, false); + reverse(lists.begin(), lists.end()); + + gdi.fillRight(); + gdi.addSelection("OpenList", 250, 400, editListCB, "Välj lista:"); + gdi.addItem("OpenList", lists); + gdi.selectFirstItem("OpenList"); + + + gdi.dropLine(); + gdi.addButton("DoOpen", "Öppna", editListCB); + gdi.addButton("DoOpenCopy", "Open a Copy", editListCB); + enableOpen(gdi); + + gdi.addButton("CancelReload", "Avbryt", editListCB).setCancel(); + gdi.dropLine(4); + gdi.popX(); + } + else if (bi.id == "DoOpen" || bi.id == "DoOpenCopy" ) { + ListBoxInfo lbi; + if (gdi.getSelectedItem("OpenList", lbi)) { + load(oe->getListContainer(), lbi.data); + } + + if (bi.id == "DoOpenCopy") { + currentIndex = -1; + currentList->clearTag(); + lastSaved = NotSaved; + makeDirty(gdi, MakeDirty, MakeDirty); + } + else { + lastSaved = SavedInside; + makeDirty(gdi, ClearDirty, ClearDirty); + } + gdi.clearPage(false); + show(gdi); + } + else if (bi.id == "CancelReload") { + gdi.clearPage(false); + show(gdi); + } + else if (bi.id == "SaveInside") { + if (currentList == 0) + return 0; + savedFileName.clear(); + oe->synchronize(false); + + if (currentIndex != -1) { + oe->getListContainer().saveList(currentIndex, *currentList); + } + else { + oe->getListContainer().addExternal(*currentList); + currentIndex = oe->getListContainer().getNumLists() - 1; + oe->getListContainer().saveList(currentIndex, *currentList); + } + + oe->synchronize(true); + lastSaved = SavedInside; + makeDirty(gdi, ClearDirty, ClearDirty); + } + else if (bi.id == "RemoveInside") { + if (currentIndex != -1) { + oe->getListContainer().removeList(currentIndex); + currentIndex = -1; + savedFileName.clear(); + if (lastSaved == SavedInside) + lastSaved = NotSaved; + + gdi.alert("Listan togs bort från tävlingen."); + makeDirty(gdi, MakeDirty, NoTouch); + gdi.setInputStatus("RemoveInside", false); + } + } + else if (bi.id == "Close") { + if (!checkSave(gdi)) + return 0; + + setCurrentList(0); + makeDirty(gdi, ClearDirty, ClearDirty); + currentIndex = -1; + savedFileName.clear(); + gdi.getTabs().get(TListTab)->loadPage(gdi); + return 0; + } + /*else if (bi.id == "BrowseFont") { + InitCommonControls(); + CHOOSEFONT cf; + memset(&cf, 0, sizeof(cf)); + cf.lStructSize = sizeof(cf); + cf.hwndOwner = gdi.getHWND(); + ChooseFont(&cf); + EnumFontFamilies( + }*/ + } + else if (type == GUI_LISTBOX) { + ListBoxInfo &lbi = dynamic_cast(data); + + if (lbi.id == "AlignType") { + gdi.setInputStatus("AlignText", lbi.data == lString); + if (lbi.data == lString) { + int ix = lbi.text.find_first_of(":"); + if (ix != lbi.text.npos) + gdi.setText("AlignText", lbi.text.substr(ix+1)); + } + else + gdi.setText("AlignText", ""); + } + else if (lbi.id == "Type") { + EPostType type = EPostType(lbi.data); + gdi.setTextTranslate("TUseLeg", getIndexDescription(type), true); + if (type == lResultModuleNumber || type == lResultModuleTime || + type == lResultModuleNumberTeam || type == lResultModuleTimeTeam) { + gdi.check("UseLeg", true); + gdi.check("UseResultModule", true); + gdi.disableInput("UseResultModule"); + gdi.disableInput("UseLeg"); + gdi.enableInput("Leg"); + if (gdi.getText("Leg").empty()) + gdi.setText("Leg", "0"); + } + else { + gdi.enableInput("UseLeg"); + if (gdi.getTextNo("Leg") == 0) { + gdi.setText("Leg", ""); + gdi.enableInput("UseLeg"); + gdi.enableInput("UseResultModule", true); + gdi.check("UseLeg", false); + gdi.disableInput("Leg"); + } + } + } + else if (lbi.id == "SubType") { + oListInfo::EBaseType subType = oListInfo::EBaseType(lbi.data); + vector< pair > subfilters; + currentList->getSubFilters(subfilters); + for (size_t k = 0; k < subfilters.size(); k++) { + gdi.setInputStatus("subfilter" + itos(k), subType != oListInfo::EBaseTypeNone); + } + } + else if (lbi.id == "ResultType") { + vector< pair > types; + int currentType = 0; + currentList->getSortOrder(lbi.data != 0, types, currentType); + if (lbi.data == 0) { + ListBoxInfo mlbi; + gdi.getSelectedItem("SortOrder", mlbi); + currentType = mlbi.data; + } + gdi.addItem("SortOrder", types); + gdi.selectItemByData("SortOrder", currentType); + } + else if (lbi.id == "OpenList") { + enableOpen(gdi); + } + } + else if (type==GUI_CLEAR) { + return checkSave(gdi); + } + + return 0; +} + +void ListEditor::checkUnsaved(gdioutput &gdi) { + if (gdi.hasData("IsEditing")) { + if (gdi.isInputChanged("")) { + gdi.setData("NoRedraw", 1); + gdi.sendCtrlMessage("Apply"); + } + } + if (gdi.hasData("IsEditingList")) { + if (gdi.isInputChanged("")) { + gdi.setData("NoRedraw", 1); + gdi.sendCtrlMessage("ApplyListProp"); + } + } +} + +void ListEditor::editListPost(gdioutput &gdi, const MetaListPost &mlp, int id) { + checkUnsaved(gdi); + gdi.restore("EditList", false); + gdi.dropLine(); + + gdi.enableInput("EditList"); + int groupIx, lineIx, ix; + getPosFromId(id, groupIx, lineIx, ix); + const bool hasResultModule = currentList && !currentList->getResultModule().empty(); + int x1 = gdi.getCX(); + int y1 = gdi.getCY(); + int margin = gdi.scaleLength(10); + gdi.setCX(x1+margin); + + gdi.dropLine(); + gdi.pushX(); + gdi.fillRight(); + gdi.addString("", boldLarge, "Listpost").setColor(colorDarkGrey); + gdi.setCX(gdi.getCX() + gdi.scaleLength(20)); + + gdi.addButton("MoveLeft", "<< Flytta vänster", editListCB); + gdi.addButton("MoveRight", "Flytta höger >>", editListCB); + + gdi.dropLine(3); + gdi.popX(); + vector< pair > types; + int currentType; + mlp.getTypes(types, currentType); + EPostType storedType = EPostType(currentType); + + if (!hasResultModule) { + for (size_t k = 0; k < types.size(); k++) { + if ( (storedType != lResultModuleNumber && types[k].second == lResultModuleNumber) || + (storedType != lResultModuleTime && types[k].second == lResultModuleTime) || + (storedType != lResultModuleNumberTeam && types[k].second == lResultModuleNumberTeam) || + (storedType != lResultModuleTimeTeam && types[k].second == lResultModuleTimeTeam)) { + swap(types[k], types.back()); + types.pop_back(); + k--; + } + } + } + + sort(types.begin(), types.end()); + gdi.pushX(); + gdi.fillRight(); + int boxY = gdi.getCY(); + gdi.addSelection("Type", 290, 500, editListCB, "Typ:"); + gdi.addItem("Type", types); + gdi.selectItemByData("Type", currentType); + gdi.addInput("Text", mlp.getText(), 16, 0, "Egen text:", "Använd symbolen X där MeOS ska fylla i typens data."); + int boxX = gdi.getCX(); + gdi.popX(); + gdi.fillRight(); + gdi.dropLine(3); + currentList->getAlignTypes(mlp, types, currentType); + sort(types.begin(), types.end()); + gdi.addSelection("AlignType", 290, 500, editListCB, "Justera mot:"); + gdi.addItem("AlignType", types); + gdi.selectItemByData("AlignType", currentType); + + gdi.addInput("AlignText", mlp.getAlignText(), 16, 0, "Text:"); + if (currentType != lString) + gdi.disableInput("AlignText"); + gdi.popX(); + gdi.dropLine(3); + gdi.fillRight(); + gdi.addCheckbox("BlockAlign", "Justera blockvis:", 0, mlp.getAlignBlock()); + gdi.dropLine(-0.2); + gdi.addInput("BlockSize", itos(mlp.getBlockWidth()), 5, 0, "", "Blockbredd"); + gdi.dropLine(2.1); + gdi.popX(); + gdi.fillRight(); + + if (hasResultModule) { + gdi.addCheckbox("UseResultModule", "Data from result module (X)#" + currentList->getResultModule(), 0, !mlp.getResultModule().empty()); + gdi.dropLine(1.5); + gdi.popX(); + } + + int leg = mlp.getLeg(); + gdi.addCheckbox("UseLeg", getIndexDescription(storedType), editListCB, leg != -1); + gdi.dropLine(-0.2); + gdi.setCX(gdi.getCX() + gdi.getLineHeight() * 5); + if (storedType == lResultModuleNumber || storedType == lResultModuleTime || storedType == lResultModuleTimeTeam || storedType == lResultModuleNumberTeam) + gdi.addInput("Leg", leg>=0 ? itos(leg) : "0", 4); + else + gdi.addInput("Leg", leg>=0 ? itos(leg + 1) : "", 4); + + if (storedType == lResultModuleNumber || storedType == lResultModuleTime || storedType == lResultModuleTimeTeam || storedType == lResultModuleNumberTeam) { + gdi.check("UseLeg", true); + gdi.check("UseResultModule", true); + gdi.disableInput("UseResultModule"); + gdi.disableInput("UseLeg"); + } + + gdi.dropLine(2); + if (ix>0) { + gdi.popX(); + gdi.addCheckbox("MergeText", "Slå ihop text med föregående", 0, mlp.isMergePrevious()); + gdi.dropLine(2); + } + int maxY = gdi.getCY(); + gdi.popX(); + gdi.fillDown(); + gdi.setCX(boxX + gdi.scaleLength(24)); + gdi.setCY(boxY); + gdi.pushX(); + gdi.addString("", 1, "Formateringsregler"); + gdi.dropLine(0.5); + gdi.fillRight(); + gdi.addInput("MinIndeent", itos(mlp.getMinimalIndent()), 7, 0, "Minsta intabbning:"); + + vector< pair > fonts; + int currentFont; + mlp.getFonts(fonts, currentFont); + + gdi.addSelection("Fonts", 150, 500, 0, "Format:"); + gdi.addItem("Fonts", fonts); + gdi.selectItemByData("Fonts", currentFont); + int maxX = gdi.getCX(); + + gdi.popX(); + gdi.dropLine(3); + + gdi.addSelection("TextAdjust", 150, 100, 0, "Textjustering:"); + gdi.addItem("TextAdjust", lang.tl("Vänster"), 0); + gdi.addItem("TextAdjust", lang.tl("Höger"), textRight); + gdi.addItem("TextAdjust", lang.tl("Centrera"), textCenter); + gdi.selectItemByData("TextAdjust", mlp.getTextAdjustNum()); + + //gdi.popX(); + //gdi.dropLine(2); + gdi.dropLine(); + gdi.addButton("Color", "Färg...", editListCB).setExtra(mlp.getColorValue()); + + + maxX = max(maxX, gdi.getCX()); + gdi.popX(); + gdi.dropLine(3); + + gdi.setData("CurrentId", id); + gdi.addButton("Remove", "Radera", editListCB, "Ta bort listposten"); + gdi.addButton("Cancel", "Avbryt", editListCB).setCancel(); + + gdi.updatePos(gdi.getCX(), gdi.getCY(), gdi.scaleLength(20), 0); + gdi.addButton("Apply", "OK", editListCB).setDefault(); + + gdi.dropLine(3); + maxY = max(maxY, gdi.getCY()); + maxX = max(gdi.getCX(), maxX); + + gdi.fillDown(); + gdi.popX(); + gdi.setData("IsEditing", 1); + + RECT rc; + rc.top = y1; + rc.left = x1; + rc.right = maxX + gdi.scaleLength(6); + rc.bottom = maxY + gdi.scaleLength(6); + + gdi.addRectangle(rc, colorLightBlue, true); + + gdi.scrollToBottom(); + gdi.refresh(); +} + +const char *ListEditor::getIndexDescription(EPostType type) { + if (type == lResultModuleTime || type == lResultModuleTimeTeam) + return "Index in X[index]#OutputTimes"; + else if (type == lResultModuleNumber || type == lResultModuleNumberTeam) + return "Index in X[index]#OutputNumbers"; + else + return "Applicera för specifik sträcka:"; +} + +void ListEditor::editListProp(gdioutput &gdi, bool newList) { + checkUnsaved(gdi); + + if (!currentList) + return; + + MetaList &list = *currentList; + + if (!newList) { + gdi.restore("EditList", false); + gdi.disableInput("EditList"); + } + + gdi.dropLine(0.8); + + int x1 = gdi.getCX(); + int y1 = gdi.getCY(); + int margin = gdi.scaleLength(10); + gdi.setCX(x1+margin); + + if (!newList) { + gdi.dropLine(); + gdi.fillDown(); + gdi.addString("", boldLarge, "Listegenskaper").setColor(colorDarkGrey); + gdi.dropLine(); + } + + gdi.fillRight(); + gdi.pushX(); + + gdi.addInput("Name", list.getListName(), 20, 0, "Listnamn:"); + + if (newList) { + gdi.dropLine(3.5); + gdi.popX(); + } + + vector< pair > types; + int currentType = 0; + + int maxX = gdi.getCX(); + + list.getBaseType(types, currentType); + gdi.addSelection("BaseType", 150, 400, 0, "Listtyp:"); + gdi.addItem("BaseType", types); + gdi.selectItemByData("BaseType", currentType); + gdi.autoGrow("BaseType"); + + list.getResultModule(*oe, types, currentType); + gdi.addSelection("ResultType", 150, 400, editListCB, "Resultatuträkning:"); + gdi.addItem("ResultType", types); + gdi.autoGrow("ResultType"); + gdi.selectItemByData("ResultType", currentType); + + list.getSortOrder(false, types, currentType); + gdi.addSelection("SortOrder", 170, 400, 0, "Global sorteringsordning:"); + gdi.addItem("SortOrder", types); + gdi.autoGrow("SortOrder"); + + gdi.selectItemByData("SortOrder", currentType); + + list.getSubType(types, currentType); + gdi.addSelection("SubType", 150, 400, editListCB, "Sekundär typ:"); + gdi.addItem("SubType", types); + gdi.selectItemByData("SubType", currentType); + oListInfo::EBaseType subType = oListInfo::EBaseType(currentType); + + maxX = max(maxX, gdi.getCX()); + gdi.popX(); + gdi.dropLine(3); + + gdi.fillRight(); + gdi.addCheckbox("SupportFrom", "Support time from control", 0, list.supportFrom()); + gdi.addCheckbox("SupportTo", "Support time to control", 0, list.supportTo()); + gdi.dropLine(2); + gdi.popX(); + + gdi.fillDown(); + gdi.addString("", 1, "Filter"); + gdi.dropLine(0.5); + vector< pair > filters; + list.getFilters(filters); + gdi.fillRight(); + int xp = gdi.getCX(); + int yp = gdi.getCY(); + //const int w = gdi.scaleLength(130); + for (size_t k = 0; k < filters.size(); k++) { + gdi.addCheckbox(xp, yp, "filter" + itos(k), filters[k].first, 0, filters[k].second); + xp = gdi.getCX(); + maxX = max(maxX, xp); + if (k % 10 == 9) { + xp = x1 + margin; + gdi.setCX(xp); + yp += int(1.3 * gdi.getLineHeight()); + } + } + + gdi.popX(); + gdi.dropLine(2); + gdi.fillDown(); + gdi.addString("", 1, "Underfilter"); + gdi.dropLine(0.5); + vector< pair > subfilters; + list.getSubFilters(subfilters); + gdi.fillRight(); + xp = gdi.getCX(); + yp = gdi.getCY(); + for (size_t k = 0; k < subfilters.size(); k++) { + gdi.addCheckbox(xp, yp, "subfilter" + itos(k), subfilters[k].first, 0, subfilters[k].second); + if (subType == oListInfo::EBaseTypeNone) + gdi.disableInput(("subfilter" + itos(k)).c_str()); + //xp += w; + xp = gdi.getCX(); + maxX = max(maxX, xp); + if (k % 10 == 9) { + xp = x1 + margin; + gdi.setCX(xp); + yp += int(1.3 * gdi.getLineHeight()); + } + } + + gdi.popX(); + gdi.dropLine(2); + + gdi.fillDown(); + gdi.addString("", 1, "Typsnitt"); + gdi.dropLine(0.5); + gdi.fillRight(); + const char *expl[4] = {"Rubrik", "Underrubrik", "Lista", "Underlista"}; + vector< pair > fonts; + gdi.getEnumeratedFonts(fonts); + sort(fonts.begin(), fonts.end()); + + for (int k = 0; k < 4; k++) { + string id("Font" + itos(k)); + gdi.addCombo(id, 200, 300, 0, expl[k]); + gdi.addItem(id, fonts); + + gdi.setText(id, list.getFontFace(k)); + gdi.setCX(gdi.getCX()+20); + int f = list.getFontFaceFactor(k); + string ff = f == 0 ? "100 %" : itos(f) + " %"; + gdi.addInput("FontFactor" + itos(k), ff, 4, 0, "Skalfaktor", "Relativ skalfaktor för typsnittets storlek i procent"); + f = list.getExtraSpace(k); + gdi.addInput("ExtraSpace" + itos(k), itos(f), 4, 0, "Avstånd", "Extra avstånd ovanför textblock"); + if (k == 1) { + gdi.dropLine(3); + gdi.popX(); + } + } + + if (!newList) { + gdi.dropLine(0.8); + gdi.setCX(gdi.getCX()+20); + gdi.addButton("ApplyListProp", "OK", editListCB); + gdi.addButton("Cancel", "Avbryt", editListCB); + } + else { + gdi.setCX(x1); + gdi.setCY(gdi.getHeight()); + gdi.dropLine(); + gdi.addButton("ApplyListProp", "Skapa", editListCB); + gdi.addButton("CancelNew", "Avbryt", editListCB); + } + + gdi.dropLine(3); + int maxY = gdi.getCY(); + + gdi.fillDown(); + gdi.popX(); + gdi.setData("IsEditingList", 1); + + RECT rc; + rc.top = y1; + rc.left = x1; + rc.right = maxX + gdi.scaleLength(6); + rc.bottom = maxY; + + if (!newList) { + gdi.addRectangle(rc, colorLightBlue, true); + } + + gdi.scrollToBottom(); + gdi.refresh(); + gdi.setInputFocus("Name"); +} + +void ListEditor::makeDirty(gdioutput &gdi, DirtyFlag inside, DirtyFlag outside) { + if (inside == MakeDirty) + dirtyInt = true; + else if (inside == ClearDirty) + dirtyInt = false; + + if (outside == MakeDirty) + dirtyExt = true; + else if (outside == ClearDirty) + dirtyExt = false; + + if (gdi.hasField("SaveInside")) { + gdi.setInputStatus("SaveInside", dirtyInt || lastSaved != SavedInside); + } + + if (gdi.hasField("SaveFile")) { + gdi.setInputStatus("SaveFile", dirtyExt || lastSaved != SavedFile); + } +} + +bool ListEditor::checkSave(gdioutput &gdi) { + if (dirtyInt || dirtyExt) { + gdioutput::AskAnswer answer = gdi.askCancel("Vill du spara ändringar?"); + if (answer == gdioutput::AnswerCancel) + return false; + + if (answer == gdioutput::AnswerYes) { + if (currentIndex >= 0) + gdi.sendCtrlMessage("SaveInside"); + else if (gdi.sendCtrlMessage("SaveFile") == 0) + return false; + } + makeDirty(gdi, ClearDirty, ClearDirty); + } + + return true; +} + +void ListEditor::enableOpen(gdioutput &gdi) { + ListBoxInfo lbi; + bool enabled = true; + if (gdi.getSelectedItem("OpenList", lbi)) { + if (oe->getListContainer().isInternal(lbi.data)) + enabled = false; + } + + gdi.setInputStatus("DoOpen", enabled); +} + diff --git a/code/listeditor.h b/code/listeditor.h new file mode 100644 index 0000000..598f70a --- /dev/null +++ b/code/listeditor.h @@ -0,0 +1,82 @@ +#pragma once + +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +class MetaList; +class MetaListPost; +class MetaListContainer; +class gdioutput; +class BaseInfo; +class ButtonInfo; +class oEvent; +enum EPostType; +#include + +class ListEditor { +private: + enum SaveType {NotSaved, SavedInside, SavedFile}; + oEvent *oe; + MetaList *currentList; + void setCurrentList(MetaList *lst); + int currentIndex; + string savedFileName; + bool dirtyExt; + bool dirtyInt; + SaveType lastSaved; + const char *getIndexDescription(EPostType type); + + void showLine(gdioutput &gdi, const vector &line, int ix) const; + int editList(gdioutput &gdi, int type, BaseInfo &data); + ButtonInfo &addButton(gdioutput &gdi, const MetaListPost &mlp, int x, int y, + int lineIx, int ix) const; + + void editListPost(gdioutput &gdi, const MetaListPost &mlp, int id); + void editListProp(gdioutput &gdi, bool newList); + + enum DirtyFlag {MakeDirty, ClearDirty, NoTouch}; + + /// Check (and autosave) if there are unsaved changes in a dialog box + void checkUnsaved(gdioutput &gdi); + + /// Check and ask if there are changes to save + bool checkSave(gdioutput &gdi); + + // Enable or disable open button + void enableOpen(gdioutput &gdi); + + void makeDirty(gdioutput &gdi, DirtyFlag inside, DirtyFlag outside); +public: + ListEditor(oEvent *oe); + virtual ~ListEditor(); + + //void load(MetaList *list); + void load(const MetaListContainer &mlc, int index); + + void show(gdioutput &gdi); + + MetaList *getCurrentList() const {return currentList;}; + + + friend int editListCB(gdioutput*, int, void *); + +}; diff --git a/code/liveresult.cpp b/code/liveresult.cpp new file mode 100644 index 0000000..7da621d --- /dev/null +++ b/code/liveresult.cpp @@ -0,0 +1,435 @@ +/********************i**************************************************** + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" +#include "oEvent.h" +#include "gdioutput.h" +#include "meos_util.h" +#include +#include "Localizer.h" +#include +#include "gdifonts.h" +#include "meosexception.h" +#include "liveresult.h" + +LiveResult::LiveResult(oEvent *oe) : oe(oe), active(false), lastTime(0), rToWatch(0) { + baseFont = oe->getPropertyString("LiveResultFont", "Consolas"); + showResultList = -1; + timerScale = 1.0; +} + + +string LiveResult::getFont(const gdioutput &gdi, double relScale) const { + int h,w; + gdi.getTargetDimension(w, h); + if (!gdi.isFullScreen()) + w -= gdi.scaleLength(160); + + double fact = min(h/180.0, w/300.0); + + double size = relScale * fact; + char ss[32]; + sprintf_s(ss, "%f", size); + string font = baseFont + ";" + ss; + return font; +} + +void LiveResult::showDefaultView(gdioutput &gdi) { + int h,w; + gdi.getTargetDimension(w, h); + if (!gdi.isFullScreen()) + w -= gdi.scaleLength(160); + + RECT rc; + rc.top = h-24; + rc.left = 20; + rc.right = w - 30; + rc.bottom = h - 22; + + string font = getFont(gdi, 1.0); + gdi.addRectangle(rc, colorLightYellow, true); + gdi.addString("timing", 50, w / 2, textCenter|boldHuge, "MeOS Timing", 0, 0, font.c_str()); + + TextInfo &ti = gdi.addString("measure", 0, 0, boldHuge, "55:55:55", 0, 0, font.c_str()); + int tw = ti.textRect.right - ti.textRect.left; + timerScale = double(w) * 0.8 / double(tw); + gdi.removeString("measure"); +} + +void LiveResult::showTimer(gdioutput &gdi, const oListInfo &liIn) { + li = liIn; + active = true; + + int h,w; + gdi.getTargetDimension(w, h); + gdi.clearPage(false); + showDefaultView(gdi); + + gdi.registerEvent("DataUpdate", 0).setHandler(this); + gdi.setData("DataSync", 1); + gdi.setData("PunchSync", 1); + gdi.setRestorePoint("LiveResult"); + + lastTime = 0; + vector pp; + oe->synchronizeList(oLRunnerId, true, false); + oe->synchronizeList(oLPunchId, false, true); + + oe->getLatestPunches(lastTime, pp); + processedPunches.clear(); + + map, vector > > storedPunches; + int fromPunch = li.getParam().useControlIdResultFrom; + int toPunch = li.getParam().useControlIdResultTo; + if (fromPunch == 0) + fromPunch = oPunch::PunchStart; + if (toPunch == 0) + toPunch = oPunch::PunchFinish; + + for (size_t k = 0; k < pp.size(); k++) { + lastTime = max(pp[k]->getModificationTime(), lastTime); + pRunner r = pp[k]->getTiedRunner(); + if (r) { + pair key = make_pair(r->getId(), pp[k]->getControlId()); + processedPunches[key] = max(processedPunches[key], pp[k]->getAdjustedTime()); + + if (!li.getParam().selection.empty() && !li.getParam().selection.count(r->getClassId())) + continue; // Filter class + + if (pp[k]->getTypeCode() == fromPunch) { + storedPunches[r->getId()].first.push_back(k); + } + else if (pp[k]->getTypeCode() == toPunch) { + storedPunches[r->getId()].second.push_back(k); + } + } + } + startFinishTime.clear(); + results.clear(); + for (map, vector > >::iterator it = storedPunches.begin(); + it != storedPunches.end(); ++it) { + vector &froms = it->second.first; + vector &tos = it->second.second; + pRunner r = oe->getRunner(it->first, 0); + for (size_t j = 0; j < tos.size(); j++) { + int fin = pp[tos[j]]->getAdjustedTime(); + int time = 100000000; + int sta = 0; + for (size_t k = 0; k < froms.size(); k++) { + int t = fin - pp[froms[k]]->getAdjustedTime(); + if (t > 0 && t < time) { + time = t; + sta = pp[froms[k]]->getAdjustedTime(); + } + } + if (time < 100000000 && r->getStatus() <= StatusOK) { +// results.push_back(Result()); +// results.back().r = r; +// results.back().time = time; + startFinishTime[r->getId()].first = sta; + startFinishTime[r->getId()].second = fin; + + } + } + } + + resYPos = h/3; + + calculateResults(); + showResultList = 0; + gdi.addTimeoutMilli(1000, "res", 0).setHandler(this); + gdi.refreshFast(); +} + + +void LiveResult::handle(gdioutput &gdi, BaseInfo &bu, GuiEventType type) { + if (type == GUI_EVENT) { + vector pp; + oe->getLatestPunches(lastTime, pp); + + int fromPunch = li.getParam().useControlIdResultFrom; + int toPunch = li.getParam().useControlIdResultTo; + if (fromPunch == 0) + fromPunch = oPunch::PunchStart; + if (toPunch == 0) + toPunch = oPunch::PunchFinish; + + bool hasCheckedOld = false; + vector< pair > enter, exit, backExit; + + for (size_t k = 0; k < pp.size(); k++) { + lastTime = max(pp[k]->getModificationTime(), lastTime); + pRunner r = pp[k]->getTiedRunner(); + if (!r) + continue; + + if (!li.getParam().selection.empty() && !li.getParam().selection.count(r->getClassId())) + continue; // Filter class + + pair key = make_pair(r->getId(), pp[k]->getControlId()); + + bool accept = !processedPunches.count(key) || abs(processedPunches[key] - pp[k]->getAdjustedTime()) > 5; + + if (accept && !hasCheckedOld && pp[k]->getTypeCode() == fromPunch) { + hasCheckedOld = true; + while (rToWatch.size() > 1) { + watchedR.push_back(rToWatch.front()); + rToWatch.erase(rToWatch.begin()); // TODO: Better algorithm for forgetting? + } + } + + processedPunches[key] = pp[k]->getAdjustedTime(); + + if (accept) { + if (pp[k]->getTypeCode() == fromPunch) { + enter.push_back(make_pair(pp[k]->getAdjustedTime(), pp[k])); + } + else if (pp[k]->getTypeCode() == toPunch) { + if (count(rToWatch.begin(), rToWatch.end(), r->getId()) > 0) { + exit.push_back(make_pair(pp[k]->getAdjustedTime(), pp[k])); + } + else if (count(watchedR.begin(), watchedR.end(), r->getId()) > 0) { + backExit.push_back(make_pair(pp[k]->getAdjustedTime(), pp[k])); + } + } + } + } + + sort(enter.begin(), enter.end()); + sort(exit.begin(), exit.end()); + + int h,w; + gdi.getTargetDimension(w, h); + bool doRefresh = false; + + for (size_t k = 0; k < enter.size(); k++) { + showResultList = -1; + const oFreePunch *fp = enter[k].second; + pRunner newRToWatch = fp->getTiedRunner(); + + if (count(rToWatch.begin(), rToWatch.end(), newRToWatch->getId())) + continue; + + rToWatch.push_back(newRToWatch->getId()); + gdi.restore("LiveResult", false); + startFinishTime[newRToWatch->getId()].first = fp->getAdjustedTime(); + isDuel = false; + if (rToWatch.size() == 1) { + string font = getFont(gdi, timerScale); + BaseInfo *bi = gdi.setText("timing", newRToWatch->getName(), false); + dynamic_cast(*bi).changeFont(getFont(gdi, 0.7)); + gdi.addTimer(h/2, w/2, boldHuge|textCenter|timeWithTenth, 0, 0, 0, NOTIMEOUT, font.c_str()); + screenSize = 1; + } + else if (rToWatch.size() == 2) { + string font = getFont(gdi, timerScale * 0.6); + + pRunner r0 = oe->getRunner(rToWatch[0], 0); + pRunner r1 = oe->getRunner(rToWatch[1], 0); + + string n = (r0 ? r0->getName(): "-") + " / " + (r1 ? r1->getName() : "-"); + bool duel = r0 && r1 && fromPunch == oPunch::PunchStart && + r0->getTeam() != 0 && + r0->getTeam() == r1->getTeam(); + isDuel = duel; + if (n.length() < 30) { + BaseInfo *bi = gdi.setText("timing", n, false); + TextInfo &ti = dynamic_cast(*bi); + ti.changeFont(getFont(gdi, 0.5)); + } + else { + BaseInfo *bi = gdi.setText("timing", "", false); + TextInfo &ti = dynamic_cast(*bi); + string sfont = getFont(gdi, 0.5); + TextInfo &ti2 = gdi.addString("n1", ti.yp, gdi.scaleLength(20), boldHuge, + "#" + (r0 ? r0->getName() : string("")), 0, 0, sfont.c_str()); + gdi.addString("n2", ti.yp + ti2.getHeight() + 4, gdi.getWidth(), boldHuge | textRight, + "#" + (r1 ? r1->getName() : string("")), 0, 0, sfont.c_str()); + } + int id1 = rToWatch[0]; + int id2 = rToWatch[1]; + + int t1 = startFinishTime[id1].first; + int diff = abs(fp->getAdjustedTime() - t1); + runner2ScreenPos[id1] = 1; + runner2ScreenPos[id2] = 2; + screenSize = 2; + int startTimeR2 = 0; + if (duel) { + // Ensure same start time + int t2 = startFinishTime[id2].first; + int st = min(t1,t2); + startFinishTime[id1].first = st; + startFinishTime[id2].first = st; + + for (size_t i = 0; i < rToWatch.size(); i++) { + pRunner r = oe->getRunner(rToWatch[i], 0); + if (r) { + r->synchronize(); + r->setStartTime(st, true, false, true); + r->synchronize(false); + } + } + startTimeR2 = diff; + } + + gdi.addTimer(h/2, w/2-w/4, boldHuge|textCenter|timeWithTenth, diff, 0, 0, NOTIMEOUT, font.c_str()).id = "timer1"; + gdi.addTimer(h/2, w/2+w/4, boldHuge|textCenter|timeWithTenth, startTimeR2, 0, 0, NOTIMEOUT, font.c_str()).id = "timer2"; + } + + doRefresh = true; + } + + for (size_t k = 0; k < exit.size(); k++) { + const oFreePunch *fp = exit[k].second; + pRunner rToFinish = fp->getTiedRunner(); + + if (count(rToWatch.begin(), rToWatch.end(), rToFinish->getId()) > 0) { + showResultList = -1; + pair &se = startFinishTime[rToFinish->getId()]; + se.second = fp->getAdjustedTime(); + int rt = se.second - se.first; + size_t ix = find(rToWatch.begin(), rToWatch.end(), rToFinish->getId()) - rToWatch.begin(); + + if (screenSize == 1) { + gdi.restore("LiveResult", false); + string font = getFont(gdi, timerScale); + gdi.addString("", h/2, w/2, boldHuge|textCenter, formatTime(rt), 0, 0, font.c_str()).setColor(colorGreen); + gdi.addTimeout(5, 0).setHandler(this); + } + else if (screenSize == 2) { + string id = "timer" + itos(runner2ScreenPos[rToFinish->getId()]); + BaseInfo *bi = gdi.setText(id, formatTime(rt), false); + string font = getFont(gdi, timerScale * 0.6); + + if (bi) { + TextInfo &ti = dynamic_cast(*bi); + ti.format = boldHuge|textCenter; + ti.hasTimer = false; + + if (rToWatch.size() == 2 || !isDuel) + ti.setColor(colorGreen); + } + + if (rToWatch.size() == 1) { + gdi.addTimeout(5, 0).setHandler(this); + } + } + + rToWatch.erase(rToWatch.begin() + ix); + doRefresh = true; + } + } + + for (size_t k = 0; k < backExit.size(); k++) { + const oFreePunch *fp = backExit[k].second; + pRunner rToFinish = fp->getTiedRunner(); + if (count(watchedR.begin(), watchedR.end(), rToFinish->getId()) > 0) { + pair &se = startFinishTime[rToFinish->getId()]; + se.second = fp->getAdjustedTime(); + size_t ix = find(watchedR.begin(), watchedR.end(), rToFinish->getId()) - watchedR.begin(); + watchedR.erase(watchedR.begin() + ix); + } + } + + if (doRefresh) + gdi.refreshFast(); + } + else if (type == GUI_TIMEOUT) { + gdi.restore("LiveResult", false); + int h,w; + gdi.getTargetDimension(w, h); + gdi.fillDown(); + BaseInfo *bi = gdi.setTextTranslate("timing", "MeOS Timing", false); + TextInfo &ti = dynamic_cast(*bi); + ti.changeFont(getFont(gdi, 0.7)); + gdi.refreshFast(); + resYPos = ti.textRect.bottom + gdi.scaleLength(20); + calculateResults(); + showResultList = 0; + gdi.addTimeoutMilli(300, "res", 0).setHandler(this); + } + else if (type == GUI_TIMER) { + if (size_t(showResultList) >= results.size()) + return; + Result &res = results[showResultList]; + string font = getFont(gdi, 0.7); + int y = resYPos; + pRunner r = oe->getRunner(res.runnerId, 0); + if (!r) { + showResultList++; + gdi.addTimeoutMilli(10, "res" + itos(showResultList), 0).setHandler(this); + } + else if (res.place > 0) { + int h,w; + gdi.getTargetDimension(w, h); + + gdi.takeShownStringsSnapshot(); + TextInfo &ti = gdi.addStringUT(y, 30, fontLarge, itos(res.place) + ".", 0, 0, font.c_str()); + int ht = ti.textRect.bottom - ti.textRect.top; + gdi.addStringUT(y, 30 + ht * 2 , fontLarge, r->getName(), 0, 0, font.c_str()); + //int w = gdi.getWidth(); + gdi.addStringUT(y, w - 4 * ht, fontLarge, formatTime(res.time), 0, 0, font.c_str()); + gdi.refreshSmartFromSnapshot(false); + resYPos += int (ht * 1.1); + showResultList++; + + int limit = h - ht * 2; + //OutputDebugString(("w:" + itos(resYPos) + " " + itos(limit) + "\n").c_str()); + if ( resYPos < limit ) + gdi.addTimeoutMilli(300, "res" + itos(showResultList), 0).setHandler(this); + } + } +} + +void LiveResult::calculateResults() { + rToWatch.clear(); + results.clear(); + results.reserve(startFinishTime.size()); + const int highTime = 10000000; + for (map >::iterator it = startFinishTime.begin(); + it != startFinishTime.end(); ++it) { + pRunner r = oe->getRunner(it->first, 0); + if (!r) + continue; + results.push_back(Result()); + results.back().runnerId = it->first; + results.back().time = it->second.second - it->second.first; + if (results.back().time <= 0 || r->getStatus() > StatusOK) + results.back().time = highTime; + } + + sort(results.begin(), results.end()); + + int place = 1; + for (size_t k = 0; k< results.size(); k++) { + if (results[k].time < highTime) { + if (k>0 && results[k-1].time < results[k].time) + place = k + 1; + + results[k].place = place; + } + else { + results[k].place = 0; + } + } +} diff --git a/code/liveresult.h b/code/liveresult.h new file mode 100644 index 0000000..0baf095 --- /dev/null +++ b/code/liveresult.h @@ -0,0 +1,68 @@ +#pragma once +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ +#include "oListInfo.h" +#include "guihandler.h" + +class gdioutput; + +class LiveResult : public GuiHandler { + oEvent *oe; + oListInfo li; + bool active; + unsigned int lastTime; + map< pair, int > processedPunches; + vector rToWatch; + vector watchedR;// Backlog + + map runner2ScreenPos; + int screenSize; + bool isDuel; + + string baseFont; + void showDefaultView(gdioutput &gdi); + map > startFinishTime; + int showResultList; + int resYPos; + string getFont(const gdioutput &gdi, double relScale) const; + double timerScale; + struct Result { + int place; + int runnerId; + int time; + bool operator<(const Result &b) const { + return time < b.time; + } + }; + + vector< Result > results; + + void calculateResults(); + +public: + LiveResult(oEvent *oe); + ~LiveResult() {} + + void handle(gdioutput &gdi, BaseInfo &info, GuiEventType type); + + void showTimer(gdioutput &gdi, const oListInfo &li); +}; diff --git a/code/localizer.cpp b/code/localizer.cpp new file mode 100644 index 0000000..da1ecc7 --- /dev/null +++ b/code/localizer.cpp @@ -0,0 +1,460 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" +#include "localizer.h" +#include +#include +#include "meos_util.h" +#include "random.h" +#include "oFreeImport.h" + +class LocalizerImpl +{ + string language; + map table; + map unknown; + void loadTable(const vector &raw, const string &language); + mutable oWordList *givenNames; + +public: + + const oWordList &getGivenNames() const; + + void translateAll(const LocalizerImpl &all); + + const string &translate(const string &str, bool &found); + + void saveUnknown(const string &file); + void saveTable(const string &file); + void loadTable(const string &file, const string &language); + void loadTable(int resource, const string &language); + + void clear(); + LocalizerImpl(void); + ~LocalizerImpl(void); +}; + +Localizer::LocalizerInternal::LocalizerInternal(void) +{ + impl = new LocalizerImpl(); + implBase = 0; + owning = true; + user = 0; +} + +Localizer::LocalizerInternal::~LocalizerInternal(void) +{ + if (user) { + user->owning = true; + impl = 0; + implBase = 0; + } + else { + delete impl; + delete implBase; + } +} + +void Localizer::LocalizerInternal::set(Localizer &lio) { + Localizer::LocalizerInternal &li = *lio.linternal; + if (li.user || user) + throw std::exception("Runtime error"); + + if (owning) { + delete impl; + delete implBase; + } + + implBase = li.implBase; + impl = li.impl; + li.user = this; +} + +vector Localizer::LocalizerInternal::getLangResource() const { + vector v; + for (map::const_iterator it = langResource.begin(); it !=langResource.end(); ++it) + v.push_back(it->first); + + return v; +} + +const oWordList &Localizer::LocalizerInternal::getGivenNames() const { + return impl->getGivenNames(); +} + +LocalizerImpl::LocalizerImpl(void) +{ + givenNames = 0; +} + +LocalizerImpl::~LocalizerImpl(void) +{ + if (givenNames) + delete givenNames; +} + +const string &Localizer::LocalizerInternal::tl(const string &str) const { + bool found; + const string *ret = &impl->translate(str, found); + if (found || !implBase) + return *ret; + + ret = &implBase->translate(str, found); + return *ret; +} + +const string &LocalizerImpl::translate(const string &str, bool &found) +{ + found = false; + static int i = 0; + const int bsize = 17; + static string value[bsize]; + int len = str.length(); + + if (len==0) + return str; + + if (str[0]=='#') { + i = (i + 1)%bsize; + value[i] = str.substr(1); + found = true; + return value[i]; + } + + if (str[0]==',' || str[0]==' ' || str[0]=='.' + || str[0]==':' || str[0]==';' || str[0]=='<' || str[0]=='>' || str[0]=='-' || str[0]==0x96) { + unsigned k=1; + while(str[k] && (str[k]==' ' || str[k]=='.' || str[k]==':' || str[k]=='<' || str[k]=='>' + || str[k]=='-' || str[k]==0x96)) + k++; + + if (k::const_iterator it = table.find(str); + if (it != table.end()) { + found = true; + return it->second; + } + + int subst = str.find_first_of('#'); + if (subst != str.npos) { + string s = translate(str.substr(0, subst), found); + vector split_vec; + split(str.substr(subst+1), "#", split_vec); + split_vec.push_back(""); + const char *subsymb = "XYZW"; + size_t subpos = 0; + string ret; + size_t lastpos = 0; + for (size_t k = 0; k=split_vec.size() || subpos>=4) + break; + if (s[k] == subsymb[subpos]) { + if (k>0 && isalnum(s[k-1])) + continue; + if (k+1 < s.size() && isalnum(s[k+1])) + continue; + ret += s.substr(lastpos, k-lastpos); + ret += split_vec[subpos]; + lastpos = k+1; + subpos++; + } + } + if (lastpos1) + unknown[str] = ""; +#endif + found = false; + i = (i + 1)%bsize; + value[i] = str; + return value[i]; + } + + string suffix; + int pos = str.find_last_not_of(last); + + while(pos>0) { + char last = str[pos]; + if (last != ':' && last != ' ' && last != ',' && last != '.' && + last != ';' && last != '<' && last != '>' && last != '-' && last != 0x96) + break; + + pos = str.find_last_not_of(last, pos); + } + + suffix = str.substr(pos+1); + + string key = str.substr(0, str.length()-suffix.length()); + it = table.find(key); + if (it != table.end()) { + i = (i + 1)%bsize; + value[i] = it->second + suffix; + found = true; + return value[i]; + } +#ifdef _DEBUG + if (key.length() > 1) + unknown[key] = ""; +#endif + + found = false; + i = (i + 1)%bsize; + value[i] = str; + return value[i]; +} +const string newline = "\n"; + +void LocalizerImpl::saveUnknown(const string &file) +{ + if (!unknown.empty()) { + ofstream fout(file.c_str(), ios::trunc|ios::out); + for (map::iterator it = unknown.begin(); it!=unknown.end(); ++it) { + string value = it->second; + string key = it->first; + if (value.empty()) { + value = key; + + int nl = value.find(newline); + int n2 = value.find("."); + + if (nl!=string::npos || n2!=string::npos) { + while (nl!=string::npos) { + value.replace(nl, newline.length(), "\\n"); + nl = value.find(newline); + } + key = "help:" + itos(value.length()) + itos(value.find_first_of(".")); + } + } + fout << key << " = " << value << endl; + } + } +} + + +const oWordList &LocalizerImpl::getGivenNames() const { + if (givenNames == 0) { + char bf[260]; + getUserFile(bf, "given.mwd"); + givenNames = new oWordList(); + try { + givenNames->load(bf); + } catch(std::exception &) {} + } + return *givenNames; +} + +#ifndef MEOSDB + +void Localizer::LocalizerInternal::loadLangResource(const string &name) { + map::iterator it = langResource.find(name); + if (it == langResource.end()) + throw std::exception("Unknown language"); + + string &res = it->second; + + int i = atoi(res.c_str()); + if (i > 0) + impl->loadTable(i, name); + else + impl->loadTable(res, name); +} + +void Localizer::LocalizerInternal::addLangResource(const string &name, const string &resource) { + langResource[name] = resource; + if (implBase == 0) { + implBase = new LocalizerImpl(); + implBase->loadTable(atoi(resource.c_str()), name); + } +} + +void Localizer::LocalizerInternal::debugDump(const string &untranslated, const string &translated) const { + if (implBase) { + impl->translateAll(*implBase); + } + impl->saveUnknown(untranslated); + impl->saveTable(translated); +} + +void LocalizerImpl::translateAll(const LocalizerImpl &all) { + map::const_iterator it; + bool f; + for (it = all.table.begin(); it != all.table.end(); ++it) { + translate(it->first, f); + if (!f) { + unknown[it->first] = it->second; + } + } +} + +void LocalizerImpl::saveTable(const string &file) +{ + ofstream fout((language+"_"+file).c_str(), ios::trunc|ios::out); + for (map::iterator it = table.begin(); it!=table.end(); ++it) { + string value = it->second; + int nl = value.find(newline); + while (nl!=string::npos) { + value.replace(nl, newline.length(), "\\n"); + nl = value.find(newline); + } + fout << it->first << " = " << value << endl; + } +} + +void LocalizerImpl::loadTable(int id, const string &language) +{ + string sname = "#"+itos(id); + const char *name = sname.c_str(); + HRSRC hResInfo = FindResource(0, name, "#300"); + HGLOBAL hGlobal = LoadResource(0, hResInfo); + + if (hGlobal==0) + throw std::exception("Resource not found"); + + int size = SizeofResource(0, hResInfo); + + const char *lang_src = (char *)LockResource(hGlobal); + char *lang = new char[size]; + memcpy(lang, lang_src, size); + char *bf; + vector raw; + int pos = 0; + while (pos < size) { + bf = &lang[pos]; + while(pos0 && bf[0] != '#') + raw.push_back(bf); + pos++; + if (pos raw; + raw.reserve(line); + while (!fin.eof()) { + bf[0] = 0; + fin.getline(bf, 8*1024); + if (bf[0]!=0 && bf[0]!='#') + raw.push_back(bf); + } + + loadTable(raw, language); +} + + +void LocalizerImpl::loadTable(const vector &raw, const string &language) +{ + vector order(raw.size()); + for (size_t k = 0; klanguage = language; + for (size_t k=0;k0 && s[spos-1]==' ') + spos--; + + while (unsigned(epos). + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ +#include +#include +#include +#include + +class LocalizerImpl; +class oWordList; + +class Localizer { + class LocalizerInternal { + private: + map langResource; + LocalizerImpl *impl; + LocalizerImpl *implBase; + + bool owning; + LocalizerInternal *user; + + public: + + void debugDump(const string &untranslated, const string &translated) const; + + vector getLangResource() const; + void loadLangResource(const string &name); + void addLangResource(const string &name, const string &resource); + + /** Translate string */ + const string &tl(const string &str) const; + + void set(Localizer &li); + + /** Get database with given names */ + const oWordList &getGivenNames() const; + + LocalizerInternal(); + ~LocalizerInternal(); + }; +private: + LocalizerInternal *linternal; + +public: + bool capitalizeWords() const; + + LocalizerInternal &get() {return *linternal;} + const string &tl(const string &str) const {return linternal->tl(str);}; + + void init() {linternal = new LocalizerInternal();} + void unload() {delete linternal; linternal = 0;} + + Localizer() : linternal(0) {} + ~Localizer() {unload();} +}; + +extern Localizer lang; diff --git a/code/meos.cpp b/code/meos.cpp new file mode 100644 index 0000000..aab0ff4 --- /dev/null +++ b/code/meos.cpp @@ -0,0 +1,1745 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +// meos.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" +#include "resource.h" +#include + +#include "oEvent.h" +#include "xmlparser.h" +#include "recorder.h" + +#include "gdioutput.h" +#include "commctrl.h" +#include "SportIdent.h" +#include "TabBase.h" +#include "TabCompetition.h" +#include "TabAuto.h" +#include "TabClass.h" +#include "TabCourse.h" +#include "TabControl.h" +#include "TabSI.h" +#include "TabList.h" +#include "TabTeam.h" +#include "TabSpeaker.h" +#include "TabMulti.h" +#include "TabRunner.h" +#include "TabClub.h" +#include "progress.h" +#include "inthashmap.h" +#include +#include "localizer.h" +#include "intkeymap.hpp" +#include "intkeymapimpl.hpp" +#include "download.h" +#include "meos_util.h" +#include +#include "random.h" +#include "metalist.h" +#include "gdiconstants.h" +#include "socket.h" +#include "autotask.h" +#include "meosexception.h" +#include "parser.h" + +gdioutput *gdi_main=0; +oEvent *gEvent=0; +SportIdent *gSI=0; +Localizer lang; +AutoTask *autoTask = 0; +#ifdef _DEBUG + bool enableTests = true; +#else + bool enableTests = false; +#endif + +vector gdi_extra; +void initMySQLCriticalSection(bool init); + +HWND hWndMain; +HWND hWndWorkspace; + +#define MAX_LOADSTRING 100 + +#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") + +void removeTempFiles(); +void Setup(bool overwrite, bool overwriteAll); + +// Global Variables: +HINSTANCE hInst; // current instance +CHAR szTitle[MAX_LOADSTRING]; // The title bar text +TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text +TCHAR szWorkSpaceClass[MAX_LOADSTRING]; // The title bar text + +// Foward declarations of functions included in this code module: +ATOM MyRegisterClass(HINSTANCE hInstance); +BOOL InitInstance(HINSTANCE, int); +LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); +LRESULT CALLBACK WorkSpaceWndProc(HWND, UINT, WPARAM, LPARAM); +LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); +LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam); +void registerToolbar(HINSTANCE hInstance); +extern const char *szToolClass; + +HHOOK g_hhk; //- handle to the hook procedure. + +HWND hMainTab=NULL; + +list *tabList=0; +void scrollVertical(gdioutput *gdi, int yInc, HWND hWnd); +static int currentFocusIx = 0; + +void resetSaveTimer() { + if (autoTask) + autoTask->resetSaveTimer(); +} + +void LoadPage(const string &name) +{ + list::iterator it; + + for (it=tabList->begin(); it!=tabList->end(); ++it) { + if (it->name==name) + it->loadPage(*gdi_main); + } +} + +void LoadClassPage(gdioutput &gdi) +{ + LoadPage("Klasser"); +} + +void dumpLeaks() { + _CrtDumpMemoryLeaks(); +} + +void LoadPage(gdioutput &gdi, TabType type) { + gdi.setWaitCursor(true); + TabBase *t = gdi.getTabs().get(type); + if (t) + t->loadPage(gdi); + gdi.setWaitCursor(false); +} + +// Path to settings file +static char settings[260]; +// Startup path +static char programPath[MAX_PATH]; + +void mainMessageLoop(HACCEL hAccelTable, DWORD time) { + MSG msg; + BOOL bRet; + + if (time > 0) { + time += GetTickCount(); + } + // Main message loop: + while ( (bRet = GetMessage(&msg, NULL, 0, 0)) != 0 ) { + if (bRet == -1) + return; + + if (hAccelTable == 0 || !TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + if (time != 0) { + if (GetTickCount() > time) + return; + } + } +} + +int APIENTRY WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nCmdShow) +{ + atexit(dumpLeaks); // + _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); + + if (strstr(lpCmdLine, "-s") != 0) { + Setup(true, false); + exit(0); + } + else if (strstr(lpCmdLine, "-test") != 0) { + enableTests = true; + } + + + for (int k = 0; k < 100; k++) { + RunnerStatusOrderMap[k] = 0; + } + RunnerStatusOrderMap[StatusOK] = 0; + RunnerStatusOrderMap[StatusMAX] = 1; + RunnerStatusOrderMap[StatusMP] = 2; + RunnerStatusOrderMap[StatusDNF] = 3; + RunnerStatusOrderMap[StatusDQ] = 4; + RunnerStatusOrderMap[StatusDNS] = 5; + RunnerStatusOrderMap[StatusUnknown] = 6; + RunnerStatusOrderMap[StatusNotCompetiting] = 7; + + lang.init(); + StringCache::getInstance().init(); + + GetCurrentDirectory(MAX_PATH, programPath); + + getUserFile(settings, "meospref.xml"); + + Parser::test(); + + int rInit = (GetTickCount() / 100); + InitRanom(rInit, rInit/379); + + tabList=new list; + + HACCEL hAccelTable; + + gdi_main = new gdioutput("main", 1.0, ANSI); + gdi_extra.push_back(gdi_main); + + try { + gEvent = new oEvent(*gdi_main); + } + catch (std::exception &ex) { + gdi_main->alert(string("Failed to create base event: ") + ex.what()); + return 0; + } + + gEvent->loadProperties(settings); + + lang.get().addLangResource("English", "104"); + lang.get().addLangResource("Svenska", "103"); + lang.get().addLangResource("Deutsch", "105"); + lang.get().addLangResource("Dansk", "106"); + lang.get().addLangResource("Français", "110"); + lang.get().addLangResource("Russian (ISO 8859-5)", "107"); + lang.get().addLangResource("English (ISO 8859-2)", "108"); + lang.get().addLangResource("English (ISO 8859-8)", "109"); + + if (fileExist("extra.lng")) { + lang.get().addLangResource("Extraspråk", "extra.lng"); + } + else { + char lpath[260]; + getUserFile(lpath, "extra.lng"); + if (fileExist(lpath)) + lang.get().addLangResource("Extraspråk", lpath); + } + + string defLang = gEvent->getPropertyString("Language", "Svenska"); + + // Backward compatibility + if (defLang=="103") + defLang = "Svenska"; + else if (defLang=="104") + defLang = "English"; + + gEvent->setProperty("Language", defLang); + + try { + lang.get().loadLangResource(defLang); + } + catch (std::exception &) { + lang.get().loadLangResource("Svenska"); + } + + try { + char listpath[MAX_PATH]; + getUserFile(listpath, ""); + vector res; + expandDirectory(listpath, "*.lxml", res); + expandDirectory(listpath, "*.listdef", res); +# +#ifdef _DEBUG + expandDirectory(".\\Lists\\", "*.lxml", res); + expandDirectory(".\\Lists\\", "*.listdef", res); +#endif + string err; + + for (size_t k = 0; kgetListContainer().load(MetaListContainer::InternalList, xlist, true); + } + catch (std::exception &ex) { + string errLoc = "Kunde inte ladda X\n\n(Y)#" + string(listpath) + "#" + lang.tl(ex.what()); + if (err.empty()) + err = lang.tl(errLoc); + else + err += "\n" + lang.tl(errLoc); + } + } + if (!err.empty()) + gdi_main->alert(err); + } + catch (std::exception &ex) { + gdi_main->alert(ex.what()); + //exit(1); + } + + gEvent->openRunnerDatabase("database"); + strcpy_s(szTitle, "MeOS"); + strcpy_s(szWindowClass, "MeosMainClass"); + strcpy_s(szWorkSpaceClass, "MeosWorkSpace"); + MyRegisterClass(hInstance); + registerToolbar(hInstance); + + string encoding = lang.tl("encoding"); + gdi_main->setFont(gEvent->getPropertyInt("TextSize", 0), + gEvent->getPropertyString("TextFont", "Arial"), interpetEncoding(encoding)); + + // Perform application initialization: + if (!InitInstance (hInstance, nCmdShow)) { + return FALSE; + } + + RECT rc; + GetClientRect(hWndMain, &rc); + SendMessage(hWndMain, WM_SIZE, 0, MAKELONG(rc.right, rc.bottom)); + + gdi_main->init(hWndWorkspace, hWndMain, hMainTab); + gdi_main->getTabs().get(TCmpTab)->loadPage(*gdi_main); + + autoTask = new AutoTask(hWndMain, *gEvent, *gdi_main); + + autoTask->setTimers(); + + // Install a hook procedure to monitor the message stream for mouse + // messages intended for the controls in the dialog box. + g_hhk = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, + (HINSTANCE) NULL, GetCurrentThreadId()); + + hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_MEOS); + + initMySQLCriticalSection(true); + // Main message loop: + mainMessageLoop(hAccelTable, 0); + /*while (GetMessage(&msg, NULL, 0, 0)) { + if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + */ + tabAutoRegister(0); + tabList->clear(); + delete tabList; + tabList=0; + + delete autoTask; + autoTask = 0; + + for (size_t k = 0; kgetHWND()); + if (k < gdi_extra.size()) { + delete gdi_extra[k]; + gdi_extra[k] = 0; + } + } + } + + gdi_extra.clear(); + + if (gEvent) + gEvent->saveProperties(settings); + + delete gEvent; + gEvent = 0; + + initMySQLCriticalSection(false); + + removeTempFiles(); + + #ifdef _DEBUG + lang.get().debugDump("untranslated.txt", "translated.txt"); + #endif + + StringCache::getInstance().clear(); + lang.unload(); + + return 0; +} + + + +// +// FUNCTION: MyRegisterClass() +// +// PURPOSE: Registers the window class. +// +// COMMENTS: +// +// This function and its usage is only necessary if you want this code +// to be compatible with Win32 systems prior to the 'RegisterClassEx' +// function that was added to Windows 95. It is important to call this function +// so that the application will get 'well formed' small icons associated +// with it. +// +ATOM MyRegisterClass(HINSTANCE hInstance) +{ + WNDCLASSEX wcex; + + wcex.cbSize = sizeof(WNDCLASSEX); + wcex.style = CS_HREDRAW | CS_VREDRAW; + wcex.lpfnWndProc = (WNDPROC)WndProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = hInstance; + wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_MEOS); + wcex.hCursor = LoadCursor(NULL, IDC_ARROW); + wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); + wcex.lpszMenuName = 0;//(LPCSTR)IDC_MEOS; + wcex.lpszClassName = szWindowClass; + wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); + + RegisterClassEx(&wcex); + + wcex.cbSize = sizeof(WNDCLASSEX); + wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; + wcex.lpfnWndProc = (WNDPROC)WorkSpaceWndProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = hInstance; + wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_MEOS); + wcex.hCursor = LoadCursor(NULL, IDC_ARROW); + wcex.hbrBackground = 0; + wcex.lpszMenuName = 0; + wcex.lpszClassName = szWorkSpaceClass; + wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); + RegisterClassEx(&wcex); + + return true; +} + + +// GetMsgProc - monitors the message stream for mouse messages intended +// for a control window in the dialog box. +// Returns a message-dependent value. +// nCode - hook code. +// wParam - message flag (not used). +// lParam - address of an MSG structure. +LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) +{ + MSG *lpmsg; + + lpmsg = (MSG *) lParam; + if (nCode < 0 || !(IsChild(hWndWorkspace, lpmsg->hwnd))) + return (CallNextHookEx(g_hhk, nCode, wParam, lParam)); + + switch (lpmsg->message) { + case WM_MOUSEMOVE: + case WM_LBUTTONDOWN: + case WM_LBUTTONUP: + case WM_RBUTTONDOWN: + case WM_RBUTTONUP: + if (gdi_main->getToolTip() != NULL) { + MSG msg; + + msg.lParam = lpmsg->lParam; + msg.wParam = lpmsg->wParam; + msg.message = lpmsg->message; + msg.hwnd = lpmsg->hwnd; + SendMessage(gdi_main->getToolTip(), TTM_RELAYEVENT, 0, + (LPARAM) (LPMSG) &msg); + } + break; + default: + break; + } + return (CallNextHookEx(g_hhk, nCode, wParam, lParam)); +} + +void flushEvent(const string &id, const string &origin, DWORD data, int extraData) +{ + for (size_t k = 0; kmakeEvent(id, origin, data, extraData, false); + } + } +} + +LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) +{ + if (code<0) + return CallNextHookEx(0, code, wParam, lParam); + + gdioutput *gdi = 0; + + if (size_t(currentFocusIx) < gdi_extra.size()) + gdi = gdi_extra[currentFocusIx]; + + if (!gdi) + gdi = gdi_main; + + + HWND hWnd = gdi ? gdi->getHWND() : 0; + + bool ctrlPressed = (GetKeyState(VK_CONTROL) & 0x8000) == 0x8000; + bool shiftPressed = (GetKeyState(VK_SHIFT) & 0x8000) == 0x8000; + + //if (code<0) return CallNextHookEx( + if (wParam==VK_TAB) { + if ( (lParam& (1<<31))) { + SHORT state=GetKeyState(VK_SHIFT); + if (gdi) { + if (state&(1<<16)) + gdi->TabFocus(-1); + else + gdi->TabFocus(1); + } + } + return 1; + } + else if (wParam==VK_RETURN && (lParam & (1<<31))) { + if (gdi) + gdi->Enter(); + } + else if (wParam==VK_UP) { + bool c = false; + if (gdi && (lParam & (1<<31))) + c = gdi->UpDown(1); + + if (!c && !(lParam & (1<<31)) && !(gdi && gdi->lockUpDown)) + SendMessage(hWnd, WM_VSCROLL, MAKELONG(SB_LINEUP, 0), 0); + } + else if (wParam == VK_NEXT && !(lParam & (1<<31)) && !(gdi && gdi->lockUpDown)) { + SendMessage(hWnd, WM_VSCROLL, MAKELONG(SB_PAGEDOWN, 0), 0); + } + else if (wParam == VK_PRIOR && !(lParam & (1<<31)) && !(gdi && gdi->lockUpDown)) { + SendMessage(hWnd, WM_VSCROLL, MAKELONG(SB_PAGEUP, 0), 0); + } + else if (wParam==VK_DOWN) { + bool c = false; + if (gdi && (lParam & (1<<31))) + c = gdi->UpDown(-1); + + if (!c && !(lParam & (1<<31)) && !(gdi && gdi->lockUpDown)) + SendMessage(hWnd, WM_VSCROLL, MAKELONG(SB_LINEDOWN, 0), 0); + } + else if (wParam==VK_LEFT && !(lParam & (1<<31))) { + if (!gdi || !gdi->hasEditControl()) + SendMessage(hWnd, WM_HSCROLL, MAKELONG(SB_LINEUP, 0), 0); + } + else if (wParam==VK_RIGHT && !(lParam & (1<<31))) { + if (!gdi || !gdi->hasEditControl()) + SendMessage(hWnd, WM_HSCROLL, MAKELONG(SB_LINEDOWN, 0), 0); + } + else if (wParam==VK_ESCAPE && (lParam & (1<<31))) { + if (gdi) + gdi->Escape(); + } + else if (wParam==VK_F2) { + ProgressWindow pw(hWnd); + + pw.init(); + for (int k=0;k<=20;k++) { + pw.setProgress(k*50); + Sleep(100); + } + //pw.draw(); + } + else if (ctrlPressed && (wParam == VK_ADD || wParam == VK_SUBTRACT || + wParam == VK_F5 || wParam == VK_F6)) { + if (gdi) { + if (wParam == VK_ADD || wParam == VK_F5) + gdi->scaleSize(1.1); + else + gdi->scaleSize(1.0/1.1); + } + } + else if (wParam == 'C' && ctrlPressed) { + if (gdi) + gdi->keyCommand(KC_COPY); + } + else if (wParam == 'V' && ctrlPressed) { + if (gdi) + gdi->keyCommand(KC_PASTE); + } + else if (wParam == 'F' && ctrlPressed) { + if (gdi) { + if (!shiftPressed) + gdi->keyCommand(KC_FIND); + else + gdi->keyCommand(KC_FINDBACK); + } + } + else if (wParam == VK_DELETE) { + if (gdi) + gdi->keyCommand(KC_DELETE); + } + else if (wParam == 'I' && ctrlPressed) { + if (gdi) + gdi->keyCommand(KC_INSERT); + } + else if (wParam == 'P' && ctrlPressed) { + if (gdi) + gdi->keyCommand(KC_PRINT); + } + else if (wParam == VK_F5 && !ctrlPressed) { + if (gdi) + gdi->keyCommand(KC_REFRESH); + } + else if (wParam == 'M' && ctrlPressed) { + if (gdi) + gdi->keyCommand(KC_SPEEDUP); + } + else if (wParam == 'N' && ctrlPressed) { + if (gdi) + gdi->keyCommand(KC_SLOWDOWN); + } + else if (wParam == ' ' && ctrlPressed) { + if (gdi) + gdi->keyCommand(KC_AUTOCOMPLETE); + } + + return 0; +} +// +// FUNCTION: InitInstance(HANDLE, int) +// +// PURPOSE: Saves instance handle and creates main window +// +// COMMENTS: +// +// In this function, we save the instance handle in a global variable and +// create and display the main program window. +// +BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) +{ + HWND hWnd; + + hInst = hInstance; // Store instance handle in our global variable + //WS_EX_CONTROLPARENT + HWND hDskTop=GetDesktopWindow(); + RECT rc; + GetClientRect(hDskTop, &rc); + + int xp = gEvent->getPropertyInt("xpos", 50); + int yp = gEvent->getPropertyInt("ypos", 20); + + int xs = gEvent->getPropertyInt("xsize", max(850, min(int(rc.right)-yp, 1124))); + int ys = gEvent->getPropertyInt("ysize", max(650, min(int(rc.bottom)-yp-40, 800))); + + gEvent->setProperty("ypos", yp + 16); + gEvent->setProperty("xpos", xp + 32); + gEvent->saveProperties(settings); // For other instance starting while running + gEvent->setProperty("ypos", yp); + gEvent->setProperty("xpos", xp); + + hWnd = CreateWindowEx(0, szWindowClass, szTitle, + WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, + xp, yp, max(min(int(rc.right)-yp, xs), 200), + max(min(int(rc.bottom)-yp-40, ys), 100), + NULL, NULL, hInstance, NULL); + + if (!hWnd) + return FALSE; + + hWndMain = hWnd; + + SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, 0, GetCurrentThreadId()); + ShowWindow(hWnd, nCmdShow); + UpdateWindow(hWnd); + + hWnd = CreateWindowEx(0, szWorkSpaceClass, "WorkSpace", WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, + 50, 200, 200, 100, hWndMain, NULL, hInstance, NULL); + + if (!hWnd) + return FALSE; + + hWndWorkspace=hWnd; + ShowWindow(hWnd, nCmdShow); + UpdateWindow(hWnd); + + return TRUE; +} + +void destroyExtraWindows() { + for (size_t k = 1; kgetHWND()); + } + } +} + +string uniqueTag(const char *base) { + int j = 0; + string b = base; + while(true) { + string tag = b + itos(j++); + if (getExtraWindow(tag, false) == 0) + return tag; + } +} + +gdioutput *getExtraWindow(const string &tag, bool toForeGround) { + for (size_t k = 0; khasTag(tag)) { + if (toForeGround) + SetForegroundWindow(gdi_extra[k]->getHWND()); + return gdi_extra[k]; + } + } + return 0; +} + +gdioutput *createExtraWindow(const string &tag, const string &title, int max_x, int max_y) { + if (getExtraWindow(tag, false) != 0) + throw meosException("Window already exists"); + + HWND hWnd; + + + HWND hDskTop=GetDesktopWindow(); + RECT rc; + GetClientRect(hDskTop, &rc); + + int xp = gEvent->getPropertyInt("xpos", 50) + 16; + int yp = gEvent->getPropertyInt("ypos", 20) + 32; + + for (size_t k = 0; kgetHWND(); + RECT rc; + if (GetWindowRect(hWnd, &rc)) { + xp = max(rc.left + 16, xp); + yp = max(rc.top + 32, yp); + } + } + } + + int xs = gEvent->getPropertyInt("xsize", max(850, min(int(rc.right)-yp, 1124))); + int ys = gEvent->getPropertyInt("ysize", max(650, min(int(rc.bottom)-yp-40, 800))); + + if (max_x>0) + xs = min(max_x, xs); + if (max_y>0) + ys = min(max_y, ys); + + hWnd = CreateWindowEx(0, szWorkSpaceClass, title.c_str(), + WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, + xp, yp, max(xs, 200), max(ys, 100), 0, NULL, hInst, NULL); + + if (!hWnd) + return 0; + + ShowWindow(hWnd, SW_SHOWNORMAL); + UpdateWindow(hWnd); + gdioutput *gdi = new gdioutput(tag, 1.0, gdi_main->getEncoding()); + gdi->setFont(gEvent->getPropertyInt("TextSize", 0), + gEvent->getPropertyString("TextFont", "Arial"), gdi_main->getEncoding()); + + gdi->init(hWnd, hWnd, 0); + gdi->isTestMode = gdi_main->isTestMode; + if (gdi->isTestMode) { + if (!gdi_main->cmdAnswers.empty()) { + gdi->dbPushDialogAnswer(gdi_main->cmdAnswers.front()); + gdi_main->cmdAnswers.pop_front(); + } + } + SetWindowLong(hWnd, GWL_USERDATA, gdi_extra.size()); + currentFocusIx = gdi_extra.size(); + gdi_extra.push_back(gdi); + + return gdi; +} + +/** Returns the tag of the last extra window. */ +const string &getLastExtraWindow() { + if (gdi_extra.empty()) + throw meosException("Empty"); + else + return gdi_extra.back()->getTag(); +} +// +// FUNCTION: WndProc(HWND, unsigned, WORD, LONG) +// +// PURPOSE: Processes messages for the main window. +// +// WM_COMMAND - process the application menu +// WM_PAINT - Paint the main window +// WM_DESTROY - post a quit message and return +// +// +/* +void CallBack(gdioutput *gdi, int type, void *data) +{ + ButtonInfo bi=*(ButtonInfo* )data; + + string t=gdi->getText("input"); + gdi->ClearPage(); + + gdi->addButton(bi.text+" *"+t, bi.xp+5, bi.yp+30, "", CallBack); +} + +void CallBackLB(gdioutput *gdi, int type, void *data) +{ + ListBoxInfo lbi=*(ListBoxInfo* )data; + + gdi->setText("input", lbi.text); +} + +void CallBackINPUT(gdioutput *gdi, int type, void *data) +{ + InputInfo lbi=*(InputInfo* )data; + + MessageBox(NULL, "MB_OK", 0, MB_OK); + //gdi->setText("input", lbi.text); +}*/ + +void InsertSICard(gdioutput &gdi, SICard &sic); + +#define TabCtrl_InsertItemW(hwnd, iItem, pitem) \ + (int)SNDMSG((hwnd), TCM_INSERTITEMW, (WPARAM)(int)(iItem), (LPARAM)(const TC_ITEM *)(pitem)) + +//static int xPos=0, yPos=0; +void createTabs(bool force, bool onlyMain, bool skipTeam, bool skipSpeaker, + bool skipEconomy, bool skipLists, bool skipRunners, bool skipControls) +{ + static bool onlyMainP = false; + static bool skipTeamP = false; + static bool skipSpeakerP = false; + static bool skipEconomyP = false; + static bool skipListsP = false; + static bool skipRunnersP = false; + static bool skipControlsP = false; + + if (!force && onlyMain==onlyMainP && skipTeam==skipTeamP && skipSpeaker==skipSpeakerP && + skipEconomy==skipEconomyP && skipLists==skipListsP && + skipRunners==skipRunnersP && skipControls==skipControlsP) + return; + + onlyMainP = onlyMain; + skipTeamP = skipTeam; + skipSpeakerP = skipSpeaker; + skipEconomyP = skipEconomy; + skipListsP = skipLists; + skipRunnersP = skipRunners; + skipControlsP = skipControls; + + int oldid=TabCtrl_GetCurSel(hMainTab); + TabObject *to = 0; + for (list::iterator it=tabList->begin();it!=tabList->end();++it) { + if (it->id==oldid) { + to = &*it; + } + } + + SendMessage(hMainTab, WM_SETFONT, (WPARAM) GetStockObject(DEFAULT_GUI_FONT), 0); + int id=0; + TabCtrl_DeleteAllItems(hMainTab); + for (list::iterator it=tabList->begin();it!=tabList->end();++it) { + it->setId(-1); + + if (onlyMain && it->getType() != typeid(TabCompetition) && it->getType() != typeid(TabSI)) + continue; + + if (skipTeam && it->getType() == typeid(TabTeam)) + continue; + + if (skipSpeaker && it->getType() == typeid(TabSpeaker)) + continue; + + if (skipEconomy && it->getType() == typeid(TabClub)) + continue; + + if (skipRunners && it->getType() == typeid(TabRunner)) + continue; + + if (skipControls && it->getType() == typeid(TabControl)) + continue; + + if (skipLists && (it->getType() == typeid(TabList) || it->getType() == typeid(TabAuto))) + continue; + + TCITEMW ti; + //char bf[256]; + //strcpy_s(bf, lang.tl(it->name).c_str()); + ti.pszText=(LPWSTR)gdi_main->toWide(lang.tl(it->name)).c_str(); + ti.mask=TCIF_TEXT; + it->setId(id++); + + TabCtrl_InsertItemW(hMainTab, it->id, &ti); + } + + if (to && (to->id)>=0) + TabCtrl_SetCurSel(hMainTab, to->id); +} + +void hideTabs() +{ + TabCtrl_DeleteAllItems(hMainTab); +} + + +LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + int wmId, wmEvent; + PAINTSTRUCT ps; + HDC hdc; + + switch (message) + { + case WM_CREATE: + + tabList->push_back(TabObject(gdi_main->getTabs().get(TCmpTab), "Tävling")); + tabList->push_back(TabObject(gdi_main->getTabs().get(TRunnerTab), "Deltagare")); + tabList->push_back(TabObject(gdi_main->getTabs().get(TTeamTab), "Lag(flera)")); + tabList->push_back(TabObject(gdi_main->getTabs().get(TListTab), "Listor")); + { + TabAuto *ta = (TabAuto *)gdi_main->getTabs().get(TAutoTab); + tabList->push_back(TabObject(ta, "Automater")); + tabAutoRegister(ta); + } + tabList->push_back(TabObject(gdi_main->getTabs().get(TSpeakerTab), "Speaker")); + tabList->push_back(TabObject(gdi_main->getTabs().get(TClassTab), "Klasser")); + tabList->push_back(TabObject(gdi_main->getTabs().get(TCourseTab), "Banor")); + tabList->push_back(TabObject(gdi_main->getTabs().get(TControlTab), "Kontroller")); + tabList->push_back(TabObject(gdi_main->getTabs().get(TClubTab), "Klubbar")); + + tabList->push_back(TabObject(gdi_main->getTabs().get(TSITab), "SportIdent")); + + INITCOMMONCONTROLSEX ic; + + ic.dwSize=sizeof(ic); + ic.dwICC=ICC_TAB_CLASSES ; + InitCommonControlsEx(&ic); + hMainTab=CreateWindowEx(0, WC_TABCONTROL, "tabs", WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS, 0, 0, 300, 20, hWnd, 0, hInst, 0); + createTabs(true, true, false, false, false, false, false, false); + + SetTimer(hWnd, 4, 10000, 0); //Connection check + break; + + case WM_MOUSEWHEEL: { + int dz = GET_WHEEL_DELTA_WPARAM(wParam); + scrollVertical(gdi_main, -dz, hWndWorkspace); + } + break; + + case WM_SIZE: + MoveWindow(hMainTab, 0,0, LOWORD(lParam), 30, 1); + MoveWindow(hWndWorkspace, 0, 30, LOWORD(lParam), HIWORD(lParam)-30, 1); + + RECT rc; + GetClientRect(hWndWorkspace, &rc); + PostMessage(hWndWorkspace, WM_SIZE, wParam, MAKELONG(rc.right, rc.bottom)); + break; + + case WM_WINDOWPOSCHANGED: + if (gEvent) { + LPWINDOWPOS wp = (LPWINDOWPOS) lParam; // points to size and position data + + if (wp->x>=0 && wp->y>=0 && wp->cx>300 && wp->cy>200) { + gEvent->setProperty("xpos", wp->x); + gEvent->setProperty("ypos", wp->y); + gEvent->setProperty("xsize", wp->cx); + gEvent->setProperty("ysize", wp->cy); + } + else { + Sleep(0); + } + } + return DefWindowProc(hWnd, message, wParam, lParam); + case WM_TIMER: + + if (!gdi_main) return 0; + + if (wParam==1) { + if (autoTask) + autoTask->autoSave(); + } + else if (wParam==2) { + // Interface timeouts (no synch) + if (autoTask) + autoTask->interfaceTimeout(gdi_extra); + } + else if (wParam==3) { + if (autoTask) + autoTask->synchronize(gdi_extra); + } + else if (wParam==4) { + // Verify database link + if (gEvent) + gEvent->verifyConnection(); + //OutputDebugString("Verify link\n"); + //Sleep(0); + if (gdi_main) { + if (gEvent->hasClientChanged()) { + gdi_main->makeEvent("Connections", "verify_connection", 0, 0, false); + gEvent->validateClients(); + } + } + } + break; + + case WM_ACTIVATE: + if (LOWORD(wParam) != WA_INACTIVE) + currentFocusIx = 0; + return DefWindowProc(hWnd, message, wParam, lParam); + + case WM_NCACTIVATE: + if (gdi_main && gdi_main->hasToolbar()) + gdi_main->activateToolbar(wParam != 0); + return DefWindowProc(hWnd, message, wParam, lParam); + + case WM_NOTIFY: + { + LPNMHDR pnmh = (LPNMHDR) lParam; + + if (pnmh->hwndFrom==hMainTab && gdi_main && gEvent) + { + if (pnmh->code==TCN_SELCHANGE) + { + int id=TabCtrl_GetCurSel(hMainTab); + + for (list::iterator it=tabList->begin();it!=tabList->end();++it) { + if (it->id==id) { + try { + gdi_main->setWaitCursor(true); + string cmd = "showTab("+ string(it->getTab().getTypeStr()) + "); //" + it->name; + it->loadPage(*gdi_main); + gdi_main->getRecorder().record(cmd); + } + catch(std::exception &ex) { + gdi_main->alert(ex.what()); + } + gdi_main->setWaitCursor(false); + } + } + } + else if (pnmh->code==TCN_SELCHANGING) { + if (gdi_main == 0) { + MessageBeep(-1); + return true; + } + else { + if (!gdi_main->canClear()) + return true; + + return false; + } + } + } + break; + } + + case WM_USER: + //The card has been read and posted to a synchronized + //queue by different thread. Read and process this card. + { + SICard sic; + while (gSI && gSI->GetCard(sic)) + InsertSICard(*gdi_main, sic); + break; + } + case WM_USER+1: + MessageBox(hWnd, "Kommunikationen med en SI-enhet avbröts.", "SportIdent", MB_OK); + break; + + case WM_USER + 3: + //OutputDebugString("Get punch from queue\n"); + if (autoTask) + autoTask->advancePunchInformation(gdi_extra); + break; + + case WM_USER + 4: + if (autoTask) + autoTask->synchronize(gdi_extra); + break; + case WM_COMMAND: + wmId = LOWORD(wParam); + wmEvent = HIWORD(wParam); + // Parse the menu selections: + switch (wmId) { + case IDM_EXIT: + //DestroyWindow(hWnd); + PostMessage(hWnd, WM_CLOSE, 0,0); + break; + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + break; + case WM_PAINT: + hdc = BeginPaint(hWnd, &ps); + // TODO: Add any drawing code here... + + + EndPaint(hWnd, &ps); + break; + + case WM_CLOSE: + if (!gEvent || gEvent->empty() || gdi_main->ask("Vill du verkligen stänga MeOS?")) + DestroyWindow(hWnd); + break; + + case WM_DESTROY: + delete gSI; + gSI=0; + + if (gEvent) { + try { + gEvent->save(); + } + catch(std::exception &ex) { + MessageBox(hWnd, lang.tl(ex.what()).c_str(), "Fel när tävlingen skulle sparas", MB_OK); + } + + try { + gEvent->saveRunnerDatabase("database", true); + } + catch(std::exception &ex) { + MessageBox(hWnd, lang.tl(ex.what()).c_str(), "Fel när löpardatabas skulle sparas", MB_OK); + } + + if (gEvent) + gEvent->saveProperties(settings); + + delete gEvent; + gEvent=0; + } + + PostQuitMessage(0); + break; + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + return 0; +} + +void scrollVertical(gdioutput *gdi, int yInc, HWND hWnd) { + SCROLLINFO si; + si.cbSize=sizeof(si); + si.fMask=SIF_ALL; + GetScrollInfo(hWnd, SB_VERT, &si); + if (si.nPage==0) + yInc = 0; + + int yPos=gdi->GetOffsetY(); + int a=si.nMax-signed(si.nPage-1) - yPos; + + if ( (yInc = max( -yPos, min(yInc, a)))!=0 ) { + yPos += yInc; + RECT ScrollArea, ClipArea; + GetClientRect(hWnd, &ScrollArea); + ClipArea=ScrollArea; + + ScrollArea.top=-gdi->getHeight()-100; + ScrollArea.bottom+=gdi->getHeight(); + ScrollArea.right=gdi->getWidth()-gdi->GetOffsetX()+15; + ScrollArea.left = -2000; + gdi->SetOffsetY(yPos); + + bool inv = true; //Inv = false works only for lists etc. where there are not controls in the scroll area. + + RECT invalidArea; + ScrollWindowEx (hWnd, 0, -yInc, + &ScrollArea, &ClipArea, + (HRGN) NULL, &invalidArea, SW_SCROLLCHILDREN | (inv ? SW_INVALIDATE : 0)); + + // gdi->UpdateObjectPositions(); + + si.cbSize = sizeof(si); + si.fMask = SIF_POS; + si.nPos = yPos; + + SetScrollInfo(hWnd, SB_VERT, &si, TRUE); + + if (inv) + UpdateWindow(hWnd); + else { + HDC hDC = GetDC(hWnd); + IntersectClipRect(hDC, invalidArea.left, invalidArea.top, invalidArea.right, invalidArea.bottom); + gdi->draw(hDC, ScrollArea, invalidArea); + ReleaseDC(hWnd, hDC); + } + } +} + +void updateScrollInfo(HWND hWnd, gdioutput &gdi, int nHeight, int nWidth) { + SCROLLINFO si; + si.cbSize = sizeof(si); + si.fMask = SIF_PAGE|SIF_RANGE; + + int maxx, maxy; + gdi.clipOffset(nWidth, nHeight, maxx, maxy); + + si.nMin=0; + + if (maxy>0) { + si.nMax=maxy+nHeight; + si.nPos=gdi.GetOffsetY(); + si.nPage=nHeight; + } + else { + si.nMax=0; + si.nPos=0; + si.nPage=0; + } + SetScrollInfo(hWnd, SB_VERT, &si, true); + + si.nMin=0; + if (maxx>0) { + si.nMax=maxx+nWidth; + si.nPos=gdi.GetOffsetX(); + si.nPage=nWidth; + } + else { + si.nMax=0; + si.nPos=0; + si.nPage=0; + } + + SetScrollInfo(hWnd, SB_HORZ, &si, true); +} + +LRESULT CALLBACK WorkSpaceWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + int wmId, wmEvent; + PAINTSTRUCT ps; + HDC hdc; + + LONG ix = GetWindowLong(hWnd, GWL_USERDATA); + gdioutput *gdi = 0; + if (ix < LONG(gdi_extra.size())) + gdi = gdi_extra[ix]; + + if (gdi) { + LRESULT res = gdi->ProcessMsg(message, lParam, wParam); + if (res) + return res; + } + switch (message) + { + case WM_CREATE: + break; + + case WM_SIZE: + //SCROLLINFO si; + //si.cbSize=sizeof(si); + //si.fMask=SIF_PAGE|SIF_RANGE; + + int nHeight; + nHeight = HIWORD(lParam); + int nWidth; + nWidth = LOWORD(lParam); + updateScrollInfo(hWnd, *gdi, nHeight, nWidth); + /* + + int maxx, maxy; + gdi->clipOffset(nWidth, nHeight, maxx, maxy); + + si.nMin=0; + + if (maxy>0) { + si.nMax=maxy+nHeight; + si.nPos=gdi->GetOffsetY(); + si.nPage=nHeight; + } + else { + si.nMax=0; + si.nPos=0; + si.nPage=0; + } + SetScrollInfo(hWnd, SB_VERT, &si, true); + + si.nMin=0; + if (maxx>0) { + si.nMax=maxx+nWidth; + si.nPos=gdi->GetOffsetX(); + si.nPage=nWidth; + } + else { + si.nMax=0; + si.nPos=0; + si.nPage=0; + } + SetScrollInfo(hWnd, SB_HORZ, &si, true); + */ + InvalidateRect(hWnd, NULL, true); + break; + case WM_KEYDOWN: + //gdi->keyCommand(; + break; + + case WM_VSCROLL: + { + int nScrollCode = (int) LOWORD(wParam); // scroll bar value + //int hwndScrollBar = (HWND) lParam; // handle to scroll bar + + int yInc; + int yPos=gdi->GetOffsetY(); + RECT rc; + GetClientRect(hWnd, &rc); + int pagestep = max(50, int(0.9*rc.bottom)); + + switch(nScrollCode) + { + // User clicked shaft left of the scroll box. + case SB_PAGEUP: + yInc = -pagestep; + break; + + // User clicked shaft right of the scroll box. + case SB_PAGEDOWN: + yInc = pagestep; + break; + + // User clicked the left arrow. + case SB_LINEUP: + yInc = -10; + break; + + // User clicked the right arrow. + case SB_LINEDOWN: + yInc = 10; + break; + + // User dragged the scroll box. + case SB_THUMBTRACK: { + // Initialize SCROLLINFO structure + SCROLLINFO si; + ZeroMemory(&si, sizeof(si)); + si.cbSize = sizeof(si); + si.fMask = SIF_TRACKPOS; + + if (!GetScrollInfo(hWnd, SB_VERT, &si) ) + return 1; // GetScrollInfo failed + + yInc = si.nTrackPos - yPos; + break; + } + + default: + yInc = 0; + } + + scrollVertical(gdi, yInc, hWnd); + gdi->storeAutoPos(gdi->GetOffsetY()); + break; + } + + case WM_HSCROLL: + { + int nScrollCode = (int) LOWORD(wParam); // scroll bar value + //int hwndScrollBar = (HWND) lParam; // handle to scroll bar + + int xInc; + int xPos=gdi->GetOffsetX(); + + switch(nScrollCode) + { + // User clicked shaft left of the scroll box. + case SB_PAGEUP: + xInc = -80; + break; + + // User clicked shaft right of the scroll box. + case SB_PAGEDOWN: + xInc = 80; + break; + + // User clicked the left arrow. + case SB_LINEUP: + xInc = -10; + break; + + // User clicked the right arrow. + case SB_LINEDOWN: + xInc = 10; + break; + + // User dragged the scroll box. + case SB_THUMBTRACK: { + // Initialize SCROLLINFO structure + SCROLLINFO si; + ZeroMemory(&si, sizeof(si)); + si.cbSize = sizeof(si); + si.fMask = SIF_TRACKPOS; + + if (!GetScrollInfo(hWnd, SB_HORZ, &si) ) + return 1; // GetScrollInfo failed + + xInc = si.nTrackPos - xPos; + break; + } + //xInc = HIWORD(wParam) - xPos; + //break; + default: + xInc = 0; + } + + SCROLLINFO si; + si.cbSize=sizeof(si); + si.fMask=SIF_ALL; + GetScrollInfo(hWnd, SB_HORZ, &si); + + if (si.nPage==0) + xInc = 0; + + int a=si.nMax-signed(si.nPage-1) - xPos; + + if ((xInc = max( -xPos, min(xInc, a)))!=0) { + xPos += xInc; + RECT ScrollArea, ClipArea; + GetClientRect(hWnd, &ScrollArea); + ClipArea=ScrollArea; + + gdi->SetOffsetX(xPos); + + ScrollWindowEx (hWnd, -xInc, 0, + 0, &ClipArea, + (HRGN) NULL, (LPRECT) NULL, SW_INVALIDATE|SW_SCROLLCHILDREN); + + si.cbSize = sizeof(si); + si.fMask = SIF_POS; + si.nPos = xPos; + + SetScrollInfo(hWnd, SB_HORZ, &si, TRUE); + UpdateWindow (hWnd); + } + break; + } + + case WM_MOUSEWHEEL: { + int dz = GET_WHEEL_DELTA_WPARAM(wParam); + scrollVertical(gdi, -dz, hWnd); + gdi->storeAutoPos(gdi->GetOffsetY()); + } + break; + + case WM_TIMER: + if (wParam == 1001) { + double autoScroll, pos; + gdi->getAutoScroll(autoScroll, pos); + + SCROLLINFO si; + si.cbSize = sizeof(si); + si.fMask = SIF_ALL; + + GetScrollInfo(hWnd, SB_VERT, &si); + int dir = gdi->getAutoScrollDir(); + int dy = 0; + if ((dir<0 && si.nPos <= si.nMin) || + (dir>0 && (si.nPos + int(si.nPage)) >= si.nMax)) { + autoScroll = -autoScroll; + gdi->setAutoScroll(-1); // Mirror + + double nextPos = pos + autoScroll; + dy = int(nextPos - si.nPos); + gdi->storeAutoPos(nextPos); + + //gdi->setData("AutoScroll", -int(data)); + } + else { + double nextPos = pos + autoScroll; + dy = int(nextPos - si.nPos); + gdi->storeAutoPos(nextPos); + //gdi->setData("Discrete", DWORD(nextPos*1e3)); + } + + scrollVertical(gdi, dy, hWnd); + } + else + MessageBox(hWnd, "Runtime exception", 0, MB_OK); + break; + + case WM_ACTIVATE: { + int fActive = LOWORD(wParam); + if (fActive != WA_INACTIVE) + currentFocusIx = ix; + + return DefWindowProc(hWnd, message, wParam, lParam); + } + + case WM_USER + 2: + if (gdi) + LoadPage(*gdi, TabType(wParam)); + break; + + case WM_COMMAND: + wmId = LOWORD(wParam); + wmEvent = HIWORD(wParam); + // Parse the menu selections: + switch (wmId) + { + case 0: break; + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + break; + + case WM_PAINT: + hdc = BeginPaint(hWnd, &ps); + RECT rt; + GetClientRect(hWnd, &rt); + + if (gdi && (ps.rcPaint.right|ps.rcPaint.left|ps.rcPaint.top|ps.rcPaint.bottom) != 0 ) + gdi->draw(hdc, rt, ps.rcPaint); + /*{ + HANDLE icon = LoadImage(hInst, (LPCTSTR)IDI_MEOS, IMAGE_ICON, 64, 64, LR_SHARED); + DrawIconEx(hdc, 0,0, (HICON)icon, 64, 64, 0, NULL, DI_NORMAL | DI_COMPAT); + }*/ + EndPaint(hWnd, &ps); + break; + + case WM_ERASEBKGND: + return 0; + break; + + case WM_DESTROY: + if (ix > 0) { + gdi->makeEvent("CloseWindow", "meos", 0, 0, false); + gdi_extra[ix] = 0; + delete gdi; + + while(!gdi_extra.empty() && gdi_extra.back() == 0) + gdi_extra.pop_back(); + } + break; + + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + return 0; +} + + +// Message handler for about box. +LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + return TRUE; + + case WM_COMMAND: + if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) + { + EndDialog(hDlg, LOWORD(wParam)); + return TRUE; + } + break; + } + return FALSE; +} + + +namespace setup { +const int nFiles=7; +const char *fileList[nFiles]={"baseclass.xml", + "family.mwd", + "given.mwd", + "club.mwd", + "class.mwd", + "database.clubs", + "database.persons"}; +} + +void Setup(bool overwrite, bool overwriteAll) +{ + static bool isSetup=false; + if (isSetup && overwrite==false) + return; + isSetup=true; //Run at most once. + + vector > toInstall; + for(int k=0;k dyn; + expandDirectory(dir, "*.lxml", dyn); + expandDirectory(dir, "*.listdef", dyn); + expandDirectory(dir, "*.meos", dyn); + for (size_t k = 0; k < dyn.size(); k++) + toInstall.push_back(make_pair(dyn[k], true)); + + char bf[260]; + for(size_t k=0; k tempFiles; +static string tempPath; + +string getTempPath() { + char tempFile[MAX_PATH]; + if (tempPath.empty()) { + char path[MAX_PATH]; + GetTempPath(MAX_PATH, path); + GetTempFileName(path, "meos", 0, tempFile); + DeleteFile(tempFile); + if (CreateDirectory(tempFile, NULL)) + tempPath = tempFile; + else + throw std::exception("Failed to create temporary file."); + } + return tempPath; +} + +void registerTempFile(const string &tempFile) { + tempFiles.insert(tempFile); +} + +string getTempFile() { + getTempPath(); + + char tempFile[MAX_PATH]; + if (GetTempFileName(tempPath.c_str(), "ix", 0, tempFile)) { + tempFiles.insert(tempFile); + return tempFile; + } + else + throw std::exception("Failed to create temporary file."); +} + +void removeTempFile(const string &file) { + DeleteFile(file.c_str()); + tempFiles.erase(file); +} + +void removeTempFiles() { + vector dir; + for (set::iterator it = tempFiles.begin(); it!= tempFiles.end(); ++it) { + char c = *it->rbegin(); + if (c == '/' || c=='\\') + dir.push_back(*it); + else + DeleteFile(it->c_str()); + } + tempFiles.clear(); + bool removed = true; + while (removed) { + removed = false; + for (size_t k = 0; k +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=meos - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "meos.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "meos.mak" CFG="meos - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "meos - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "meos - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "meos - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x41d /d "NDEBUG" +# ADD RSC /l 0x41d /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 Msimg32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 + +!ELSEIF "$(CFG)" == "meos - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /FR /Yu"stdafx.h" /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x41d /d "_DEBUG" +# ADD RSC /l 0x41d /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 Msimg32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "meos - Win32 Release" +# Name "meos - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\csvparser.cpp +# End Source File +# Begin Source File + +SOURCE=.\gdioutput.cpp +# End Source File +# Begin Source File + +SOURCE=.\meos.cpp +# End Source File +# Begin Source File + +SOURCE=.\meos.rc +# End Source File +# Begin Source File + +SOURCE=.\oBase.cpp +# End Source File +# Begin Source File + +SOURCE=.\oCard.cpp +# End Source File +# Begin Source File + +SOURCE=.\oClass.cpp +# End Source File +# Begin Source File + +SOURCE=.\oClub.cpp +# End Source File +# Begin Source File + +SOURCE=.\oControl.cpp +# End Source File +# Begin Source File + +SOURCE=.\oCourse.cpp +# End Source File +# Begin Source File + +SOURCE=.\oEvent.cpp +# End Source File +# Begin Source File + +SOURCE=.\oPunch.cpp +# End Source File +# Begin Source File + +SOURCE=.\oRunner.cpp +# End Source File +# Begin Source File + +SOURCE=.\pages.cpp +# End Source File +# Begin Source File + +SOURCE=.\pages_classes.cpp +# End Source File +# Begin Source File + +SOURCE=.\pages_competition.cpp +# End Source File +# Begin Source File + +SOURCE=.\pages_course.cpp +# End Source File +# Begin Source File + +SOURCE=.\pages_lists.cpp +# End Source File +# Begin Source File + +SOURCE=.\pages_si.cpp +# End Source File +# Begin Source File + +SOURCE=.\random.cpp +# End Source File +# Begin Source File + +SOURCE=.\SportIdent.cpp +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# Begin Source File + +SOURCE=.\TimeStamp.cpp +# End Source File +# Begin Source File + +SOURCE=.\xmlparser.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\csvparser.h +# End Source File +# Begin Source File + +SOURCE=.\gdioutput.h +# End Source File +# Begin Source File + +SOURCE=.\meos.h +# End Source File +# Begin Source File + +SOURCE=.\oBase.h +# End Source File +# Begin Source File + +SOURCE=.\oCard.h +# End Source File +# Begin Source File + +SOURCE=.\oClass.h +# End Source File +# Begin Source File + +SOURCE=.\oClub.h +# End Source File +# Begin Source File + +SOURCE=.\oControl.h +# End Source File +# Begin Source File + +SOURCE=.\oCourse.h +# End Source File +# Begin Source File + +SOURCE=.\oEvent.h +# End Source File +# Begin Source File + +SOURCE=.\oPunch.h +# End Source File +# Begin Source File + +SOURCE=.\oRunner.h +# End Source File +# Begin Source File + +SOURCE=.\random.h +# End Source File +# Begin Source File + +SOURCE=.\resource.h +# End Source File +# Begin Source File + +SOURCE=.\SportIdent.h +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# Begin Source File + +SOURCE=.\TimeStamp.h +# End Source File +# Begin Source File + +SOURCE=.\xmlparser.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\meos.ico +# End Source File +# Begin Source File + +SOURCE=.\small.ico +# End Source File +# End Group +# Begin Source File + +SOURCE=.\ReadMe.txt +# End Source File +# End Target +# End Project +# Section meos : {4E2984B5-19E9-4743-8ED4-A0D97FA48101} +# 2:21:DefaultSinkHeaderFile:_sicomm.h +# 2:16:DefaultSinkClass:C_SiComm +# End Section +# Section meos : {D2F56B3B-02FC-415B-843E-AFBA48C5F2B2} +# 2:5:Class:C_SiComm +# 2:10:HeaderFile:_sicomm.h +# 2:8:ImplFile:_sicomm.cpp +# End Section diff --git a/code/meos.h b/code/meos.h new file mode 100644 index 0000000..2a26408 --- /dev/null +++ b/code/meos.h @@ -0,0 +1,11 @@ +#if !defined(AFX_MEOS_H__7F8E5F23_ADD4_45AB_9626_7378FEA38D49__INCLUDED_) +#define AFX_MEOS_H__7F8E5F23_ADD4_45AB_9626_7378FEA38D49__INCLUDED_ + + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "resource.h" + +#endif // !defined(AFX_MEOS_H__7F8E5F23_ADD4_45AB_9626_7378FEA38D49__INCLUDED_) diff --git a/code/meos.ico b/code/meos.ico new file mode 100644 index 0000000..cb86299 Binary files /dev/null and b/code/meos.ico differ diff --git a/code/meos.rc b/code/meos.rc new file mode 100644 index 0000000..803ca73 --- /dev/null +++ b/code/meos.rc @@ -0,0 +1,177 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS +#include "resource.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1252) + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +BMP_TEST BITMAP "bitmap1.bmp" +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_MEOS ICON "meos.ICO" + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDC_MEOS MENU +BEGIN + POPUP "&Arkiv" + BEGIN + MENUITEM "&Avsluta", IDM_EXIT + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Accelerator +// + +IDC_MEOS ACCELERATORS +BEGIN + "?", IDM_ABOUT, ASCII, ALT + "/", IDM_ABOUT, ASCII, ALT +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +2 TEXTINCLUDE +BEGIN + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""resource.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// Swedish (Sweden) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_SVE) +LANGUAGE LANG_SWEDISH, SUBLANG_SWEDISH +#pragma code_page(1252) + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 3,1,0,1 + PRODUCTVERSION 3,1,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "041d04b0" + BEGIN + VALUE "CompanyName", " " + VALUE "FileDescription", "meos" + VALUE "FileVersion", "3.3.0.1" + VALUE "InternalName", "meos" + VALUE "LegalCopyright", "Copyright © 2007-2017" + VALUE "OriginalFilename", "meos.exe" + VALUE "ProductName", " meos" + VALUE "ProductVersion", "3.4.0.1" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x41d, 1200 + END +END + +#endif // Swedish (Sweden) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/code/meos.sln b/code/meos.sln new file mode 100644 index 0000000..539e574 --- /dev/null +++ b/code/meos.sln @@ -0,0 +1,29 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C++ Express 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "meos", "meos.vcproj", "{B854EF2A-2BB7-4D62-B08B-96BD64B347E8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|Win64 = Debug|Win64 + Release|Win32 = Release|Win32 + Release|Win64 = Release|Win64 + test|Win32 = test|Win32 + test|Win64 = test|Win64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.Debug|Win32.ActiveCfg = Debug|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.Debug|Win32.Build.0 = Debug|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.Debug|Win64.ActiveCfg = Debug|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.Release|Win32.ActiveCfg = Release|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.Release|Win32.Build.0 = Release|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.Release|Win64.ActiveCfg = Release|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.test|Win32.ActiveCfg = test|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.test|Win32.Build.0 = test|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.test|Win64.ActiveCfg = test|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/code/meos.vcproj b/code/meos.vcproj new file mode 100644 index 0000000..eedefe6 --- /dev/null +++ b/code/meos.vcproj @@ -0,0 +1,1360 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/meos.vcxproj b/code/meos.vcxproj new file mode 100644 index 0000000..4e0d46d --- /dev/null +++ b/code/meos.vcxproj @@ -0,0 +1,470 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + test + Win32 + + + + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8} + meos + + + + Application + false + MultiByte + + + Application + false + MultiByte + + + Application + false + MultiByte + true + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + .\Release\ + .\Release\ + false + .\Debug\ + .\Debug\ + true + $(Configuration)\ + $(Configuration)\ + true + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\Release/meos.tlb + + + + + MaxSpeed + AnySuitable + Speed + meosdb/mysql++;meosdb/mysql50;libharu;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + Use + stdafx.h + .\Release/meos.pch + .\Release/ + .\Release/ + .\Release/ + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x041d + + + Msimg32.lib;comctl32.lib;odbc32.lib;odbccp32.lib;winmm.lib;ws2_32.lib;wininet.lib;zlibstat.lib;mysqlpp.lib;libhpdf.lib;%(AdditionalDependencies) + .\Release/meos.exe + true + ./lib;%(AdditionalLibraryDirectories) + .\Release/meos.pdb + Windows + false + + + MachineX86 + true + + + true + .\Release/meos.bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\Debug/meos.tlb + + + + + Disabled + meosdb/mysql++;libharu;meosdb/mysql50;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + false + EnableFastChecks + MultiThreadedDebugDLL + NotSet + Use + stdafx.h + .\Debug/meos.pch + .\Debug/ + .\Debug/ + .\Debug/ + true + Level4 + true + EditAndContinue + 4996;4100;4244;4245;4702;4389;4127;4201;%(DisableSpecificWarnings) + true + + + _DEBUG;%(PreprocessorDefinitions) + 0x041d + + + Msimg32.lib;comctl32.lib;odbc32.lib;odbccp32.lib;winmm.lib;ws2_32.lib;wininet.lib;zlibstat.lib;mysqlpp.lib;libhpdf.lib;%(AdditionalDependencies) + .\Debug/meos.exe + true + ./lib_db;%(AdditionalLibraryDirectories) + true + .\Debug/meos.pdb + Windows + false + + + MachineX86 + + + true + .\Debug/meos.bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\Debug/meos.tlb + + + + + Disabled + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + Use + stdafx.h + .\Debug/meos.pch + .\Debug/ + .\Debug/ + .\Debug/ + true + Level3 + true + EditAndContinue + + + _DEBUG;%(PreprocessorDefinitions) + 0x041d + + + Msimg32.lib;comctl32.lib;odbc32.lib;odbccp32.lib;winmm.lib;%(AdditionalDependencies) + .\Debug/meos.exe + true + true + .\Debug/meos.pdb + Windows + false + + + MachineX86 + + + true + .\Debug/meos.bsc + + + + + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + + + + + + + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + + + + + + + + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + + + + + + + + + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + + + + + + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + + + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + %(PreprocessorDefinitions) + Create + %(PreprocessorDefinitions) + Create + %(PreprocessorDefinitions) + Create + + + + + + + + + + + + + + + + + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + + + + + + + + + + \ No newline at end of file diff --git a/code/meos_util.cpp b/code/meos_util.cpp new file mode 100644 index 0000000..d49d412 --- /dev/null +++ b/code/meos_util.cpp @@ -0,0 +1,1857 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include "stdafx.h" +#include +#include +#include "meos_util.h" +#include "localizer.h" +#include "oFreeImport.h" +#include "meosexception.h" + +StringCache globalStringCache; + +namespace MeOSUtil { + int useHourFormat = true; +} + +DWORD mainThreadId = -1; +StringCache &StringCache::getInstance() { + DWORD id = GetCurrentThreadId(); + if (mainThreadId == -1) + mainThreadId = id; + else if (mainThreadId != id) + throw std::exception("Thread access error"); + return globalStringCache; +} + +string getLocalTime() +{ + SYSTEMTIME st; + GetLocalTime(&st); + return convertSystemTime(st); +} + +string getLocalDate() +{ + SYSTEMTIME st; + GetLocalTime(&st); + return convertSystemDate(st); +} + + +int getThisYear() { + static int thisYear = 0; + if (thisYear == 0) { + SYSTEMTIME st; + GetLocalTime(&st); + thisYear = st.wYear; + } + return thisYear; +} + + +/** Extend a year from 03 -> 2003, 97 -> 1997 etc */ +int extendYear(int year) { + if (year<0) + return year; + + if (year>=100) + return year; + + int thisYear = getThisYear(); + + int cLast = thisYear%100; + + if (cLast == 0 && year == 0) + return thisYear; + + if (year > thisYear%100) + return (thisYear - cLast) - 100 + year; + else + return (thisYear - cLast) + year; +} + +string getLocalTimeFileName() +{ + SYSTEMTIME st; + GetLocalTime(&st); + + char bf[32]; + sprintf_s(bf, "%d%02d%02d_%02d%02d%02d", st.wYear, st.wMonth, st.wDay, + st.wHour, st.wMinute, st.wSecond); + + return bf; +} + + +string getLocalTimeOnly() +{ + SYSTEMTIME st; + GetLocalTime(&st); + return convertSystemTimeOnly(st); +} + + +int getRelativeDay() { + SYSTEMTIME st; + GetLocalTime(&st); + FILETIME ft; + SystemTimeToFileTime(&st, &ft); + + ULARGE_INTEGER u; + u.HighPart = ft.dwHighDateTime; + u.LowPart = ft.dwLowDateTime; + __int64 qp = u.QuadPart; + qp /= __int64(10) * 1000 * 1000 * 3600 * 24; + qp -= 400*365; + return int(qp); +} + +__int64 SystemTimeToInt64Second(const SYSTEMTIME &st) { + FILETIME ft; + SystemTimeToFileTime(&st, &ft); + + ULARGE_INTEGER u; + u.HighPart = ft.dwHighDateTime; + u.LowPart = ft.dwLowDateTime; + __int64 qp = u.QuadPart; + qp /= __int64(10) * 1000 * 1000; + return qp; +} + +SYSTEMTIME Int64SecondToSystemTime(__int64 time) { + SYSTEMTIME st; + FILETIME ft; + + ULARGE_INTEGER u; + u.QuadPart = time * __int64(10) * 1000 * 1000; + ft.dwHighDateTime = u.HighPart; + ft.dwLowDateTime = u.LowPart; + + FileTimeToSystemTime(&ft, &st); + + return st; +} +//2014-11-03 07:02:00 +string convertSystemTime(const SYSTEMTIME &st) +{ + char bf[32]; + sprintf_s(bf, "%d-%02d-%02d %02d:%02d:%02d", st.wYear, st.wMonth, st.wDay, + st.wHour, st.wMinute, st.wSecond); + + return bf; +} + + +string convertSystemTimeOnly(const SYSTEMTIME &st) +{ + char bf[32]; + sprintf_s(bf, "%02d:%02d:%02d", st.wHour, st.wMinute, st.wSecond); + + return bf; +} + + +string convertSystemDate(const SYSTEMTIME &st) +{ + char bf[32]; + sprintf_s(bf, "%d-%02d-%02d", st.wYear, st.wMonth, st.wDay); + + return bf; +} + +string formatDate(int m, bool useIsoFormat) { + char bf[24]; + if (m > 0 && m < 30000101) { + sprintf_s(bf, 24, "%d-%02d-%02d", m/(100*100), (m/100)%100, m%100); + } + else { + bf[0] = '-'; + bf[1] = 0; + } + return bf; +} + +//Absolute time string to SYSTEM TIME +int convertDateYMS(const string &m, SYSTEMTIME &st, bool checkValid) { + memset(&st, 0, sizeof(st)); + + if (m.length()==0) + return -1; + + int len=m.length(); + for (int k=0;k='0' && b<='9')) ) + return -1; + } + + int year=atoi(m.c_str()); + if (year<1900 || year>3000) + return -1; + + int month=0; + int day=0; + int kp=m.find_first_of('-'); + + if (kp!=string::npos) { + string mtext=m.substr(kp+1); + month=atoi(mtext.c_str()); + + if (month<1 || month>12) { + if (checkValid) + return -1; + month = 1; + } + + kp=mtext.find_last_of('-'); + + if (kp!=string::npos) { + day=atoi(mtext.substr(kp+1).c_str()); + if (day<1 || day>31) { + if (checkValid) + return -1; + day = 1; + } + } + } + st.wYear = year; + st.wMonth = month; + st.wDay = day; + + + int t = year*100*100+month*100+day; + if (t<0) return -1; + + return t; +} + +//Absolute time string to absolute time int +int convertDateYMS(const string &m, bool checkValid) +{ + SYSTEMTIME st; + return convertDateYMS(m, st, checkValid); +} + + +bool myIsSpace(BYTE b) { + return isspace(b) || BYTE(b)==BYTE(160); +} + +//Absolute time string to absolute time int +int convertAbsoluteTimeHMS(const string &m, int daysZeroTime) { + int len = m.length(); + + if (len==0 || m[0]=='-') + return -1; + + // Support for notation 2D 14:30:00 or 2T14:30:00 for several days + int tix = -1; + for (size_t k = 0; k < m.length(); k++) { + int c = m[k]; + if (c =='D' || c =='d' || c =='T' || c =='t') { + tix = k; + break; + } + } + if (tix != -1) { + if (daysZeroTime < 0) + return -1; // Not supported + int tpart = convertAbsoluteTimeHMS(m.substr(tix+1), -1); + if (tpart != -1) { + int days = atoi(m.c_str()); + if (days <= 0) + return -1; + if (tpart < daysZeroTime) + days--; + return days * 3600 * 24 + tpart; + } + return -1; + } + + int plusIndex = -1; + for (int k=0;k='0' && b<='9')) ) { + if (b=='+' && plusIndex ==-1 && k>0) + plusIndex = k; + else + return -1; + } + } + + if (plusIndex>0) { + int t = convertAbsoluteTimeHMS(m.substr(plusIndex+1), -1); + int d = atoi(m.c_str()); + + if (d>0 && t>=0) + return d*24*3600 + t; + else + return -1; + } + + int hour=atoi(m.c_str()); + + if (hour<0 || hour>23) + return -1; + + int minute=0; + int second=0; + int kp=m.find_first_of(':'); + + if (kp!=string::npos) { + string mtext=m.substr(kp+1); + minute=atoi(mtext.c_str()); + + if (minute<0 || minute>60) + minute=0; + + kp=mtext.find_last_of(':'); + + if (kp!=string::npos) { + second=atoi(mtext.substr(kp+1).c_str()); + if (second<0 || second>60) + second=0; + } + } + int t=hour*3600+minute*60+second; + if (t<0) return 0; + + return t; +} + + +//Absolute time string to absolute time int +int convertAbsoluteTimeISO(const string &m) +{ + int len = m.length(); + + if (len==0 || m[0]=='-') + return -1; + + string hStr, mStr, sStr; + + string tmp = trim(m); + + if (tmp.length() < 3) + return -1; + + hStr = tmp.substr(0, 2); + if (!(tmp[2] >= '0' && tmp[2]<='9')) + tmp = tmp.substr(3); + else + tmp = tmp.substr(2); + + if (tmp.length() < 3) + return -1; + + mStr = tmp.substr(0, 2); + + if (!(tmp[2] >= '0' && tmp[2]<='9')) + tmp = tmp.substr(3); + else + tmp = tmp.substr(2); + + if (tmp.length() < 2) + return -1; + + sStr = tmp.substr(0, 2); + + int hour = atoi(hStr.c_str()); + if (hour<0 || hour>23) + return -1; + + int minute = atoi(mStr.c_str()); + + if (minute<0 || minute>60) + return -1; + + int second = atoi(sStr.c_str()); + + if (second<0 || second>60) + return -1; + + int t = hour*3600 + minute*60 + second; + + return t; +} + + +// Parse +-MM:SS or +-HH:MM:SS +int convertAbsoluteTimeMS(const string &m) +{ + if (m.length()==0) + return NOTIME; + + int minute=0; + int second=0; + + int signpos=m.find_first_of('-'); + string mtext; + + int sign=1; + + if (signpos!=string::npos) { + sign=-1; + mtext=m.substr(signpos+1); + } + else + mtext=m; + + minute=atoi(mtext.c_str()); + + if (minute<0 || minute>60*24) + minute=0; + + int kp=mtext.find_first_of(':'); + + if (kp!=string::npos) { + mtext = mtext.substr(kp+1); + second = atoi(mtext.c_str()); + if (second<0 || second>60) + second=0; + } + + int t=minute*60+second; + + kp=mtext.find_first_of(':'); + if (kp!=string::npos) { + //Allow also for format +-HH:MM:SS + mtext = mtext.substr(kp+1); + second=atoi(mtext.c_str()); + if (second<0 || second>60) + second=0; + else + t = t*60 + second; + } + return sign*t; +} + +//Generate +-MM:SS or +-HH:MM:SS +const string &getTimeMS(int m) { + char bf[32]; + int am = abs(m); + if (am < 3600 || !MeOSUtil::useHourFormat) + sprintf_s(bf, "-%02d:%02d", am/60, am%60); + else if (am < 3600*48) + sprintf_s(bf, "-%02d:%02d:%02d", am/3600, (am/60)%60, am%60); + else { + m = 0; + bf[0] = BYTE(0x96); + bf[1] = 0; + } + string &res = StringCache::getInstance().get(); + if (m<0) + res = bf; // with minus + else + res = bf + 1; + + return res; +} + +const string &formatTime(int rt) { + string &res = StringCache::getInstance().get(); + if (rt>0 && rt<3600*999) { + char bf[16]; + if (rt>=3600 && MeOSUtil::useHourFormat) + sprintf_s(bf, 16, "%d:%02d:%02d", rt/3600,(rt/60)%60, rt%60); + else + sprintf_s(bf, 16, "%d:%02d", (rt/60), rt%60); + + res = bf; + return res; + } + char ret[2] = {BYTE(0x96), 0}; + res = ret; + return res; +} + +const string &formatTimeHMS(int rt) { + + string &res = StringCache::getInstance().get(); + if (rt>=0) { + char bf[32]; + sprintf_s(bf, 16, "%02d:%02d:%02d", rt/3600,(rt/60)%60, rt%60); + + res = bf; + return res; + } + char ret[2] = {BYTE(0x96), 0}; + res = ret; + return res; +} + +string formatTimeIOF(int rt, int zeroTime) +{ + if (rt>0 && rt<(3600*48)) { + rt+=zeroTime; + char bf[16]; + sprintf_s(bf, 16, "%02d:%02d:%02d", rt/3600,(rt/60)%60, rt%60); + + return bf; + } + return "--:--:--"; +} + +size_t find(const string &str, const string &separator, size_t startpos) +{ + size_t seplen = separator.length(); + + for (size_t m = startpos; m & split(const string &line, const string &separators, vector &split_vector) { + split_vector.clear(); + + if (line.empty()) + return split_vector; + + size_t startpos=0; + size_t nextp=find(line, separators, startpos); + split_vector.push_back(line.substr(startpos, nextp-startpos)); + + while(nextp!=line.npos) { + startpos=nextp+1; + nextp=find(line, separators, startpos); + split_vector.push_back(line.substr(startpos, nextp-startpos)); + } + + return split_vector; +} + +const string &unsplit(const vector &split_vector, const string &separators, string &line) { + size_t s = split_vector.size() * separators.size(); + for (size_t k = 0; k < split_vector.size(); k++) { + s += split_vector[k].size(); + } + + line.clear(); + line.reserve(s); + for (size_t k = 0; k < split_vector.size(); k++) { + if (k != 0) + line += separators; + line += split_vector[k]; + } + return line; +} + + +const string &MakeDash(const string &t) { + return MakeDash(t.c_str()); +} + +const string &MakeDash(const char *t) { + string &out = StringCache::getInstance().get(); + out = t; + for (size_t i=0;i=0 && (isspace(BYTE(ptr[k])) || BYTE(ptr[i])==BYTE(160))) k--; + + if (i == 0 && k == len-1) + return s; + else if (k>=i && i') | (bf[k]=='<') | (bf[k]=='"') | (bf[k]==0) | (bf[k]=='\n') | (bf[k]=='\r'); + + if (!needEncode) + return in; + out.clear(); + for (int k=0;k') + out+=">"; + else if (bf[k]=='"') + out+="""; + else if (bf[k]=='\n') + out+=" "; + else if (bf[k]=='\r') + out+=" "; + else if (bf[k] == 0) + out+=' '; + else + out+=bf[k]; + } + return out; +} + +const string &decodeXML(const string &in) +{ + const char *bf = in.c_str(); + int len = in.length(); + bool needDecode = false; + for (int k=0;k', k+=3; + else if ( memcmp(&bf[k], """, 6)==0 ) + str << '\"', k+=5; + else if ( memcmp(&bf[k], " ", 6)==0 ) + str << ' ', k+=5; + else if ( memcmp(&bf[k], " ", 5)==0 ) + str << '\n', k+=4; + else if ( memcmp(&bf[k], " ", 5)==0 ) + str << '\r', k+=4; + else + str << bf[k]; + } + else + str << bf[k]; + } + out = str.str(); + } + return out; +} + +void inplaceDecodeXML(char *in) +{ + char *bf = in; + int outp = 0; + + for (int k=0;bf[k] ;k++) { + if (bf[k] != '&') + bf[outp++] = bf[k]; + else { + if ( memcmp(&bf[k], "&", 5)==0 ) + bf[outp++] = '&', k+=4; + else if ( memcmp(&bf[k], "<", 4)==0 ) + bf[outp++] = '<', k+=3; + else if ( memcmp(&bf[k], ">", 4)==0 ) + bf[outp++] = '>', k+=3; + else if ( memcmp(&bf[k], """, 6)==0 ) + bf[outp++] = '"', k+=5; + else if ( memcmp(&bf[k], " ", 5)==0 ) + bf[outp++] = '\n', k+=4; + else if ( memcmp(&bf[k], " ", 5)==0 ) + bf[outp++] = '\r', k+=4; + else + bf[outp++] = bf[k]; + } + } + bf[outp] = 0; +} + +const char *decodeXML(const char *in) +{ + const char *bf = in; + bool needDecode = false; + for (int k=0; bf[k] ;k++) + needDecode |= (bf[k]=='&'); + + if (!needDecode) + return in; + + static string out; + out.clear(); + for (int k=0;bf[k] ;k++) { + if (bf[k]=='&') { + if ( memcmp(&bf[k], "&", 5)==0 ) + out+="&", k+=4; + else if ( memcmp(&bf[k], "<", 4)==0 ) + out+="<", k+=3; + else if ( memcmp(&bf[k], ">", 4)==0 ) + out+=">", k+=3; + else if ( memcmp(&bf[k], """, 6)==0 ) + out+="\"", k+=5; + else if ( memcmp(&bf[k], " ", 5)==0 ) + out+="\n", k+=4; + else if ( memcmp(&bf[k], " ", 5)==0 ) + out+="\r", k+=4; + else + out+=bf[k]; + } + else + out+=bf[k]; + } + + return out.c_str(); +} + +void static setChar(unsigned char *map, unsigned char pos, unsigned char value) +{ + map[pos] = value; +} + +int toLowerStripped(int c) { + const unsigned cc = c&0xFF; + if (cc>='A' && cc<='Z') + return cc + ('a' - 'A'); + else if (cc<128) + return cc; + + static unsigned char map[256] = {0, 0}; + if (map[1] == 0) { + for (unsigned i = 0; i < 256; i++) + map[i] = unsigned char(i); + + setChar(map, 'Å', 'å'); + setChar(map, 'Ä', 'ä'); + setChar(map, 'Ö', 'ö'); + + setChar(map, 'É', 'e'); + setChar(map, 'é', 'e'); + setChar(map, 'è', 'e'); + setChar(map, 'È', 'e'); + setChar(map, 'ë', 'e'); + setChar(map, 'Ë', 'e'); + setChar(map, 'ê', 'e'); + setChar(map, 'Ê', 'e'); + + setChar(map, 'û', 'u'); + setChar(map, 'Û', 'u'); + setChar(map, 'ü', 'u'); + setChar(map, 'Ü', 'u'); + setChar(map, 'ú', 'u'); + setChar(map, 'Ú', 'u'); + setChar(map, 'ù', 'u'); + setChar(map, 'Ù', 'u'); + + setChar(map, 'ñ', 'n'); + setChar(map, 'Ñ', 'n'); + + setChar(map, 'á', 'a'); + setChar(map, 'Á', 'a'); + setChar(map, 'à', 'a'); + setChar(map, 'À', 'a'); + setChar(map, 'â', 'a'); + setChar(map, 'Â', 'a'); + setChar(map, 'ã', 'a'); + setChar(map, 'Ã', 'a'); + + setChar(map, 'ï', 'i'); + setChar(map, 'Ï', 'i'); + setChar(map, 'î', 'i'); + setChar(map, 'Î', 'i'); + setChar(map, 'í', 'i'); + setChar(map, 'Í', 'i'); + setChar(map, 'ì', 'i'); + setChar(map, 'Ì', 'i'); + + setChar(map, 'ó', 'o'); + setChar(map, 'Ó', 'o'); + setChar(map, 'ò', 'o'); + setChar(map, 'Ò', 'o'); + setChar(map, 'õ', 'o'); + setChar(map, 'Õ', 'o'); + setChar(map, 'ô', 'o'); + setChar(map, 'Ô', 'o'); + + setChar(map, 'ý', 'y'); + setChar(map, 'Ý', 'Y'); + setChar(map, 'ÿ', 'y'); + + setChar(map, 'Æ', 'ä'); + setChar(map, 'æ', 'ä'); + + setChar(map, 'Ø', 'ö'); + setChar(map, 'ø', 'ö'); + + setChar(map, 'Ç', 'c'); + setChar(map, 'ç', 'c'); + } + int a = map[cc]; + return a; +} + +const char *canonizeName(const char *name) +{ + static char out[70]; + static char tbf[70]; + + for (int i = 0; i<63 && name[i]; i++) { + if (name[i] == ',') { + int tout = 0; + for (int j = i+1; j < 63 && name[j]; j++) { + tbf[tout++] = name[j]; + } + tbf[tout++] = ' '; + for (int j = 0; j < i; j++) { + tbf[tout++] = name[j]; + } + tbf[tout] = 0; + name = tbf; + break; + } + } + + int outp = 0; + int k = 0; + for (k=0; k<63 && name[k]; k++) { + if (name[k] != ' ') + break; + } + + bool first = true; + while (k<63 && name[k]) { + if (!first) + out[outp++] = ' '; + + while(name[k]!= ' ' && k<63 && name[k]) { + if (name[k] == '-') + out[outp++] = ' '; + else + out[outp++] = toLowerStripped(name[k]); + k++; + } + + first = false; + while(name[k] == ' ' && k<64) + k++; + } + + out[outp] = 0; + return out; +} + +const int notFound = 1000000; + +int charDist(const char *b, int len, int origin, char c) +{ + int i; + int bound = max(1, min(len/2, 4)); + for (int k = 0;k0 && b[i] == c) + return -k; + i = origin + k; + if (imin(3, max(1, al/3))) + return 1; + + double mfactor = double(missing*0.8); + double center = double(avg)/double(ndiff); + + double dist = 0; + for (int k=0; k(fabs(d1[k] - center), abs(d1[k])); + dist += ld*ld; + } + + + return (sqrt(dist)+mfactor*mfactor)/double(al); +} + +double stringDistance(const char *a, const char *b) +{ + int al = strlen(a); + int bl = strlen(b); + + double d1 = stringDistance(a, al, b, bl); + if (d1 >= 1) + return 1.0; + + double d2 = stringDistance(b, bl, a, al); + if (d2 >= 1) + return 1.0; + + return (max(d1, d2) + d1 + d2)/3.0; +} + +int getNumberSuffix(const string &str) +{ + int pos = str.length(); + + while (pos>1 && (str[pos-1] & (~127)) == 0 && (isspace(str[pos-1]) || isdigit(str[pos-1]))) { + pos--; + } + + if (pos == str.length()) + return 0; + return atoi(str.c_str() + pos); +} + +int extractAnyNumber(const string &str, string &prefix, string &suffix) +{ + const unsigned char *ptr = (const unsigned char*)str.c_str(); + for (size_t k = 0; k &dec) { + if (name.empty()) + return; + + dec.push_back(string()); + + for (size_t i = 0; i < name.size(); i++) { + int bchar = toLowerStripped(name[i]); + if (isspace(bchar) || bchar == '-' || bchar == 160) { + if (!dec.back().empty()) + dec.push_back(string()); + continue; + } + if (!dec.back().empty()) { + int last = *dec.back().rbegin(); + bool lastNum = last >= '0' && last <= '9'; + bool isNum = bchar >= '0' && bchar <= '9'; + + if (lastNum^isNum) + dec.push_back(string()); // Change num/ non-num + } + dec.back().push_back(bchar); + } + if (dec.back().empty()) + dec.pop_back(); + + sort(dec.begin(), dec.end()); +} + +/** Matches H21 L with H21 Lång and H21L + but not Violet with Violet Court, which is obviously wrong. + */ +bool compareClassName(const string &a, const string &b) +{ + if (a == b) + return true; + + vector acanon; + vector bcanon; + + decompseClassName(a, acanon); + decompseClassName(b, bcanon); + + if (acanon.size() != bcanon.size()) + return false; + + for (size_t k = 0; k < acanon.size(); k++) { + if (acanon[k] == bcanon[k]) + continue; + + int sample = acanon[k][0]; + if (sample >= '0' && sample <= '9') + return false; // Numbers must match + + if (acanon[k][0] == bcanon[k][0] && (acanon[k].length() == 1 || bcanon[k].length() == 1)) + continue; // Abbrevation W <-> Women etc + + return false; // No match + } + + return true; // All parts matched +} + +string getErrorMessage(int code) { + LPVOID msg; + int s = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + code, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &msg, 0, NULL); + if (s==0 || !msg) { + if (code != 0) { + char ch[128]; + sprintf_s(ch, "Error code: %d", code); + return ch; + } + return ""; + } + + string str = LPCTSTR(msg); + if (str.empty() && code>0) { + char ch[128]; + sprintf_s(ch, "Error code: %d", code); + str = ch; + } + + LocalFree(msg); + return str; +} + +#define HLSMAX 252 /* H,L, and S vary over 0-HLSMAX */ +#define RGBMAX 255 /* R,G, and B vary over 0-RGBMAX */ + /* HLSMAX BEST IF DIVISIBLE BY 6 */ + /* RGBMAX, HLSMAX must each fit in a byte. */ + +/* Hue is undefined if Saturation is 0 (grey-scale) */ +#define UNDEFINED (HLSMAX*2/3) + +HLS &HLS::RGBtoHLS(DWORD lRGBColor) +{ + WORD R,G,B; /* input RGB values */ + BYTE cMax,cMin; /* max and min RGB values */ + WORD Rdelta,Gdelta,Bdelta; /* intermediate value: % of spread from max + */ + /* get R, G, and B out of DWORD */ + R = GetRValue(lRGBColor); + G = GetGValue(lRGBColor); + B = GetBValue(lRGBColor); + WORD &L = lightness; + WORD &H = hue; + WORD &S = saturation; + + /* calculate lightness */ + cMax = (BYTE)max( max(R,G), B); + cMin = (BYTE)min( min(R,G), B); + L = ( ((cMax+cMin)*HLSMAX) + RGBMAX )/(2*RGBMAX); + + if (cMax == cMin) { /* r=g=b --> achromatic case */ + S = 0; /* saturation */ + H = UNDEFINED; /* hue */ + } + else { /* chromatic case */ + /* saturation */ + if (L <= (HLSMAX/2)) + S = ( ((cMax-cMin)*HLSMAX) + ((cMax+cMin)/2) ) / (cMax+cMin); + else + S = ( ((cMax-cMin)*HLSMAX) + ((2*RGBMAX-cMax-cMin)/2) ) + / (2*RGBMAX-cMax-cMin); + + /* hue */ + Rdelta = ( ((cMax-R)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin); + Gdelta = ( ((cMax-G)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin); + Bdelta = ( ((cMax-B)*(HLSMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin); + + if (R == cMax) + H = Bdelta - Gdelta; + else if (G == cMax) + H = (HLSMAX/3) + Rdelta - Bdelta; + else /* B == cMax */ + H = ((2*HLSMAX)/3) + Gdelta - Rdelta; + + if (H < 0) + H += HLSMAX; + if (H > HLSMAX) + H -= HLSMAX; + } + return *this; +} + + +/* utility routine for HLStoRGB */ +WORD HLS::HueToRGB(WORD n1, WORD n2, WORD hue) const +{ + /* range check: note values passed add/subtract thirds of range */ + if (hue < 0) + hue += HLSMAX; + + if (hue > HLSMAX) + hue -= HLSMAX; + + /* return r,g, or b value from this tridrant */ + if (hue < (HLSMAX/6)) + return ( n1 + (((n2-n1)*hue+(HLSMAX/12))/(HLSMAX/6)) ); + if (hue < (HLSMAX/2)) + return ( n2 ); + if (hue < ((HLSMAX*2)/3)) + return ( n1 + (((n2-n1)*(((HLSMAX*2)/3)-hue)+(HLSMAX/12))/(HLSMAX/6)) + ); + else + return ( n1 ); +} + +DWORD HLS::HLStoRGB() const +{ + const WORD &lum = lightness; + const WORD &sat = saturation; + + WORD R,G,B; /* RGB component values */ + WORD Magic1,Magic2; /* calculated magic numbers (really!) */ + + if (sat == 0) { /* achromatic case */ + R=G=B=(lum*RGBMAX)/HLSMAX; + if (hue != UNDEFINED) { + /* ERROR */ + } + } + else { /* chromatic case */ + /* set up magic numbers */ + if (lum <= (HLSMAX/2)) + Magic2 = (lum*(HLSMAX + sat) + (HLSMAX/2))/HLSMAX; + else + Magic2 = lum + sat - ((lum*sat) + (HLSMAX/2))/HLSMAX; + Magic1 = 2*lum-Magic2; + + /* get RGB, change units from HLSMAX to RGBMAX */ + R = (HueToRGB(Magic1,Magic2,hue+(HLSMAX/3))*RGBMAX + + (HLSMAX/2))/HLSMAX; + G = (HueToRGB(Magic1,Magic2,hue)*RGBMAX + (HLSMAX/2)) / HLSMAX; + B = (HueToRGB(Magic1,Magic2,hue-(HLSMAX/3))*RGBMAX + + (HLSMAX/2))/HLSMAX; + } + return(RGB(R,G,B)); +} + +void HLS::lighten(double f) { + lightness = min(HLSMAX, WORD(f*lightness)); +} + +void HLS::saturate(double s) { + saturation = min(HLSMAX, WORD(s*saturation)); +} + +void HLS::colorDegree(double d) { + +} + +bool isAscii(const string &s) { + for (size_t k = 0; k 0; +} + +int convertDynamicBase(const string &s, long long &out) { + out = 0; + if (s.empty()) + return 0; + + bool alpha = false; + bool general = false; + int len = s.length(); + for (int k = 0; k < len; k++) { + unsigned c = s[k]; + if (c >= '0' && c <= '9') + continue; + if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) { + alpha = true; + continue; + } + general = true; + if (c<32) + return 0; // Not a supported character + } + + int base = general ? 256-32 : (alpha ? 36 : 10); + long long factor = 1; + for (int k = len-1; k >= 0; k--) { + unsigned c = s[k]&0xFF; + if (general) + c -= 32; + else { + if (c >= '0' && c <= '9') + c -= '0'; + else if (c >= 'A' && c <= 'Z') + c -= 'A'-10; + else if (c >= 'a' && c <= 'z') + c -= 'a'-10; + } + out += factor * c; + factor *= base; + } + + return base; +} + +void convertDynamicBase(long long val, int base, char out[16]) { + int len = 0; + while (val != 0) { + unsigned int c = val % base; + val = val / base; + char cc; + if (base == 10) + cc = '0' + c; + else if (base == 36) { + if (c < 10) + cc = '0' + c; + else + cc = 'A' + c - 10; + } + else { + cc = c+32; + } + out[len++] = cc; + } + out[len] = 0; + reverse(out, out+len); +} + +bool expandDirectory(const char *file, const char *filetype, vector &res) +{ + WIN32_FIND_DATA fd; + + char dir[MAX_PATH]; + char fullPath[MAX_PATH]; + + if (file[0] == '.') { + GetCurrentDirectory(MAX_PATH, dir); + strcat_s(dir, file+1); + } + else + strcpy_s(dir, MAX_PATH, file); + + if (dir[strlen(dir)-1]!='\\') + strcat_s(dir, MAX_PATH, "\\"); + + strcpy_s(fullPath, MAX_PATH, dir); + strcat_s(dir, MAX_PATH, filetype); + + HANDLE h=FindFirstFile(dir, &fd); + + if (h == INVALID_HANDLE_VALUE) + return false; + + bool more = true; + + while (more) { + if (fd.cFileName[0] != '.') { + //Avoid .. and . + char fullPathFile[MAX_PATH]; + strcpy_s(fullPathFile, MAX_PATH, fullPath); + strcat_s(fullPathFile, MAX_PATH, fd.cFileName); + res.push_back(fullPathFile); + } + more=FindNextFile(h, &fd)!=0; + } + + FindClose(h); + return true; +} + +string encodeSex(PersonSex sex) { + if (sex == sFemale) + return "F"; + else if (sex == sMale) + return "M"; + else if (sex == sBoth) + return "B"; + else + return ""; +} + +PersonSex interpretSex(const string &sex) { + if (sex == "F" || sex == "K" || sex == "W") + return sFemale; + else if (sex == "M" || sex == "H") + return sMale; + else if (sex == "B") + return sBoth; + else + return sUnknown; +} + +bool matchNumber(int a, const char *b) { + if (a == 0 && b[0]) + return false; + + char bf[32]; + _itoa_s(a, bf, 10); + + // Check matching substring + for (int k = 0; k < 12; k++) { + if (b[k] == 0) + return true; + if (bf[k] != b[k]) + return false; + } + + return false; +} + +string makeValidFileName(const string &input, bool strict) { + string out; + out.reserve(input.size()); + + if (strict) { + for (size_t k = 0; k < input.length(); k++) { + int b = input[k]; + if ( (b>='0' && b<='9') || (b>='a' && b<='z') || (b>='A' && b<='Z') || b == '_' || b=='.' ) + out.push_back(b); + else if (b == ' ' || b == ',') + out.push_back('_'); + else { + b = toLowerStripped(b); + if ( char(b) == 'ö') + b = 'o'; + else if (char(b) == 'ä' || char(b) == 'å' || char(b)== 'à' || char(b)== 'á' || char(b)== 'â' || char(b)== 'ã' || char(b)== 'æ') + b = 'a'; + else if (char(b) == 'ç') + b = 'c'; + else if (char(b) == 'è' || char(b) == 'é' || char(b) == 'ê' || char(b) == 'ë') + b = 'e'; + else if (char(b) == 'ð') + b = 't'; + else if (char(b) == 'ï' || char(b) == 'ì' || char(b) == 'ï' || char(b) == 'î' || char(b) == 'í') + b = 'i'; + else if (char(b) == 'ò' || char(b) == 'ó' || char(b) == 'ô' || char(b) == 'õ' || char(b) == 'ø') + b = 'o'; + else if (char(b) == 'ù' || char(b) == 'ú' || char(b) == 'û' || char(b) == 'ü') + b = 'u'; + else if (char(b) == 'ý') + b = 'y'; + else + b = '-'; + + out.push_back(b); + } + } + } + else { + for (size_t k = 0; k < input.length(); k++) { + unsigned b = input[k]; + if (b < 32 || b == '*' || b == '?' || b==':' || b=='/' || b == '\\') + b = '_'; + out.push_back(b); + } + } + return out; +} + +void capitalize(string &str) { + if (str.length() > 0) { + char c = str[0] & 0xFF; + + if (c>='a' && c<='z') + c += ('A' - 'a'); + else if (c == 'ö') + c = 'Ö'; + else if (c == 'ä') + c = 'Ä'; + else if (c == 'å') + c = 'Å'; + else if (c == 'é') + c = 'É'; + + str[0] = c; + } +} + +/** Return bias in seconds. UTC = local time + bias. */ +int getTimeZoneInfo(const string &date) { + static char lastDate[16] = {0}; + static int lastValue = -1; + // Local cacheing + if (lastValue != -1 && lastDate == date) { + return lastValue; + } + strcpy_s(lastDate, 16, date.c_str()); +// TIME_ZONE_INFORMATION tzi; + SYSTEMTIME st; + convertDateYMS(date, st, false); + st.wHour = 12; + SYSTEMTIME utc; + TzSpecificLocalTimeToSystemTime(0, &st, &utc); + + int datecode = ((st.wYear * 12 + st.wMonth) * 31) + st.wDay; + int datecodeUTC = ((utc.wYear * 12 + utc.wMonth) * 31) + utc.wDay; + + int daydiff = 0; + if (datecodeUTC > datecode) + daydiff = 1; + else if (datecodeUTC < datecode) + daydiff = -1; + + int t = st.wHour * 3600; + int tUTC = daydiff * 24 * 3600 + utc.wHour * 3600 + utc.wMinute * 60 + utc.wSecond; + + lastValue = tUTC - t; + return lastValue; +} + +string getTimeZoneString(const string &date) { + int a = getTimeZoneInfo(date); + if (a == 0) + return "+00:00"; + else if (a>0) { + char bf[12]; + sprintf_s(bf, "-%02d:%02d", a/3600, (a/60)%60); + return bf; + } + else { + char bf[12]; + sprintf_s(bf, "+%02d:%02d", a/-3600, (a/-60)%60); + return bf; + } +} + +bool compareBib(const string &b1, const string &b2) { + int l1 = b1.length(); + int l2 = b2.length(); + if (l1 != l2) + return l1 < l2; + + unsigned char maxc = 0, minc = 255; + for (int k = 0; k < l1; k++) { + unsigned char b = b1[k]; + maxc = max(maxc, b); + minc = min(minc, b); + } + for (int k = 0; k < l2; k++) { + unsigned char b = b2[k]; + maxc = max(maxc, b); + minc = min(minc, b); + } + + unsigned coeff = maxc-minc + 1; + + unsigned z1 = 0; + for (int k = 0; k < l1; k++) { + unsigned char b = b1[k]-minc; + z1 = coeff * z1 + b; + } + + unsigned z2 = 0; + for (int k = 0; k < l2; k++) { + unsigned char b = b2[k]-minc; + z2 = coeff * z2 + b; + } + + return z1 < z2; +} + + +/// Split a name into first name and last name +int getNameCommaSplitPoint(const string &name) { + int commaSplit = -1; + + for (unsigned k = 1; k + 1 < name.size(); k++) { + if (name[k] == ',') { + commaSplit = k; + break; + } + } + + if (commaSplit >= 0) { + commaSplit += 2; + } + + return commaSplit; +} + + +/// Split a name into first name and last name +int getNameSplitPoint(const string &name) { + int split[10]; + int nSplit = 0; + + for (unsigned k = 1; k + 1=9 ) + break; + } + } + if (nSplit == 1) + return split[0] + 1; + else if (nSplit == 0) + return -1; + else { + const oWordList &givenDB = lang.get().getGivenNames(); + int sp_ix = 0; + for (int k = 1; k= 'a' && c <= 'z' && !noCapitalize(str, i)) + str[i] = c + ('A' - 'a'); + init = isspace(c) != 0; + } +} + +void MeOSFileLock::unlockFile() { + if (lockedFile != INVALID_HANDLE_VALUE) + CloseHandle(lockedFile); + + lockedFile = INVALID_HANDLE_VALUE; +} + +void MeOSFileLock::lockFile(const string &file) { + unlockFile(); + lockedFile = CreateFile(file.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + //lockedFile = _open(file.c_str(), _O_RDWR); + if (lockedFile == INVALID_HANDLE_VALUE) { + int err = GetLastError(); + if (err == ERROR_SHARING_VIOLATION) + throw meosException("open_error_locked"); + else { + TCHAR buff[256]; + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, err, 0, buff, sizeof(buff), 0); + throw meosException("open_error#" + file + "#" + buff); + } + } +} + +void processGeneralTime(const string &generalTime, string &meosTime, string &meosDate) { + meosTime = ""; + meosDate = ""; + vector parts; + split(generalTime, ":-,. /\t", parts); + + // Indices into parts + int year = -2; + int month = -2; + int day = -2; + + int hour = -2; + int minute = -2; + int second = -2; + int subsecond = -2; + + int found = 0, base = -1, iter = 0; + bool pm = strstr(generalTime.c_str(), "PM") != 0 || + strstr(generalTime.c_str(), "pm") != 0; + + while (iter < 2 && second==-2) { + if (base == found) + iter++; + + base = found; + for (size_t k = 0; k < parts.size(); k++) { + if (parts[k].empty()) + continue; + int number = atoi(parts[k].c_str()); + if (number == 0 && parts[k][0] != '0') + number = -1; // Not a number + + if (iter == 0) { + // Date + if (number > 1900 && number < 3000 && year < 0) { + found++; + year = k; + } + else if (number >= 1 && number <= 12 && month < 0 && (year == k+1 || year == k-1) ) { + month = k; + found++; + } + else if (number >= 1 && number <=31 && day < 0 && (month == k+1 || month == k-1)) { + day = k; + found++; + iter++; + break; + } + else if (number > 1011900 && number < 30000101 && year < 0 && month < 0 && day < 0) { + day = k; //Date with format 20160906 or 06092016 + month = k; + year = k; + found++; + break; + } + } + else if (iter == 1) { + + // Time + if (number >= 0 && number <= 24 && year != k && day != k && month != k && hour < 0) { + hour = k; + found++; + } + else if (number >= 0 && number <= 59 && minute < 0 && hour == k-1) { + minute = k; + found++; + } + else if (number >= 0 && number <= 59 && second < 0 && minute == k-1) { + second = k; + found++; + } + else if (number >= 0 && number < 1000 && subsecond < 0 && second == k-1 && k != year) { + subsecond = k; + found++; + iter++; + break; + } + } + } + } + + if (second >= 0 && minute >= 0 && hour>= 0) { + if (!pm) + meosTime = parts[hour] + ":" + parts[minute] + ":" + parts[second]; + else { + int rawHour = atoi(parts[hour].c_str()); + if (rawHour < 12) + rawHour+=12; + meosTime = itos(rawHour) + ":" + parts[minute] + ":" + parts[second]; + } + } + + if (year >= 0 && month >= 0 && day >= 0) { + int y = -1, m = -1, d = -1; + if (year != month) { + y = atoi(parts[year].c_str()); + m = atoi(parts[month].c_str()); + d = atoi(parts[day].c_str()); + + //meosDate = parts[year] + "-" + parts[month] + "-" + parts[day]; + } + else { + int td = atoi(parts[year].c_str()); + int y1 = td / 10000; + int m1 = (td / 100) % 100; + int d1 = td % 100; + bool ok = y1 > 2000 && y1 < 3000 && m1>=1 && m1<=12 && d1 >= 1 && d1 <= 31; + if (!ok) { + y1 = td % 10000; + m1 = (td / 10000) % 100; + d1 = (td / 1000000); + + ok = y1 > 2000 && y1 < 3000 && m1>=1 && m1<=12 && d1 >= 1 && d1 <= 31; + } + if (ok) { + y = y1; + m = m1; + d = d1; + } + meosDate = itos(y1) + "-" + itos(m1) + "-" + itos(d1); + } + if (y > 0) { + char bf[24]; + sprintf_s(bf, 24, "%d-%02d-%02d", y, m, d); + meosDate = bf; + } + } + +} diff --git a/code/meos_util.h b/code/meos_util.h new file mode 100644 index 0000000..3c06743 --- /dev/null +++ b/code/meos_util.h @@ -0,0 +1,236 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include +#include + +class StringCache { +private: + vector cache; + size_t ix; + + vector wcache; + size_t wix; +public: + static StringCache &getInstance(); + + void init() {cache.resize(256); wcache.resize(256);} + void clear() {cache.clear(); wcache.clear();} + + std::string &get() { + if ( (++ix) >= cache.size() ) + ix = 0; + int lx = ix; + return cache[lx]; + } + + std::wstring &wget() { + if ( (++wix) >= wcache.size() ) + wix = 0; + int lx = wix; + return wcache[lx]; + } +}; + +string convertSystemTime(const SYSTEMTIME &st); +string convertSystemTimeOnly(const SYSTEMTIME &st); +string convertSystemDate(const SYSTEMTIME &st); +string getLocalTime(); +string getLocalDate(); +string getLocalTimeOnly(); + +// Get a day number after a fixed day some time ago... +int getRelativeDay(); + +/// Get time and date in a format that forms a part of a filename +string getLocalTimeFileName(); + +const string &getTimeMS(int m); +const string &formatTime(int rt); +const string &formatTimeHMS(int rt); +string formatTimeIOF(int rt, int zeroTime); + +int convertDateYMS(const string &m, bool checkValid); +int convertDateYMS(const string &m, SYSTEMTIME &st, bool checkValid); + +// Convert a "general" time string to a MeOS compatible time string +void processGeneralTime(const string &generalTime, string &meosTime, string &meosDate); + +// Format number date 20160421 -> 2016-04-21 (if iso) or according to a custom format otherwise +string formatDate(int m, bool useIsoFormat); + +__int64 SystemTimeToInt64Second(const SYSTEMTIME &st); +SYSTEMTIME Int64SecondToSystemTime(__int64 time); + +#define NOTIME 0x7FFFFFFF + +//Returns a time converted from +/-MM:SS or NOTIME, in seconds +int convertAbsoluteTimeMS(const string &m); +// Parses a time on format HH:MM:SS+01:00Z or HHMMSS+0100Z (but ignores time zone) +int convertAbsoluteTimeISO(const string &m); + +/** Returns a time converted from HH:MM:SS or -1, in seconds + @param m time to convert + @param daysZeroTime -1 do not support days syntax, positive interpret days w.r.t the specified zero time. +*/ +int convertAbsoluteTimeHMS(const string &m, int daysZeroTime); + +const vector &split(const string &line, const string &separators, vector &split_vector); +const string &unsplit(const vector &split_vector, const string &separators, string &line); + +const string &MakeDash(const string &t); +const string &MakeDash(const char *t); +string FormatRank(int rank); +const string &itos(int i); +string itos(unsigned long i); +string itos(unsigned int i); +string itos(__int64 i); + +///Lower case match (filt_lc must be lc) +bool filterMatchString(const string &c, const char *filt_lc); +bool matchNumber(int number, const char *key); + +int getMeosBuild(); +string getMeosDate(); +string getMeosFullVersion(); +string getMajorVersion(); +string getMeosCompectVersion(); + +void getSupporters(vector &supp); + +int countWords(const char *p); + +string trim(const string &s); + +bool fileExist(const char *file); + +bool stringMatch(const string &a, const string &b); + +const char *decodeXML(const char *in); +const string &decodeXML(const string &in); +const string &encodeXML(const string &in); + +/** Extend a year from 03 -> 2003, 97 -> 1997 etc */ +int extendYear(int year); + +/** Get current year, e.g., 2010 */ +int getThisYear(); + +/** Translate a char to lower/stripped of accents etc.*/ +int toLowerStripped(int c); + +/** Canonize a person/club name */ +const char *canonizeName(const char *name); + +/** String distance between 0 and 1. 0 is equal*/ +double stringDistance(const char *a, const char *b); + + +/** Get a number suffix, Start 1 -> 1. Zero for none*/ +int getNumberSuffix(const string &str); + +/// Extract any number from a string and return the number, prefix and suffix +int extractAnyNumber(const string &str, string &prefix, string &suffix); + + +/** Compare classnames, match H21 Elit with H21E and H21 E */ +bool compareClassName(const string &a, const string &b); + +/** Get WinAPI error from code */ +string getErrorMessage(int code); + +class HLS { +private: + WORD HueToRGB(WORD n1, WORD n2, WORD hue) const; +public: + + HLS(WORD H, WORD L, WORD S) : hue(H), lightness(L), saturation(S) {} + HLS() : hue(0), lightness(0), saturation(1) {} + WORD hue; + WORD lightness; + WORD saturation; + void lighten(double f); + void saturate(double s); + void colorDegree(double d); + HLS &RGBtoHLS(DWORD lRGBColor); + DWORD HLStoRGB() const; +}; + +#ifndef MEOSDB + void unzip(const char *zipfilename, const char *password, vector &extractedFiles); + int zip(const char *zipfilename, const char *password, const vector &files); +#endif + +bool isAscii(const string &s); +bool isNumber(const string &s); +int convertDynamicBase(const string &s, long long &out); +void convertDynamicBase(long long val, int base, char out[16]); + +/// Find all files in dir matching given file pattern +bool expandDirectory(const char *dir, const char *pattern, vector &res); + +enum PersonSex {sFemale = 1, sMale, sBoth, sUnknown}; + +PersonSex interpretSex(const string &sex); + +string encodeSex(PersonSex sex); + +string makeValidFileName(const string &input, bool strict); + +/** Initial capital letter. */ +void capitalize(string &str); + +/** Initial capital letter for each word. */ +void capitalizeWords(string &str); + +string getTimeZoneString(const string &date); + +/** Return bias in seconds. UTC = local time + bias. */ +int getTimeZoneInfo(const string &date); + +/** Compare bib numbers (which may contain non-digits, e.g. A-203, or 301a, 301b)*/ +bool compareBib(const string &b1, const string &b2); + +/** Split a name into Given, Family, and return Given.*/ +string getGivenName(const string &name); + +/** Split a name into Given, Family, and return Family.*/ +string getFamilyName(const string &name); + +/** Simple file locking class to prevent opening in different MeOS session. */ +class MeOSFileLock { + HANDLE lockedFile; + // Not supported + MeOSFileLock(const MeOSFileLock &); + const MeOSFileLock &operator=(const MeOSFileLock &); + +public: + MeOSFileLock() {lockedFile = INVALID_HANDLE_VALUE;} + ~MeOSFileLock() {unlockFile();} + + void unlockFile(); + void lockFile(const string &file); +}; + +namespace MeOSUtil { + extern int useHourFormat; +} diff --git a/code/meos_vc10.sln b/code/meos_vc10.sln new file mode 100644 index 0000000..9651228 --- /dev/null +++ b/code/meos_vc10.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "meos", "meos.vcxproj", "{B854EF2A-2BB7-4D62-B08B-96BD64B347E8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{4614D306-CDFF-466A-AAA3-6017F2237DB0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|Win64 = Debug|Win64 + Release|Win32 = Release|Win32 + Release|Win64 = Release|Win64 + test|Win32 = test|Win32 + test|Win64 = test|Win64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.Debug|Win32.ActiveCfg = Debug|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.Debug|Win32.Build.0 = Debug|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.Debug|Win64.ActiveCfg = Debug|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.Release|Win32.ActiveCfg = Release|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.Release|Win32.Build.0 = Release|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.Release|Win64.ActiveCfg = Release|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.test|Win32.ActiveCfg = test|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.test|Win32.Build.0 = test|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.test|Win64.ActiveCfg = test|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/code/meos_vc15.sln b/code/meos_vc15.sln new file mode 100644 index 0000000..2c0f00c --- /dev/null +++ b/code/meos_vc15.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "meos", "meosvc15.vcxproj", "{B854EF2A-2BB7-4D62-B08B-96BD64B347E8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + test|x86 = test|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.Debug|x86.ActiveCfg = Debug|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.Debug|x86.Build.0 = Debug|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.Release|x86.ActiveCfg = Release|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.Release|x86.Build.0 = Release|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.test|x86.ActiveCfg = test|Win32 + {B854EF2A-2BB7-4D62-B08B-96BD64B347E8}.test|x86.Build.0 = test|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/code/meosdb/MeosSQL.cpp b/code/meosdb/MeosSQL.cpp new file mode 100644 index 0000000..f27aa99 --- /dev/null +++ b/code/meosdb/MeosSQL.cpp @@ -0,0 +1,3664 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + + +#include "StdAfx.h" + +#include +#include +#include + + +#include "MeosSQL.h" + +#include "../oRunner.h" +#include "../oEvent.h" +#include "../meos_util.h" +#include "../RunnerDB.h" +#include "../progress.h" +#include "../metalist.h" +#include "../MeOSFeatures.h" + +using namespace mysqlpp; + +MeosSQL::MeosSQL(void) +{ + monitorId=0; + warnedOldVersion=false; + buildVersion=getMeosBuild(); +} + +MeosSQL::~MeosSQL(void) +{ +} + +void MeosSQL::alert(const string &s) +{ + errorMessage=s; +} + +string C_INT(string name) +{ + return " "+name+" INT NOT NULL DEFAULT 0, "; +} + +string C_INT64(string name) +{ + return " "+name+" BIGINT NOT NULL DEFAULT 0, "; +} + +string C_STRING(string name, int len=64) +{ + char bf[16]; + sprintf_s(bf, "%d", len); + return " "+name+" VARCHAR("+ bf +") NOT NULL DEFAULT '', "; +} + +string C_TEXT(string name) +{ + return " "+name+" TEXT NOT NULL, "; +} + +string C_MTEXT(string name) +{ + return " "+name+" MEDIUMTEXT NOT NULL, "; +} + + +string C_UINT(string name) +{ + return " "+name+" INT UNSIGNED NOT NULL DEFAULT 0, "; +} + +string C_START(string name) +{ + return "CREATE TABLE IF NOT EXISTS "+name+" (" + + " Id INT AUTO_INCREMENT NOT NULL, PRIMARY KEY (Id), "; +} + +string C_START_noid(string name) +{ + return "CREATE TABLE IF NOT EXISTS "+name+" ("; +} + +string C_END() +{ + return " Modified TIMESTAMP, Counter INT UNSIGNED NOT NULL DEFAULT 0, " + "INDEX(Counter), INDEX(Modified), Removed BOOL NOT NULL DEFAULT 0) " + "ENGINE = MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci"; +} + +string C_END_noindex() +{ + return " Modified TIMESTAMP) " + "ENGINE = MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci"; +} + +string limitLength(const string &in, size_t max) { + if (in.length() < max) + return in; + else + return in.substr(0, max); +} + +bool MeosSQL::listCompetitions(oEvent *oe, bool keepConnection) { + errorMessage.clear(); + CmpDataBase=""; + if (oe->isClient()) + throw std::exception("Runtime error."); + + oe->serverName.clear(); + + if (!keepConnection) { + try { + con.connect("", oe->MySQLServer.c_str(), oe->MySQLUser.c_str(), + oe->MySQLPassword.c_str(), oe->MySQLPort); + } + catch (const Exception& er) { + alert(string(er.what()) + " MySQL Error"); + return false; + } + } + + if (!con.connected()) { + errorMessage = "Internal error connecting to MySQL"; + return false; + } + + string serverInfo = con.server_info(); + + if (serverInfo < "5.0.3") { + errorMessage = "Minst MySQL X krävs. Du använder version Y.#5.0.3#" + serverInfo; + return false; + } + + serverName=oe->MySQLServer; + serverUser=oe->MySQLUser; + serverPassword=oe->MySQLPassword; + serverPort=oe->MySQLPort; + + //Store verified server name + oe->serverName=serverName; + + NoExceptions ne(con); + + if (!con.select_db("MeOSMain")){ + con.create_db("MeOSMain"); + con.select_db("MeOSMain"); + } + + Query query = con.query(); + + try{ + query << C_START("oEvent") + << C_STRING("Name", 128) + << C_STRING("Annotation", 128) + << C_STRING("Date", 32) + << C_UINT("ZeroTime") + << C_STRING("NameId", 64) + << " Version INT UNSIGNED DEFAULT 1, " << C_END(); + + query.execute(); + + query.reset(); + Result res = query.store("DESCRIBE oEvent"); + int nr = (int)res.num_rows(); + if (nr == 9) { + query.execute("ALTER TABLE oEvent ADD COLUMN " + "Annotation VARCHAR(128) NOT NULL DEFAULT '' AFTER Name"); + } + } + catch (const Exception& er) { + alert(string(er.what())+ " MySQL Error"); + // Try a repair operation + try { + query.execute("REPAIR TABLE oEvent EXTENDED"); + } + catch (const Exception&) { + } + + return false; + } + + query.reset(); + + try { + query << "SELECT * FROM oEvent"; + + Result res = query.store(); + + if (res) { + for (int i=0; idbVersion) { + CompetitionInfo ci; + ci.Name = row["Name"]; + ci.Annotation = row["Annotation"]; + ci.Id = row["Id"]; + ci.Date = row["Date"]; + ci.FullPath = row["NameId"]; + ci.NameId = row["NameId"]; + ci.Server = oe->MySQLServer; + ci.ServerPassword = oe->MySQLPassword; + ci.ServerUser = oe->MySQLUser; + ci.ServerPort = oe->MySQLPort; + + oe->cinfo.push_front(ci); + } + else { + CompetitionInfo ci; + ci.Name = row["Name"]; + ci.Date = row["Date"]; + ci.Annotation = row["Annotation"]; + ci.Id=0; + ci.Server="bad"; + ci.FullPath=row["NameId"]; + oe->cinfo.push_front(ci); + } + } + } + } + catch (const Exception& er) { + // Try a repair operation + try { + query.execute("REPAIR TABLE oEvent EXTENDED"); + } + catch (const Exception&) { + } + + setDefaultDB(); + alert(string(er.what()) + " MySQL Error"); + return false; + } + + return true; +} + +bool MeosSQL::repairTables(const string &db, vector &output) { + // Update list database; + con.select_db(db); + output.clear(); + + if (!con.connected()) { + errorMessage = "Internal error connecting to MySQL"; + return false; + } + + Query q = con.query(); + Result res = q.store("SHOW TABLES"); + int numtab = (int)res.num_rows(); + vector tb; + for (int k = 0; k < numtab; k++) + tb.push_back(res.at(k).at(0).c_str()); + + for (int k = 0; k < numtab; k++) { + string sql = "REPAIR TABLE " + tb[k] + " EXTENDED"; + try { + res = q.store(sql); + string msg; + Row row = res.at(0); + for (size_t j = 0; j < row.size(); j++) { + string t = row.at(j).get_string(); + if (!msg.empty()) + msg += ", "; + msg += t; + } + output.push_back(msg); + } + catch (const Exception &ex) { + string err1 = "FAILED: " + sql; + output.push_back(err1); + output.push_back(ex.what()); + } + } + return true; +} + +bool MeosSQL::createRunnerDB(oEvent *oe, Query &query) +{ + query.reset(); + + query << C_START_noid("dbRunner") + << C_STRING("Name", 31) << C_INT("CardNo") + << C_INT("Club") << C_STRING("Nation", 3) + << C_STRING("Sex", 1) << C_INT("BirthYear") + << C_INT64("ExtId") << C_END_noindex(); + + query.execute(); + + query.reset(); + query << C_START_noid("dbClub") + << " Id INT NOT NULL, " + << C_STRING("Name", 64) + << oe->oClubData->generateSQLDefinition() << C_END_noindex(); + query.execute(); + + // Ugrade dbClub + upgradeDB("dbClub", oe->oClubData); + + return true; +} + +void MeosSQL::getColumns(const string &table, set &output) { + Query query = con.query(); + output.clear(); + Result res = query.store("DESCRIBE " + table); + for (size_t k = 0; k < res.size(); k++) { + output.insert((const char *)res.at(k).at(0)); + } +} + +void MeosSQL::upgradeDB(const string &db, oDataContainer const * dc) { + set eCol; + getColumns(db, eCol); + + Query query = con.query(); + + if (db == "oEvent") { + if (!eCol.count("Annotation")) { + query.execute("ALTER TABLE oEvent ADD COLUMN " + "Annotation VARCHAR(128) NOT NULL DEFAULT '' AFTER Name"); + } + if (!eCol.count("Lists")) { + string sql = "ALTER TABLE oEvent ADD COLUMN " + C_MTEXT("Lists"); + sql = sql.substr(0, sql.length() - 2); + query.execute(sql); + } + } + else if (db == "oCourse") { + if (!eCol.count("Legs")) { + string sql = "ALTER TABLE oCourse ADD COLUMN " + C_STRING("Legs", 1024); + sql = sql.substr(0, sql.length() - 2); + query.execute(sql); + } + } + else if (db == "oRunner") { + if (!eCol.count("InputTime")) { + string sql = "ALTER TABLE oRunner "; + sql += "ADD COLUMN " + C_INT("InputTime"); + sql += "ADD COLUMN " + C_INT("InputStatus"); + sql += "ADD COLUMN " + C_INT("InputPoints"); + sql += "ADD COLUMN " + C_INT("InputPlace"); + sql = sql.substr(0, sql.length() - 2); + query.execute(sql); + } + } + + // Ugrade table + string sqlAdd = dc->generateSQLDefinition(eCol); + if (!sqlAdd.empty()) { + query.execute("ALTER TABLE " + db + " " + sqlAdd); + } +} + +bool MeosSQL::openDB(oEvent *oe) +{ + clearReadTimes(); + errorMessage.clear(); + if (!con.connected() && !listCompetitions(oe, false)) + return false; + + try{ + con.select_db("MeOSMain"); + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what()) + " MySQL Error. Select MeosMain"); + setDefaultDB(); + return 0; + } + monitorId=0; + string dbname=oe->CurrentNameId; + + try { + Query query = con.query(); + query << "SELECT * FROM oEvent WHERE NameId=" << quote << dbname; + Result res = query.store(); + + if (res && res.num_rows()>=1) { + Row row=res.at(0); + + int version = row["Version"]; + + if (version < oEvent::dbVersion) { + query.reset(); + query << "UPDATE oEvent SET Version=" << oEvent::dbVersion << " WHERE Id=" << row["Id"]; + query.execute(); + } + else if (version > oEvent::dbVersion) { + alert("A newer version av MeOS is required."); + return false; + } + /* + if (version != oe->dbVersion) { + // Wrong version. Drop and reset. + query.reset(); + query << "DELETE FROM oEvent WHERE Id=" << row["Id"]; + query.execute(); + con.drop_db(dbname); + return openDB(oe); + }*/ + + oe->Id=row["Id"]; //Don't synchronize more here... + } + else { + query.reset(); + query << "INSERT INTO oEvent SET Name='-', Date='', NameId=" << quote << dbname + << ", Version=" << oe->dbVersion; + + ResNSel res=query.execute(); + + if (res){ + oe->Id=static_cast(res.insert_id); + } + } + } + catch (const mysqlpp::Exception& er){ + setDefaultDB(); + alert(string(er.what()) + " MySQL Error. Select DB."); + return 0; + } + + { + mysqlpp::NoExceptions ne(con); + + if (!con.select_db(dbname)){ + con.create_db(dbname); + con.select_db(dbname); + } + } + + CmpDataBase=dbname; + + Query query = con.query(); + try { + //Real version of oEvent db + query << C_START("oEvent") + << C_STRING("Name", 128) + << C_STRING("Annotation", 128) + << C_STRING("Date", 32) + << C_UINT("ZeroTime") + << C_STRING("NameId", 64) + << C_UINT("BuildVersion") + << oe->getDI().generateSQLDefinition() + << C_MTEXT("Lists") << C_END(); + query.execute(); + + // Upgrade oEvent + upgradeDB("oEvent", oe->oEventData); + + query.reset(); + query << C_START("oRunner") + << C_STRING("Name") << C_INT("CardNo") + << C_INT("Club") << C_INT("Class") << C_INT("Course") << C_INT("StartNo") + << C_INT("StartTime") << C_INT("FinishTime") + << C_INT("Status") << C_INT("Card") << C_STRING("MultiR", 200) + << C_INT("InputTime") << C_INT("InputStatus") << C_INT("InputPoints") << C_INT("InputPlace") + << oe->oRunnerData->generateSQLDefinition() << C_END(); + + query.execute(); + + // Ugrade oRunner + upgradeDB("oRunner", oe->oRunnerData); + + query.reset(); + query << C_START("oCard") + << C_INT("CardNo") + << C_UINT("ReadId") + << C_STRING("Punches", 1024) << C_END(); + + query.execute(); + + query.reset(); + query << C_START("oClass") + << C_STRING("Name", 128) + << C_INT("Course") + << C_MTEXT("MultiCourse") + << C_STRING("LegMethod", 1024) + << oe->oClassData->generateSQLDefinition() << C_END(); + query.execute(); + + // Ugrade oClass + upgradeDB("oClass", oe->oClassData); + + query.reset(); + query << C_START("oClub") + << C_STRING("Name", 128) + << oe->oClubData->generateSQLDefinition() << C_END(); + query.execute(); + + // Ugrade oClub + upgradeDB("oClub", oe->oClubData); + + query.reset(); + query << C_START("oControl") + << C_STRING("Name", 128) + << C_STRING("Numbers", 128) + << C_UINT("Status") + << oe->oControlData->generateSQLDefinition() << C_END(); + query.execute(); + + // Ugrade oRunner + upgradeDB("oControl", oe->oControlData); + + + query.reset(); + query << C_START("oCourse") + << C_STRING("Name") + << C_STRING("Controls", 512) + << C_UINT("Length") + << C_STRING("Legs", 1024) + << oe->oCourseData->generateSQLDefinition() << C_END(); + query.execute(); + + // Ugrade oCourse + upgradeDB("oCourse", oe->oCourseData); + + query.reset(); + query << C_START("oTeam") + << C_STRING("Name") << C_STRING("Runners", 256) + << C_INT("Club") << C_INT("Class") + << C_INT("StartTime") << C_INT("FinishTime") + << C_INT("Status") << C_INT("StartNo") + << oe->oTeamData->generateSQLDefinition() << C_END(); + query.execute(); + + // Ugrade oTeam + upgradeDB("oTeam", oe->oTeamData); + + query.reset(); + query << C_START("oPunch") + << C_INT("CardNo") + << C_INT("Time") + << C_INT("Type") << C_END(); + query.execute(); + + query.reset(); + query << C_START("oMonitor") + << C_STRING("Client") + << C_UINT("Count") + << C_END(); + query.execute(); + + query.reset(); + query << "CREATE TABLE IF NOT EXISTS oCounter (" + << "CounterId INT NOT NULL, " + << C_UINT("oControl") + << C_UINT("oCourse") + << C_UINT("oClass") + << C_UINT("oCard") + << C_UINT("oClub") + << C_UINT("oPunch") + << C_UINT("oRunner") + << C_UINT("oTeam") + << C_UINT("oEvent") + << " Modified TIMESTAMP) ENGINE = MyISAM"; + query.execute(); + + mysqlpp::Result res = query.store("SELECT CounterId FROM oCounter"); + if (res.num_rows()==0) { + query.reset(); + query << "INSERT INTO oCounter SET CounterId=1, oPunch=1, oTeam=1, oRunner=1"; + query.execute(); + } + + // Create runner/club DB + createRunnerDB(oe, query); + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what()) + " MySQL Error."); + return 0; + } + + return true; +} + +bool MeosSQL::getErrorMessage(char *bf) +{ + strcpy_s(bf, 256, errorMessage.c_str()); + return !errorMessage.empty(); +} + +bool MeosSQL::closeDB() +{ + CmpDataBase=""; + errorMessage.clear(); + + try { + con.close(); + } + catch (const mysqlpp::Exception&) { + } + + return true; +} + + +//CAN BE RUN IN A SEPARTE THREAD. Access nothing without thinking... +//No other MySQL-call will take place in parallell. +bool MeosSQL::reConnect() +{ + errorMessage.clear(); + + if (CmpDataBase.empty()) { + errorMessage="No database selected."; + return false; + } + + try { + con.close(); + } + catch (const mysqlpp::Exception&) { + } + + try { + con.connect("", serverName.c_str(), serverUser.c_str(), + serverPassword.c_str(), serverPort); + } + catch (const Exception& er) { + errorMessage=er.what(); + return false; + } + + try { + con.select_db(CmpDataBase); + } + catch (const Exception& er) { + errorMessage=er.what(); + return false; + } + + return true; +} + +OpFailStatus MeosSQL::SyncUpdate(oEvent *oe) +{ + OpFailStatus retValue = opStatusOK; + errorMessage.clear(); + if (CmpDataBase.empty()) + return opStatusFail; + + try{ + con.select_db("MeOSMain"); + + mysqlpp::Query queryset = con.query(); + queryset << "UPDATE oEvent SET Name=" << quote << limitLength(oe->Name, 128) << ", " + << " Annotation=" << quote << limitLength(oe->Annotation, 128) << ", " + << " Date=" << quote << oe->Date << ", " + << " NameId=" << quote << oe->CurrentNameId << ", " + << " ZeroTime=" << unsigned(oe->ZeroTime) + << " WHERE Id=" << oe->Id; + + queryset.execute(); + //syncUpdate(queryset, "oEvent", oe, true); + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [UPDATING oEvent]"); + setDefaultDB(); + return opStatusFail; + } + + try{ + con.select_db(CmpDataBase); + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [OPENING] "+CmpDataBase); + return opStatusFail; + } + + { + + string listEnc; + try { + encodeLists(oe, listEnc); + } + catch (std::exception &ex) { + retValue = opStatusWarning; + alert(ex.what()); + } + + mysqlpp::Query queryset = con.query(); + queryset << " Name=" << quote << limitLength(oe->Name, 128) << ", " + << " Annotation=" << quote << limitLength(oe->Annotation, 128) << ", " + << " Date=" << quote << oe->Date << ", " + << " NameId=" << quote << oe->CurrentNameId << ", " + << " ZeroTime=" << unsigned(oe->ZeroTime) << ", " + << " BuildVersion=" << buildVersion << ", " + << " Lists=" << quote << listEnc + << oe->getDI().generateSQLSet(true); + + if (syncUpdate(queryset, "oEvent", oe) == opStatusFail) + return opStatusFail; + } + + con.query().exec("DELETE FROM oCard"); + { + list::iterator it=oe->Cards.begin(); + while(it!=oe->Cards.end()){ + if (!it->isRemoved() && syncUpdate(&*it, true) == opStatusFail) + return opStatusFail; + ++it; + } + } + + con.query().exec("DELETE FROM oClub"); + { + list::iterator it=oe->Clubs.begin(); + while(it!=oe->Clubs.end()){ + if (!it->isRemoved() && syncUpdate(&*it, true) == opStatusFail) + return opStatusFail; + ++it; + } + } + con.query().exec("DELETE FROM oControl"); + { + list::iterator it=oe->Controls.begin(); + while(it!=oe->Controls.end()){ + if (!it->isRemoved() && syncUpdate(&*it, true) == opStatusFail) + return opStatusFail; + ++it; + } + } + con.query().exec("DELETE FROM oCourse"); + { + list::iterator it=oe->Courses.begin(); + while(it!=oe->Courses.end()){ + if (!it->isRemoved() && syncUpdate(&*it, true) == opStatusFail) + return opStatusFail; + ++it; + } + } + con.query().exec("DELETE FROM oClass"); + { + list::iterator it=oe->Classes.begin(); + while(it!=oe->Classes.end()){ + if (!it->isRemoved() && syncUpdate(&*it, true) == opStatusFail) + return opStatusFail; + ++it; + } + } + con.query().exec("DELETE FROM oRunner"); + { + list::iterator it=oe->Runners.begin(); + while(it!=oe->Runners.end()){ + if (!it->isRemoved() && syncUpdate(&*it, true) == opStatusFail) + return opStatusFail; + ++it; + } + } + + con.query().exec("DELETE FROM oTeam"); + { + list::iterator it=oe->Teams.begin(); + while(it!=oe->Teams.end()){ + if (!it->isRemoved() && syncUpdate(&*it, true) == opStatusFail) + return opStatusFail; + ++it; + } + } + + con.query().exec("DELETE FROM oPunch"); + { + list::iterator it=oe->punches.begin(); + while(it!=oe->punches.end()){ + if (!it->isRemoved() && syncUpdate(&*it, true) == opStatusFail) + return opStatusFail; + ++it; + } + } + return retValue; +} + +OpFailStatus MeosSQL::uploadRunnerDB(oEvent *oe) +{ + errorMessage.clear(); + if (CmpDataBase.empty()) + return opStatusFail; + int errorCount = 0; + + ProgressWindow pw(oe->hWnd()); + try { + const vector &cdb = oe->runnerDB->getClubDB(); + size_t size = cdb.size(); + + const vector &rdb = oe->runnerDB->getRunnerDB(); + + if (cdb.size() + rdb.size() > 2000) + pw.init(); + + size_t tz = cdb.size() + rdb.size(); + int s1 = (1000 * cdb.size())/tz; + int s2 = (1000 * rdb.size())/tz; + + // Reset databases + con.query().exec("DELETE FROM dbClub"); + con.query().exec("DELETE FROM dbRunner"); + + for (size_t k = 0; krunnerDB->setDataDate(dateTime); + } + catch (const mysqlpp::Exception& er) { + errorMessage = er.what(); + return opStatusFail; + } + if (errorCount > 0) + return opStatusWarning; + + return opStatusOK; +} + +bool MeosSQL::storeData(oDataInterface odi, const Row &row, unsigned long &revision) { + //errorMessage.clear(); + list varint; + list varstring; + bool success=true; + bool updated = false; + try{ + odi.getVariableInt(varint); + list::iterator it_int; + for(it_int=varint.begin(); it_int!=varint.end(); it_int++) { + if (it_int->data32) { + int val = int(row[it_int->name]); + + if (val != *(it_int->data32)) { + *(it_int->data32) = val; + updated = true; + } + } + else { + __int64 val = row[it_int->name].operator mysqlpp::ulonglong(); + __int64 oldVal = *(it_int->data64); + if (val != oldVal) { + memcpy(it_int->data64, &val, 8); + updated = true; + } + + } + } + } + catch (const BadFieldName&) { + success=false; + } + + try { + odi.getVariableString(varstring); + list::iterator it_string; + for(it_string=varstring.begin(); it_string!=varstring.end(); it_string++) { + if (it_string->store(row[it_string->name].c_str())) + updated = true; + } + } + catch(const BadFieldName&){ + success=false; + } + + // Mark all data as stored in memory + odi.allDataStored(); + + if (updated) + revision++; + + return success; +} + +OpFailStatus MeosSQL::SyncRead(oEvent *oe) { + OpFailStatus retValue = opStatusOK; + errorMessage.clear(); + + if (CmpDataBase.empty()) + return opStatusFail; + + if (!oe || !con.connected()) + return opStatusFail; + + if (oe->HasDBConnection) { + //We already have established connectation, and just want to sync data. + return SyncEvent(oe); + } + warnedOldVersion=false; + + if (!oe->Id) return SyncUpdate(oe); + + ProgressWindow pw(oe->hWnd()); + + try { + con.select_db("MeOSMain"); + + Query query = con.query(); + query << "SELECT * FROM oEvent WHERE Id=" << oe->Id; + Result res = query.store(); + + Row row; + if (row=res.at(0)){ + oe->Name = row["Name"]; + oe->Annotation = row["Annotation"]; + oe->Date = row["Date"]; + oe->ZeroTime = row["ZeroTime"]; + strcpy_s(oe->CurrentNameId, row["NameId"].c_str()); + } + + con.select_db(CmpDataBase); + } + catch (const mysqlpp::Exception& er){ + setDefaultDB(); + alert(string(er.what())+" [SYNCREAD oEvent]"); + return opStatusFail; + } + + Query query = con.query(); + + int nRunner = 0; + int nCard = 0; + int nTeam = 0; + int nClubDB = 0; + int nRunnerDB = 0; + + int nSum = 1; + + try { + mysqlpp::Result cnt = query.store("SELECT COUNT(*) FROM dbClub"); + nClubDB = cnt.at(0).at(0); + + cnt = query.store("SELECT COUNT(*) FROM dbRunner"); + nRunnerDB = cnt.at(0).at(0); + + string time = oe->runnerDB->getDataDate(); + + cnt = query.store("SELECT COUNT(*) FROM dbClub WHERE Modified>'" + time + "'"); + int modclub = cnt.at(0).at(0); + cnt = query.store("SELECT COUNT(*) FROM dbRunner WHERE Modified>'" + time + "'"); + int modrunner = cnt.at(0).at(0); + + bool skipDB = modclub==0 && modrunner==0 && nClubDB == oe->runnerDB->getClubDB().size() && + nRunnerDB == oe->runnerDB->getRunnerDB().size(); + + if (skipDB) { + nClubDB = 0; + nRunnerDB = 0; + } + + cnt = query.store("SELECT COUNT(*) FROM oRunner"); + nRunner = cnt.at(0).at(0); + + cnt = query.store("SELECT COUNT(*) FROM oCard"); + nCard = cnt.at(0).at(0); + + cnt = query.store("SELECT COUNT(*) FROM oTeam"); + nTeam = cnt.at(0).at(0); + + nSum = nClubDB + nRunnerDB + nRunner + nTeam + nCard + 50; + + if (nSum > 400) + pw.init(); + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCREAD INFO]"); + return opStatusFail; + } + + int pStart = 0, pPart = 50; + + try { + //Update oEvent + query << "SELECT * FROM oEvent"; + Result res = query.store(); + + Row row; + if (row=res.at(0)) { + oe->Name = row["Name"]; + oe->Annotation = row["Annotation"]; + oe->Date = row["Date"]; + oe->ZeroTime = row["ZeroTime"]; + strcpy_s(oe->CurrentNameId, row["NameId"].c_str()); + oe->sqlUpdated = row["Modified"]; + oe->counter = row["Counter"]; + + if (checkOldVersion(oe, row)) { + warnOldDB(); + retValue = opStatusWarning; + } + + const string &lRaw = row.raw_string(res.field_num("Lists")); + try { + importLists(oe, lRaw.c_str()); + } + catch (std::exception &ex) { + alert(ex.what()); + retValue = opStatusWarning; + } + + oDataInterface odi=oe->getDI(); + storeData(odi, row, oe->dataRevision); + oe->changed = false; + oe->setCurrency(-1, "", "", false); // Set currency tmp data + oe->getMeOSFeatures().deserialize(oe->getDCI().getString("Features"), *oe); + } + } + catch (const EndOfResults& ) { + errorMessage = "Unexpected error, oEvent table was empty"; + return opStatusFail; + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCREAD oEvent/Club]"); + return opStatusFail; + } + + pw.setProgress(20); + + try { + ResUse res = query.use("SELECT * FROM oClub WHERE Removed=0"); + + // Retreive result rows one by one. + if (res){ + // Get each row in result set. + Row row; + + while (row = res.fetch_row()) { + oClub c(oe, row["Id"]); + storeClub(row, c); + oe->addClub(c); + + oe->sqlUpdateClubs = max(c.sqlUpdated, oe->sqlUpdateClubs); + oe->sqlCounterClubs = max(c.counter, oe->sqlCounterClubs); + } + } + } + catch (const EndOfResults&) { + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCREAD oEvent/Club]"); + return opStatusFail; + } + + pw.setProgress(30); + + oe->sqlCounterControls=0; + try { + ResUse res = query.use("SELECT * FROM oControl WHERE Removed=0"); + + if (res) { + // Get each row in result set. + Row row; + + while (row = res.fetch_row()) { + oControl c(oe, row["Id"]); + storeControl(row, c); + oe->Controls.push_back(c); + + oe->sqlUpdateControls = max(c.sqlUpdated, oe->sqlUpdateControls); + oe->sqlCounterControls = max(c.counter, oe->sqlCounterControls); + } + } + } + catch (const EndOfResults& ) { + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCREAD oEvent/Control]"); + return opStatusFail; + } + + oe->sqlCounterCourses = 0; + pw.setProgress(40); + + try{ + ResUse res = query.use("SELECT * FROM oCourse WHERE Removed=0"); + + if (res){ + // Get each row in result set. + Row row; + set tmp; + while (row = res.fetch_row()) { + oCourse c(oe, row["Id"]); + storeCourse(row, c, tmp); + oe->addCourse(c); + + oe->sqlUpdateCourses = max(c.sqlUpdated, oe->sqlUpdateCourses); + oe->sqlCounterCourses = max(c.counter, oe->sqlCounterCourses); + } + } + } + catch (const EndOfResults& ) { + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCREAD oEvent/Course]"); + return opStatusFail; + } + + pw.setProgress(50); + + oe->sqlCounterClasses = 0; + try{ + ResUse res = query.use("SELECT * FROM oClass WHERE Removed=0"); + + if (res) { + Row row; + while (row = res.fetch_row()) { + oClass c(oe, row["Id"]); + storeClass(row, c, false); + + c.changed = false; + c.reChanged = false; + oe->addClass(c); + + oe->sqlUpdateClasses = max(c.sqlUpdated, oe->sqlUpdateClasses); + oe->sqlCounterClasses = max(c.counter, oe->sqlCounterClasses); + } + } + } + catch (const EndOfResults& ) { + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCREAD oEvent/Class]"); + return opStatusFail; + } + + oe->sqlCounterCards=0; + + try{ + ResUse res = query.use("SELECT * FROM oCard WHERE Removed=0"); + int counter = 0; + pStart += pPart; + pPart = (1000 * nCard) / nSum; + + if (res){ + Row row; + while (row = res.fetch_row()) { + oCard c(oe, row["Id"]); + storeCard(row, c); + oe->addCard(c); + assert(!c.changed); + + oe->sqlCounterCards = max(c.counter, oe->sqlCounterCards); + oe->sqlUpdateCards = max(c.sqlUpdated, oe->sqlUpdateCards); + + if (++counter % 100 == 50) + pw.setProgress(pStart + (counter * pPart) / nCard); + } + } + + } + catch (const EndOfResults& ) { + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCREAD oEvent/Card]"); + return opStatusFail; + } + + oe->sqlCounterRunners = 0; + try{ + ResUse res = query.use("SELECT * FROM oRunner WHERE Removed=0"); + int counter = 0; + pStart += pPart; + pPart = (1000 * nRunner) / nSum; + + if (res){ + Row row; + while (row = res.fetch_row()) { + oRunner r(oe, row["Id"]); + storeRunner(row, r, false, false, false); + assert(!r.changed); + oe->addRunner(r, false); + + oe->sqlUpdateRunners = max(r.sqlUpdated, oe->sqlUpdateRunners); + oe->sqlCounterRunners = max(r.counter,oe->sqlCounterRunners); + + if (++counter % 100 == 50) + pw.setProgress(pStart + (counter * pPart) / nRunner); + } + } + } + catch (const EndOfResults& ) { + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCREAD oEvent/Runner]"); + return opStatusFail; + } + + oe->sqlCounterTeams=0; + + try{ + ResUse res = query.use("SELECT * FROM oTeam WHERE Removed=0"); + int counter = 0; + pStart += pPart; + pPart = (1000 * nTeam) / nSum; + + if (res){ + Row row; + while (row = res.fetch_row()) { + oTeam t(oe, row["Id"]); + + storeTeam(row, t, false); + + pTeam at = oe->addTeam(t, false); + + if (at) { + at->apply(false, 0, true); + at->changed = false; + for (size_t k = 0; kRunners.size(); k++) { + if (at->Runners[k]) { + assert(!at->Runners[k]->changed); + at->Runners[k]->changed = false; + } + } + } + oe->sqlUpdateTeams = max(t.sqlUpdated, oe->sqlUpdateTeams); + oe->sqlCounterTeams = max(t.counter, oe->sqlCounterTeams); + + if (++counter % 100 == 50) + pw.setProgress(pStart + (counter * pPart) / nTeam); + } + } + } + catch (const EndOfResults& ) { + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCREAD oEvent/Team]"); + return opStatusFail; + } + + string dateTime; + try { + if (nClubDB == 0 && nRunnerDB == 0) + return retValue; // Not modified + + Result cnt; + // Note dbRunner is stored after dbClub + if (nRunnerDB>0) + cnt = query.store("SELECT DATE_FORMAT(MAX(Modified),'%Y-%m-%d %H:%i:%s') FROM dbRunner"); + else + cnt = query.store("SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s')"); + + dateTime = cnt.at(0).at(0); + + oe->runnerDB->prepareLoadFromServer(nRunnerDB, nClubDB); + + ResUse res = query.use("SELECT * FROM dbClub"); + int counter = 0; + pStart += pPart; + pPart = (1000 * nClubDB) / nSum; + + if (res) { + Row row; + while (row = res.fetch_row()) { + oClub t(oe, row["Id"]); + + string n = row["Name"]; + t.internalSetName(n); + storeData(t.getDI(), row, oe->dataRevision); + + oe->runnerDB->addClub(t, false); + + if (++counter % 100 == 50) + pw.setProgress(pStart + (counter * pPart) / nClubDB); + } + } + } + catch (const EndOfResults& ) { + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCREAD dbClub]"); + return opStatusFail; + } + + try { + ResUse res = query.use("SELECT * FROM dbRunner"); + int counter = 0; + pStart += pPart; + pPart = (1000 * nRunnerDB) / nSum; + + if (res) { + Row row; + while (row = res.fetch_row()) { + string name = row["Name"]; + string ext = row["ExtId"]; + string club = row["Club"]; + string card = row["CardNo"]; + string sex = row["Sex"]; + string nat = row["Nation"]; + string birth = row["BirthYear"]; + RunnerDBEntry *db = oe->runnerDB->addRunner(name.c_str(), _atoi64(ext.c_str()), + atoi(club.c_str()), atoi(card.c_str())); + if (db) { + if (sex.length()==1) + db->sex = sex[0]; + db->birthYear = short(atoi(birth.c_str())); + + if (nat.length()==3) { + db->national[0] = nat[0]; + db->national[1] = nat[1]; + db->national[2] = nat[2]; + } + } + + if (++counter % 100 == 50) + pw.setProgress(pStart + (counter * pPart) / nRunnerDB); + + } + } + } + catch (const EndOfResults& ) { + } + catch (const mysqlpp::Exception& er) { + alert(string(er.what())+" [SYNCREAD dbRunner]"); + return opStatusFail; + } + + oe->runnerDB->setDataDate(dateTime); + + return retValue; +} + +void MeosSQL::storeClub(const Row &row, oClub &c) +{ + string n = row["Name"]; + c.internalSetName(n); + + c.sqlUpdated = row["Modified"]; + c.counter = row["Counter"]; + c.Removed = row["Removed"]; + + c.oe->sqlChangedClubs = true; + c.changedObject(); + + synchronized(c); + storeData(c.getDI(), row, c.oe->dataRevision); +} + +void MeosSQL::storeControl(const Row &row, oControl &c) +{ + c.Name = row["Name"]; + c.setNumbers(string(row["Numbers"])); + oControl::ControlStatus oldStat = c.Status; + c.Status = oControl::ControlStatus(int(row["Status"])); + + c.sqlUpdated = row["Modified"]; + c.counter = row["Counter"]; + c.Removed = row["Removed"]; + + c.oe->sqlChangedControls = true; + if (c.changed || oldStat != c.Status) { + c.oe->dataRevision++; + c.changed = false; + } + + c.changedObject(); + + synchronized(c); + storeData(c.getDI(), row, c.oe->dataRevision); +} + +void MeosSQL::storeCard(const Row &row, oCard &c) +{ + c.cardNo = row["CardNo"]; + c.readId = row["ReadId"]; + c.importPunches(string(row["Punches"])); + + c.sqlUpdated = row["Modified"]; + c.counter = row["Counter"]; + c.Removed = row["Removed"]; + + pRunner r = c.getOwner(); + if (r) { + r->sqlChanged = true; + } + c.changedObject(); + synchronized(c); + c.oe->sqlChangedCards = true; +} + +void MeosSQL::storePunch(const Row &row, oFreePunch &p, bool rehash) +{ + if (rehash) { + p.setCardNo(row["CardNo"], true); + p.setTimeInt(row["Time"], true); + p.setType(string(row["Type"]), true); + } + else { + p.CardNo = row["CardNo"]; + p.Time = row["Time"]; + p.Type = row["Type"]; + } + + p.sqlUpdated = row["Modified"]; + p.counter = row["Counter"]; + p.Removed = row["Removed"]; + + p.changedObject(); + synchronized(p); + p.oe->sqlChangedPunches = true; +} + +OpFailStatus MeosSQL::storeClass(const Row &row, oClass &c, + bool readCourses) +{ + OpFailStatus success = opStatusOK; + + c.Name=row["Name"]; + string multi = row["MultiCourse"]; + + string lm(row["LegMethod"]); + c.importLegMethod(lm); + + set cid; + vector< vector > multip; + oClass::parseCourses(multi, multip, cid); + int classCourse = row["Course"]; + if (classCourse != 0) + cid.insert(classCourse); + if (!readCourses) { + for (set::iterator clsIt = cid.begin(); clsIt != cid.end(); ++clsIt) { + if (!c.oe->getCourse(*clsIt)) + readCourses = true; // There are missing courses. Force read. + } + } + + if (readCourses) + success = min(success, syncReadClassCourses(&c, cid, readCourses)); + if (classCourse != 0) + c.Course = c.oe->getCourse(classCourse); + else + c.Course = 0; + + c.importCourses(multip); + + c.sqlUpdated = row["Modified"]; + c.counter = row["Counter"]; + c.Removed = row["Removed"]; + + storeData(c.getDI(), row, c.oe->dataRevision); + + c.changed = false; + + c.changedObject(); + c.oe->sqlChangedClasses = true; + synchronized(c); + return success; +} + +OpFailStatus MeosSQL::storeCourse(const Row &row, oCourse &c, + set &readControls) +{ + OpFailStatus success = opStatusOK; + + c.Name = row["Name"]; + c.importControls(string(row["Controls"]), false); + c.Length = row["Length"]; + c.importLegLengths(string(row["Legs"]), false); + + for (int i=0;iexistInDB()) { + c.Controls[i]->changed = false; + success = min(success, syncRead(true, c.Controls[i])); + } + else + readControls.insert(c.Controls[i]->getId()); + //success = min(success, syncRead(false, c.Controls[i])); + } + } + + c.sqlUpdated = row["Modified"]; + c.counter = row["Counter"]; + c.Removed = row["Removed"]; + + storeData(c.getDI(), row, c.oe->dataRevision); + c.oe->dataRevision++; + c.changed = false; + c.changedObject(); + c.oe->sqlChangedCourses = true; + synchronized(c); + return success; +} + +OpFailStatus MeosSQL::storeRunner(const Row &row, oRunner &r, + bool readCourseCard, + bool readClassClub, + bool readRunners) +{ + OpFailStatus success = opStatusOK; + oEvent *oe=r.oe; + + // Mark old class as changed + if (r.Class) + r.markClassChanged(-1); + + int oldSno = r.StartNo; + const string &oldBib = r.getBib(); + + r.sName = row["Name"]; + oRunner::getRealName(r.sName, r.tRealName); + r.setCardNo(row["CardNo"], false, true); + r.StartNo = row["StartNo"]; + r.tStartTime = r.startTime = row["StartTime"]; + r.FinishTime = row["FinishTime"]; + r.tStatus = r.status = RunnerStatus(int(row["Status"])); + + r.inputTime = row["InputTime"]; + r.inputPoints = row["InputPoints"]; + r.inputStatus = RunnerStatus(int(row["InputStatus"])); + r.inputPlace = row["InputPlace"]; + + r.Removed = row["Removed"]; + r.sqlUpdated = row["Modified"]; + r.counter = row["Counter"]; + + storeData(r.getDI(), row, oe->dataRevision); + + if (oldSno != r.StartNo || oldBib != r.getBib()) + oe->bibStartNoToRunnerTeam.clear(); // Clear quick map (lazy setup) + + if (int(row["Course"])!=0) { + r.Course = oe->getCourse(int(row["Course"])); + set controlIds; + if (!r.Course) { + oCourse oc(oe, row["Course"]); + success = min(success, syncReadCourse(true, &oc, controlIds)); + r.Course = oe->addCourse(oc); + } + else if (readCourseCard) + success = min(success, syncReadCourse(false, r.Course, controlIds)); + + if (readCourseCard) + success = min(success, syncReadControls(oe, controlIds)); + } + else r.Course=0; + + if (int(row["Class"])!=0) { + r.Class=oe->getClass(int(row["Class"])); + + if (!r.Class) { + oClass oc(oe, row["Class"]); + success = min(success, syncRead(true, &oc, readClassClub)); + r.Class = oe->addClass(oc); + } + else if (readClassClub) + success = min(success, syncRead(false, r.Class, true)); + + if (r.tInTeam && r.tInTeam->Class!=r.Class) + r.tInTeam = 0; //Temporaraly disable belonging. Restored on next apply. + } + else r.Class=0; + + if (int(row["Club"])!=0){ + r.Club = oe->getClub(int(row["Club"])); + + if (!r.Club) { + oClub oc(oe, row["Club"]); + success = min(success, syncRead(true, &oc)); + r.Club = oe->addClub(oc); + } + else if (readClassClub) + success = min(success, syncRead(false, r.Club)); + } + else r.Club=0; + + pCard oldCard = r.Card; + + if (int(row["Card"])!=0) { + r.Card = oe->getCard(int(row["Card"])); + + if (!r.Card){ + oCard oc(oe, row["Card"]); + oe->Cards.push_back(oc); + r.Card = &oe->Cards.back(); + r.Card->changed = false; + success = min(success, syncRead(true, r.Card)); + } + else if (readCourseCard) + success = min(success, syncRead(false, r.Card)); + } + else r.Card=0; + + // Update card ownership + if (oldCard && oldCard != r.Card && oldCard->tOwner == &r) + oldCard->tOwner = 0; + + // This is updated by addRunner if this is a temporary copy. + if (r.Card) + r.Card->tOwner=&r; + + // This only loads indexes + r.decodeMultiR(string(row["MultiR"])); + + // We now load/reload required other runners. + if (readRunners) { + for (size_t i=0;i0) { + pRunner pr = oe->getRunner(rid, 0); + if (pr==0) { + oRunner or(oe, rid); + success = min(success, syncRead(true, &or, false, readCourseCard)); + pr = oe->addRunner(or, false); + } + else + success = min(success, syncRead(false, pr, false, readCourseCard)); + } + } + } + + // Mark new class as changed + r.changedObject(); + r.sqlChanged = true; + r.oe->sqlChangedRunners = true; + + synchronized(r); + return success; +} + +OpFailStatus MeosSQL::storeTeam(const Row &row, oTeam &t, + bool readRecursive) +{ + oEvent *oe=t.oe; + OpFailStatus success = opStatusOK; + + // Mark old class as changed + if (t.Class) + t.Class->markSQLChanged(-1,-1); + + int oldSno = t.StartNo; + const string &oldBib = t.getBib(); + + t.sName=row["Name"]; + t.StartNo=row["StartNo"]; + t.tStartTime = t.startTime = row["StartTime"]; + t.FinishTime=row["FinishTime"]; + t.tStatus = t.status = RunnerStatus(int(row["Status"])); + storeData(t.getDI(), row, oe->dataRevision); + + if (oldSno != t.StartNo || oldBib != t.getBib()) + oe->bibStartNoToRunnerTeam.clear(); // Clear quick map (lazy setup) + + t.Removed = row["Removed"]; + if (t.Removed) + t.prepareRemove(); + + t.sqlUpdated = row["Modified"]; + t.counter = row["Counter"]; + + if (!t.Removed) { + int classId = row["Class"]; + if (classId!=0) { + t.Class = oe->getClass(classId); + + if (!t.Class) { + oClass oc(oe, classId); + success = min(success, syncRead(true, &oc, readRecursive)); + t.Class = oe->addClass(oc); + } + else if (readRecursive) + success = min(success, syncRead(false, t.Class, readRecursive)); + } + else t.Class=0; + + int clubId = row["Club"]; + if (clubId!=0) { + t.Club=oe->getClub(clubId); + + if (!t.Club) { + oClub oc(oe, clubId); + success = min(success, syncRead(true, &oc)); + t.Club = oe->addClub(oc); + } + else if (readRecursive) + success = min(success, syncRead(false, t.Club)); + } + else t.Club = 0; + + vector rns; + vector pRns; + t.decodeRunners(static_cast(row["Runners"]), rns); + + pRns.resize(rns.size()); + for (size_t k=0;k0) { + pRns[k] = oe->getRunner(rns[k], 0); + + if (!pRns[k]) { + oRunner or(oe, rns[k]); + success = min(success, syncRead(true, &or, readRecursive, readRecursive)); + + if (or.sName.empty()) { + or.sName = "@AutoCorrection"; + oRunner::getRealName(or.sName, or.tRealName); + } + pRns[k] = oe->addRunner(or, false); + assert(pRns[k] && !pRns[k]->changed); + } + else if (readRecursive) + success = min(success, syncRead(false, pRns[k])); + } + } + t.importRunners(pRns); + } + + // Mark new class as changed. + if (t.Class) + t.Class->markSQLChanged(-1,-1); + + t.sqlChanged = true; + t.oe->sqlChangedTeams = true; + synchronized(t); + return success; +} + +bool MeosSQL::Remove(oBase *ob) +{ + errorMessage.clear(); + + if (CmpDataBase.empty()) + return false; + + if (!ob || !con.connected()) + return false; + + if (!ob->Id) + return true; //Not in DB. + + Query query = con.query(); + + string oTable; + + if (typeid(*ob)==typeid(oRunner)){ + oTable="oRunner"; + } + else if (typeid(*ob)==typeid(oClass)){ + oTable="oClass"; + } + else if (typeid(*ob)==typeid(oCourse)){ + oTable="oCourse"; + } + else if (typeid(*ob)==typeid(oControl)){ + oTable="oControl"; + } + else if (typeid(*ob)==typeid(oClub)){ + oTable="oClub"; + } + else if (typeid(*ob)==typeid(oCard)){ + oTable="oCard"; + } + else if (typeid(*ob)==typeid(oFreePunch)){ + oTable="oPunch"; + } + else if (typeid(*ob)==typeid(oTeam)){ + oTable="oTeam"; + } + else if (typeid(*ob)==typeid(oEvent)){ + oTable="oEvent"; + //Must change db! + return 0; + } + + query << "Removed=1"; + try{ + ResNSel res = updateCounter(oTable.c_str(), ob->Id, &query); + ob->Removed = true; + ob->changed = false; + ob->reChanged = false; + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [REMOVE " +oTable +"]"); + return false; + } + + return true; +} + + +OpFailStatus MeosSQL::syncUpdate(oRunner *r, bool forceWriteAll) +{ + errorMessage.clear(); + + if (CmpDataBase.empty()) + return opStatusFail; + + if (!r || !con.connected()) + return opStatusFail; + + mysqlpp::Query queryset = con.query(); + queryset << " Name=" << quote << r->sName << ", " + << " CardNo=" << r->CardNo << ", " + << " StartNo=" << r->StartNo << ", " + << " StartTime=" << r->startTime << ", " + << " FinishTime=" << r->FinishTime << ", " + << " Course=" << r->getCourseId() << ", " + << " Class=" << r->getClassId() << ", " + << " Club=" << r->getClubId() << ", " + << " Card=" << r->getCardId() << ", " + << " Status=" << r->status << ", " + << " InputTime=" << r->inputTime << ", " + << " InputStatus=" << r->inputStatus << ", " + << " InputPoints=" << r->inputPoints << ", " + << " InputPlace=" << r->inputPlace << ", " + << " MultiR=" << quote << r->codeMultiR() + << r->getDI().generateSQLSet(forceWriteAll); + + + string str = "write runner " + r->sName + ", st = " + itos(r->startTime) + "\n"; + OutputDebugString(str.c_str()); + + return syncUpdate(queryset, "oRunner", r); +} + +bool MeosSQL::isOld(int counter, const string &time, oBase *ob) +{ + return counter>ob->counter || time>ob->sqlUpdated; +} + +OpFailStatus MeosSQL::syncRead(bool forceRead, oRunner *r) +{ + return syncRead(forceRead, r, true, true); +} + +string MeosSQL::andWhereOld(oBase *ob) { + return " AND (Counter!=" + itos(ob->counter) + " OR Modified!='" + ob->sqlUpdated + "')"; +} + +OpFailStatus MeosSQL::syncRead(bool forceRead, oRunner *r, bool readClassClub, bool readCourseCard) +{ + errorMessage.clear(); + if (CmpDataBase.empty()) + return opStatusFail; + + if (!r || !con.connected()) + return opStatusFail; + + if (!forceRead && !r->existInDB()) + return syncUpdate(r, true); + + if (!r->changed && skipSynchronize(*r)) + return opStatusOK; + + try { + Query query = con.query(); + query << "SELECT * FROM oRunner WHERE Id=" << r->Id << andWhereOld(r); + Result res = query.store(); + + Row row; + if (!res.empty()) { + row=res.at(0); + // Remotly changed update! + OpFailStatus success=opStatusOK; + if (r->changed) + success=opStatusWarning; + + success = min (success, storeRunner(row, *r, readCourseCard, readClassClub, true)); + + r->oe->dataRevision++; + r->Modified.update(); + r->changed = false; + + vector mp; + r->evaluateCard(true, mp, 0, false); + + //Forget evaluated changes. Not our buisness to update. + r->changed = false; + + return success; + } + else { + if (r->Card && readCourseCard) + syncRead(false, r->Card); + if (r->Class && readClassClub) + syncRead(false, r->Class, readClassClub); + if (r->Course && readCourseCard) { + set controlIds; + syncReadCourse(false, r->Course, controlIds); + if (readClassClub) + syncReadControls(r->oe, controlIds); + } + if (r->Club && readClassClub) + syncRead(false, r->Club); + + if (r->changed) + return syncUpdate(r, false); + + vector mp; + r->evaluateCard(true, mp, 0, false); + r->changed = false; + r->reChanged = false; + return opStatusOK; + } + + return opStatusOK; + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCREAD oRunner]"); + return opStatusFail; + } + + return opStatusFail; +} + +OpFailStatus MeosSQL::syncUpdate(oCard *c, bool forceWriteAll) +{ + errorMessage.clear(); + if (CmpDataBase.empty()) + return opStatusFail; + + if (!c || !con.connected()) + return opStatusFail; + + mysqlpp::Query queryset = con.query(); + queryset << " CardNo=" << c->cardNo << ", " + << " ReadId=" << c->readId << ", " + << " Punches=" << quote << c->getPunchString(); + + return syncUpdate(queryset, "oCard", c); +} + +OpFailStatus MeosSQL::syncRead(bool forceRead, oCard *c) +{ + errorMessage.clear(); + if (CmpDataBase.empty()) + return opStatusFail; + + if (!c || !con.connected()) + return opStatusFail; + + if (!forceRead && !c->existInDB()) + return syncUpdate(c, true); + + if (!c->changed && skipSynchronize(*c)) + return opStatusOK; + + try{ + Query query = con.query(); + query << "SELECT * FROM oCard WHERE Id=" << c->Id; + Result res = query.store(); + + Row row; + if (!res.empty()){ + row=res.at(0); + if (!c->changed || isOld(row["Counter"], string(row["Modified"]), c)){ + + OpFailStatus success=opStatusOK; + if (c->changed) + success=opStatusWarning; + + storeCard(row, *c); + c->oe->dataRevision++; + c->Modified.update(); + c->changed=false; + return success; + } + else if (c->changed){ + return syncUpdate(c, false); + } + } + else{ + //Something is wrong!? Deleted? + return syncUpdate(c, true); + } + + return opStatusOK; + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCREAD oCard]"); + return opStatusFail; + } + + return opStatusFail; +} + + +OpFailStatus MeosSQL::syncUpdate(oTeam *t, bool forceWriteAll) { + errorMessage.clear(); + + if (CmpDataBase.empty()) + return opStatusFail; + + if (!t || !con.connected()) + return opStatusFail; + + mysqlpp::Query queryset = con.query(); + + queryset << " Name=" << quote << t->sName << ", " + << " Runners=" << quote << t->getRunners() << ", " + << " StartTime=" << t->startTime << ", " + << " FinishTime=" << t->FinishTime << ", " + << " Class=" << t->getClassId() << ", " + << " Club=" << t->getClubId() << ", " + << " StartNo=" << t->getStartNo() << ", " + << " Status=" << t->status + << t->getDI().generateSQLSet(forceWriteAll); + + string str = "write team " + t->sName + "\n"; + OutputDebugString(str.c_str()); + return syncUpdate(queryset, "oTeam", t); +} + +OpFailStatus MeosSQL::syncRead(bool forceRead, oTeam *t) +{ + return syncRead(forceRead, t, true); +} + +OpFailStatus MeosSQL::syncRead(bool forceRead, oTeam *t, bool readRecursive) +{ + errorMessage.clear(); + + if (CmpDataBase.empty()) + return opStatusFail; + + if (!t || !con.connected()) + return opStatusFail; + + if (!forceRead && !t->existInDB()) + return syncUpdate(t, true); + + if (!t->changed && skipSynchronize(*t)) + return opStatusOK; + + try{ + Query query = con.query(); + query << "SELECT * FROM oTeam WHERE Id=" << t->Id << andWhereOld(t); + Result res = query.store(); + + Row row; + if (!res.empty()) { + row=res.at(0); + + OpFailStatus success=opStatusOK; + if (t->changed) + success=opStatusWarning; + + storeTeam(row, *t, readRecursive); + t->oe->dataRevision++; + t->Modified.update(); + t->changed = false; + t->reChanged = false; + return success; + } + else { + OpFailStatus success = opStatusOK; + + if (readRecursive) { + if (t->Class) + success = min(success, syncRead(false, t->Class, readRecursive)); + if (t->Club) + success = min(success, syncRead(false, t->Club)); + for (size_t k = 0; kRunners.size(); k++) { + if (t->Runners[k]) + success = min(success, syncRead(false, t->Runners[k], false, readRecursive)); + } + } + if (t->changed) + return min(success, syncUpdate(t, false)); + else + return success; + } + + return opStatusOK; + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCREAD oTeam]"); + return opStatusFail; + } + + return opStatusFail; +} + +OpFailStatus MeosSQL::syncUpdate(oClass *c, bool forceWriteAll) +{ + errorMessage.clear(); + + if (CmpDataBase.empty()) + return opStatusFail; + + if (!c || !con.connected()) + return opStatusFail; + mysqlpp::Query queryset = con.query(); + + queryset << " Name=" << quote << c->Name << "," + << " Course=" << c->getCourseId() << "," + << " MultiCourse=" << quote << c->codeMultiCourse() << "," + << " LegMethod=" << quote << c->codeLegMethod() + << c->getDI().generateSQLSet(forceWriteAll); + + return syncUpdate(queryset, "oClass", c); +} + +OpFailStatus MeosSQL::syncRead(bool forceRead, oClass *c) +{ + return syncRead(forceRead, c, true); +} + +OpFailStatus MeosSQL::syncRead(bool forceRead, oClass *c, bool readCourses) +{ + errorMessage.clear(); + if (CmpDataBase.empty()) + return opStatusFail; + + if (!c || !con.connected()) + return opStatusFail; + + if (!forceRead && !c->existInDB()) + return syncUpdate(c, true); + + if (!c->changed && skipSynchronize(*c)) + return opStatusOK; + + try { + Query query = con.query(); + query << "SELECT * FROM oClass WHERE Id=" << c->Id << andWhereOld(c); + Result res = query.store(); + + Row row; + if (!res.empty()){ + row=res.at(0); + OpFailStatus success = opStatusOK; + + if (c->changed) + success=opStatusWarning; + + storeClass(row, *c, readCourses); + c->oe->dataRevision++; + c->Modified.update(); + c->changed = false; + c->reChanged = false; + return opStatusOK; + } + else { + OpFailStatus success = opStatusOK; + if (readCourses) { + set d; + c->getMCourseIdSet(d); + if (c->getCourseId() != 0) + d.insert(c->getCourseId()); + success = syncReadClassCourses(c, d, true); + } + + if (c->changed && !forceRead) + success = min(success, syncUpdate(c, false)); + + return success; + } + + return opStatusOK; + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCREAD oClass]"); + return opStatusFail; + } + + return opStatusFail; +} + +OpFailStatus MeosSQL::syncReadClassCourses(oClass *c, const set &courses, + bool readRecursive) { + OpFailStatus success = opStatusOK; + if (courses.empty()) + return success; + oEvent *oe = c->oe; + try { + Query query = con.query(); + string in; + for(set::const_iterator it=courses.begin(); it!=courses.end(); ++it) { + if (!in.empty()) + in += ","; + in += itos(*it); + } + query << "SELECT Id, Counter, Modified FROM oCourse WHERE Id IN (" << in << ")"; + Result res = query.store(); + set processedCourses(courses); + set controlIds; + for (size_t k = 0; k < res.size(); k++) { + Row row = res.at(k); + int id = row["Id"]; + int counter = row["Counter"]; + string modified = row["Modified"]; + + pCourse pc = oe->getCourse(id); + if (!pc) { + oCourse oc(oe, id); + success = min(success, syncReadCourse(true, &oc, controlIds)); + oe->addCourse(oc); + } + else if (pc->changed || isOld(counter, modified, pc)) { + success = min(success, syncReadCourse(false, pc, controlIds)); + } + else { + for (int m = 0; m nControls; m++) + if (pc->Controls[m]) + controlIds.insert(pc->Controls[m]->getId()); + } + processedCourses.erase(id); + } + + // processedCourses should now be empty. The only change it is not empty is that + // there are locally added courses that are not on the server (which is an error). + for(set::iterator it = processedCourses.begin(); it != processedCourses.end(); ++it) { + assert(false); + pCourse pc = oe->getCourse(*it); + if (pc) { + success = min(success, syncUpdate(pc, true)); + } + } + + if (readRecursive) + success = min(success, syncReadControls(oe, controlIds)); + + return success; + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCREAD oClassCourse]"); + return opStatusFail; + } +} + +OpFailStatus MeosSQL::syncReadControls(oEvent *oe, const set &controls) { + OpFailStatus success = opStatusOK; + if (controls.empty()) + return success; + try { + Query query = con.query(); + string in; + for(set::const_iterator it=controls.begin(); it!=controls.end(); ++it) { + if (!in.empty()) + in += ","; + in += itos(*it); + } + query << "SELECT Id, Counter, Modified FROM oControl WHERE Id IN (" << in << ")"; + Result res = query.store(); + set processedControls(controls); + for (size_t k = 0; k < res.size(); k++) { + Row row = res.at(k); + int id = row["Id"]; + int counter = row["Counter"]; + string modified = row["Modified"]; + + pControl pc = oe->getControl(id, false); + if (!pc) { + oControl oc(oe, id); + success = min(success, syncRead(true, &oc)); + oe->addControl(oc); + } + else if (pc->changed || isOld(counter, modified, pc)) { + success = min(success, syncRead(false, pc)); + } + processedControls.erase(id); + } + + // processedCourses should now be empty, unless there are local controls not yet added. + for(set::iterator it = processedControls.begin(); it != processedControls.end(); ++it) { + pControl pc = oe->getControl(*it, false); + if (pc) { + success = min(success, syncUpdate(pc, true)); + } + } + + return success; + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCREAD oClass]"); + return opStatusFail; + } +} + + +OpFailStatus MeosSQL::syncUpdate(oClub *c, bool forceWriteAll) +{ + errorMessage.clear(); + + if (CmpDataBase.empty()) + return opStatusFail; + + if (!c || !con.connected()) + return opStatusFail; + mysqlpp::Query queryset = con.query(); + queryset << " Name=" << quote << c->name + << c->getDI().generateSQLSet(forceWriteAll); + + return syncUpdate(queryset, "oClub", c); +} + +OpFailStatus MeosSQL::syncRead(bool forceRead, oClub *c) +{ + errorMessage.clear(); + + if (CmpDataBase.empty()) + return opStatusFail; + + if (!c || !con.connected()) + return opStatusFail; + + if (!forceRead && !c->existInDB()) + return syncUpdate(c, true); + + try{ + Query query = con.query(); + query << "SELECT * FROM oClub WHERE Id=" << c->Id; + Result res = query.store(); + + Row row; + if (!res.empty()){ + row=res.at(0); + if (!c->changed || isOld(row["Counter"], string(row["Modified"]), c)) { + + OpFailStatus success = opStatusOK; + if (c->changed) + success = opStatusWarning; + + storeClub(row, *c); + + c->Modified.update(); + c->changed=false; + return success; + } + else if (c->changed){ + return syncUpdate(c, false); + } + } + else{ + //Something is wrong!? Deleted? + return syncUpdate(c, true); + } + return opStatusOK; + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCREAD oClub]"); + return opStatusFail; + } + + return opStatusFail; +} + +OpFailStatus MeosSQL::syncUpdate(oControl *c, bool forceWriteAll) { + errorMessage.clear(); + + if (CmpDataBase.empty()) + return opStatusFail; + + if (!c || !con.connected()) + return opStatusFail; + + mysqlpp::Query queryset = con.query(); + queryset << " Name=" << quote << c->Name << ", " + << " Numbers=" << quote << c->codeNumbers() << "," + << " Status=" << c->Status + << c->getDI().generateSQLSet(forceWriteAll); + + return syncUpdate(queryset, "oControl", c); +} + +OpFailStatus MeosSQL::syncRead(bool forceRead, oControl *c) +{ + errorMessage.clear(); + + if (CmpDataBase.empty()) + return opStatusFail; + + if (!c || !con.connected()) + return opStatusFail; + + if (!forceRead && !c->existInDB()) + return syncUpdate(c, true); + + try{ + Query query = con.query(); + query << "SELECT * FROM oControl WHERE Id=" << c->Id << andWhereOld(c); + Result res = query.store(); + + Row row; + if (!res.empty()){ + row=res.at(0); + + OpFailStatus success=opStatusOK; + if (c->changed) + success=opStatusWarning; + + storeControl(row, *c); + c->oe->dataRevision++; + c->Modified.update(); + c->changed=false; + return success; + } + else if (c->changed) { + return syncUpdate(c, false); + } + + return opStatusOK; + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCREAD oControl]"); + return opStatusFail; + } + return opStatusFail; +} + +OpFailStatus MeosSQL::syncUpdate(oCourse *c, bool forceWriteAll) +{ + errorMessage.clear(); + + if (CmpDataBase.empty()) + return opStatusFail; + + bool isTMP = c->sqlUpdated == "TMP"; + assert(!isTMP); + if (isTMP) + return opStatusFail; + + if (!c || !con.connected()) + return opStatusFail; + mysqlpp::Query queryset = con.query(); + queryset << " Name=" << quote << c->Name << ", " + << " Length=" << unsigned(c->Length) << ", " + << " Controls=" << quote << c->getControls() << ", " + << " Legs=" << quote << c->getLegLengths() + << c->getDI().generateSQLSet(true); + + return syncUpdate(queryset, "oCourse", c); +} + +OpFailStatus MeosSQL::syncRead(bool forceRead, oCourse *c) +{ + set controls; + OpFailStatus res = syncReadCourse(forceRead, c, controls); + res = min( res, syncReadControls(c->oe, controls)); + return res; +} + +OpFailStatus MeosSQL::syncReadCourse(bool forceRead, oCourse *c, set &readControls) { + errorMessage.clear(); + + if (CmpDataBase.empty()) + return opStatusFail; + + if (!c || !con.connected()) + return opStatusFail; + + bool isTMP = c->sqlUpdated == "TMP"; + assert(!isTMP); + if (isTMP) + return opStatusFail; + + if (!forceRead && !c->existInDB()) + return syncUpdate(c, true); + + if (!c->changed && skipSynchronize(*c)) + return opStatusOK; // Skipped readout + + try{ + Query query = con.query(); + query << "SELECT * FROM oCourse WHERE Id=" << c->Id << andWhereOld(c); + Result res = query.store(); + + Row row; + if (!res.empty()) { + row=res.at(0); + + OpFailStatus success = opStatusOK; + if (c->changed) + success = opStatusWarning; + + storeCourse(row, *c, readControls); + c->oe->dataRevision++; + c->Modified.update(); + c->changed=false; + c->reChanged=false; + return success; + } + else { + OpFailStatus success = opStatusOK; + + // Plain read controls + for (int i=0;inControls; i++) { + if (c->Controls[i]) + readControls.insert(c->Controls[i]->getId()); + //success = min(success, syncRead(false, c->Controls[i])); + } + + if (c->changed && !forceRead) + return min(success, syncUpdate(c, false)); + else + return success; + } + + return opStatusOK; + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCREAD oCourse]"); + return opStatusFail; + } + + return opStatusFail; +} + +OpFailStatus MeosSQL::syncUpdate(oFreePunch *c, bool forceWriteAll) +{ + errorMessage.clear(); + + if (CmpDataBase.empty()) { + errorMessage = "Not connected"; + return opStatusFail; + } + + if (!c || !con.connected()) { + errorMessage = "Not connected"; + return opStatusFail; + } + mysqlpp::Query queryset = con.query(); + queryset << " CardNo=" << c->CardNo << ", " + << " Type=" << c->Type << "," + << " Time=" << c->Time; + + return syncUpdate(queryset, "oPunch", c); +} + +OpFailStatus MeosSQL::syncRead(bool forceRead, oFreePunch *c, bool rehash) +{ + errorMessage.clear(); + + if (CmpDataBase.empty()) + return opStatusFail; + + if (!c || !con.connected()) + return opStatusFail; + + if (!forceRead && !c->existInDB()) + return syncUpdate(c, true); + + if (!c->changed && skipSynchronize(*c)) + return opStatusOK; + + try{ + Query query = con.query(); + query << "SELECT * FROM oPunch WHERE Id=" << c->Id << andWhereOld(c); + Result res = query.store(); + + Row row; + if (!res.empty()) { + row=res.at(0); + OpFailStatus success = opStatusOK; + if (c->changed) + success = opStatusWarning; + + storePunch(row, *c, rehash); + c->oe->dataRevision++; + c->Modified.update(); + c->changed=false; + return success; + } + else if (c->changed) { + return syncUpdate(c, false); + } + + return opStatusOK; + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCREAD oPunch]"); + return opStatusFail; + } + return opStatusFail; +} + +OpFailStatus MeosSQL::updateTime(const char *oTable, oBase *ob) +{ + errorMessage.clear(); + + mysqlpp::Query query = con.query(); + + query << "SELECT Modified, Counter FROM " << oTable << " WHERE Id=" << ob->Id; + + mysqlpp::Result res = query.store(); + + if (!res.empty()) { + ob->sqlUpdated=res.at(0)["Modified"]; + ob->counter = res.at(0)["Counter"]; + ob->changed=false; //Mark as saved. + // Mark all data as stored in memory + if (ob->getDISize() >= 0) + ob->getDI().allDataStored(); + return opStatusOK; + } + else { + alert("Update time failed for " + string(oTable)); + return opStatusFail; + } +} + +static int nUpdate = 0; + +mysqlpp::ResNSel MeosSQL::updateCounter(const char *oTable, int id, mysqlpp::Query *updateqry) { + Query query = con.query(); + + try { + query.exec(string("LOCK TABLES ") + oTable + string(" WRITE")); + query << "SELECT MAX(Counter) FROM " << oTable; + int counter; + { + const mysqlpp::ColData c = query.store().at(0).at(0); + bool null = c.is_null(); + counter = null ? 1 : int(c) + 1; + } + query.reset(); + query << "UPDATE " << oTable << " SET Counter=" << counter; + + if (updateqry != 0) + query << "," << updateqry->str(); + + query << " WHERE Id=" << id; + + mysqlpp::ResNSel res = query.execute(); + + query.exec("UNLOCK TABLES"); + + query.reset(); + query << "UPDATE oCounter SET " << oTable << "=GREATEST(" << counter << "," << oTable << ")"; + query.execute(); + return res; + } + catch(...) { + query.exec("UNLOCK TABLES"); + throw; + } +} + + +OpFailStatus MeosSQL::syncUpdate(mysqlpp::Query &updateqry, + const char *oTable, oBase *ob) +{ + nUpdate++; + if (nUpdate % 100 == 99) + OutputDebugString((itos(nUpdate) +" updates\n").c_str()); + + assert(ob->getEvent()); + if (!ob->getEvent()) + return opStatusFail; + + if (ob->getEvent()->isReadOnly()) + return opStatusOK; + + errorMessage.clear(); + + if (!con.connected()) { + errorMessage = "Not connected"; + return opStatusFail; + } + + mysqlpp::Query query = con.query(); + try{ + if (!ob->existInDB()) { + bool setId = false; + + if (ob->Id > 0) { + query << "SELECT Id FROM " << oTable << " WHERE Id=" << ob->Id; + Result res=query.store(); + if (res && res.num_rows()==0) + setId = true; + } + + query.reset(); + query << "INSERT INTO " << oTable << " SET " << updateqry.str(); + + if (setId) + query << ", Id=" << ob->Id; + + mysqlpp::ResNSel res=query.execute(); + if (res) { + if (ob->Id > 0 && ob->Id!=(int)res.insert_id) { + ob->correctionNeeded = true; + } + + if (ob->Id != res.insert_id) + ob->changeId((int)res.insert_id); + + updateCounter(oTable, ob->Id, 0); + ob->oe->updateFreeId(ob); + + return updateTime(oTable, ob); + } + else { + errorMessage = "Unexpected error: update failed"; + return opStatusFail; + } + } + else { + + mysqlpp::ResNSel res = updateCounter(oTable, ob->Id, &updateqry); + + if (res){ + if (res.rows==0){ + query.reset(); + + query << "SELECT Id FROM " << oTable << " WHERE Id=" << ob->Id; + mysqlpp::Result store_res = query.store(); + + if (store_res.num_rows()==0){ + query.reset(); + query << "INSERT INTO " << oTable << " SET " << + updateqry.str() << ", Id=" << ob->Id; + + res=query.execute(); + if (!res) { + errorMessage = "Unexpected error: insert failed"; + return opStatusFail; + } + + updateCounter(oTable, ob->Id, 0); + } + } + } + + return updateTime(oTable, ob); + } + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [" + oTable + " \n\n(" + query.str() + ")]"); + return opStatusFail; + } + + return opStatusFail; +} + +bool MeosSQL::checkOldVersion(oEvent *oe, Row &row) { + int dbv=int(row["BuildVersion"]); + if ( dbvupdateChanged(); + else if (dbv>buildVersion) + return true; + + return false; +} + +OpFailStatus MeosSQL::SyncEvent(oEvent *oe) { + errorMessage.clear(); + OpFailStatus retValue = opStatusOK; + if (!con.connected()) + return opStatusOK; + + bool oldVersion=false; + try{ + Query query = con.query(); + + query << "SELECT * FROM oEvent"; + query << " WHERE Counter>" << oe->counter; + + Result res = query.store(); + + if (res && res.num_rows()>0) { + Row row=res.at(0); + string Modified=row["Modified"]; + int counter = row["Counter"]; + + oldVersion = checkOldVersion(oe, row); + /* int dbv=int(row["BuildVersion"]); + if ( dbvupdateChanged(); + else if (dbv>buildVersion) + oldVersion=true; +*/ + if (isOld(counter, Modified, oe)) { + oe->Name=row["Name"]; + oe->Annotation = row["Annotation"]; + oe->Date=row["Date"]; + oe->ZeroTime=row["ZeroTime"]; + oe->sqlUpdated=Modified; + const string &lRaw = row.raw_string(res.field_num("Lists")); + try { + importLists(oe, lRaw.c_str()); + } + catch (std::exception &ex) { + alert(ex.what()); + } + oe->counter = counter; + oDataInterface odi=oe->getDI(); + storeData(odi, row, oe->dataRevision); + oe->setCurrency(-1, "", "", false);//Init temp data from stored data + oe->getMeOSFeatures().deserialize(oe->getDCI().getString("Features"), *oe); + oe->changed=false; + oe->changedObject(); + } + else if (oe->isChanged()) { + + string listEnc; + try { + encodeLists(oe, listEnc); + } + catch (std::exception &ex) { + retValue = opStatusWarning; + alert(ex.what()); + } + + mysqlpp::Query queryset = con.query(); + queryset << " Name=" << quote << limitLength(oe->Name, 128) << ", " + << " Annotation=" << quote << limitLength(oe->Annotation, 128) << ", " + << " Date=" << quote << oe->Date << ", " + << " NameId=" << quote << oe->CurrentNameId << ", " + << " ZeroTime=" << unsigned(oe->ZeroTime) << ", " + << " BuildVersion=if (BuildVersion<" << + buildVersion << "," << buildVersion << ",BuildVersion), " + << " Lists=" << quote << listEnc + << oe->getDI().generateSQLSet(false); + + syncUpdate(queryset, "oEvent", oe); + + // Update list database; + con.select_db("MeOSMain"); + queryset.reset(); + queryset << "UPDATE oEvent SET Name=" << quote << limitLength(oe->Name, 128) << ", " + << " Annotation=" << quote << limitLength(oe->Annotation, 128) << ", " + << " Date=" << quote << oe->Date << ", " + << " NameId=" << quote << oe->CurrentNameId << ", " + << " ZeroTime=" << unsigned(oe->ZeroTime) + << " WHERE Id=" << oe->Id; + + queryset.execute(); + //syncUpdate(queryset, "oEvent", oe, true); + con.select_db(CmpDataBase); + } + } + else if ( oe->isChanged() ){ + string listEnc; + encodeLists(oe, listEnc); + + mysqlpp::Query queryset = con.query(); + queryset << " Name=" << quote << limitLength(oe->Name, 128) << ", " + << " Annotation=" << quote << limitLength(oe->Annotation, 128) << ", " + << " Date=" << quote << oe->Date << "," + << " NameId=" << quote << oe->CurrentNameId << "," + << " ZeroTime=" << unsigned(oe->ZeroTime) << "," + << " BuildVersion=if (BuildVersion<" << + buildVersion << "," << buildVersion << ",BuildVersion)," + << " Lists=" << quote << listEnc + << oe->getDI().generateSQLSet(false); + + syncUpdate(queryset, "oEvent", oe); + + // Update list database; + con.select_db("MeOSMain"); + queryset.reset(); + queryset << "UPDATE oEvent SET Name=" << quote << limitLength(oe->Name, 128) << ", " + << " Annotation=" << quote << limitLength(oe->Annotation, 128) << ", " + << " Date=" << quote << oe->Date << ", " + << " NameId=" << quote << oe->CurrentNameId << ", " + << " ZeroTime=" << unsigned(oe->ZeroTime) + << " WHERE Id=" << oe->Id; + + queryset.execute(); + //syncUpdate(queryset, "oEvent", oe, true); + con.select_db(CmpDataBase); + } + } + catch (const mysqlpp::Exception& er){ + setDefaultDB(); + alert(string(er.what())+" [SYNCLIST oEvent]"); + return opStatusFail; + } + + if (oldVersion) { + warnOldDB(); + return opStatusWarning; + } + + return retValue; +} + +void MeosSQL::warnOldDB() { + if (!warnedOldVersion) { + warnedOldVersion=true; + alert("warn:olddbversion"); + } +} + +bool MeosSQL::syncListRunner(oEvent *oe) +{ + errorMessage.clear(); + + if (!con.connected()) + return false; + + try{ + Query query = con.query(); + + /*query << "SELECT Id, Counter, Modified, Removed FROM oRunner"; + query << " WHERE Counter > " << oe->sqlCounterRunners; + query << " OR Modified > '" << oe->sqlUpdateRunners << "'";*/ + Result res = query.store(selectUpdated("oRunner", oe->sqlUpdateRunners, oe->sqlCounterRunners)); + + if (res) { + for (int i=0; igetRunner(Id, 0); + + if (r) { + r->Removed=true; + if (r->tInTeam) + r->tInTeam->correctRemove(r); + + if (r->tParentRunner) { + r->tParentRunner->correctRemove(r); + } + + r->changedObject(); + oe->sqlChangedRunners = true; + } + } + else{ + oRunner *r=oe->getRunner(Id, 0); + + if (r){ + if (isOld(counter, modified, r)) + syncRead(false, r); + } + else { + oRunner or(oe, Id); + syncRead(true, &or, false, false); + r = oe->addRunner(or, false); + } + } + oe->sqlCounterRunners = max(counter, oe->sqlCounterRunners); + oe->sqlUpdateRunners = max(modified, oe->sqlUpdateRunners); + } + } + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCLIST oRunner]"); + return false; + } + return true; +} + +bool MeosSQL::syncListClass(oEvent *oe) +{ + errorMessage.clear(); + + if (!con.connected()) + return false; + + try{ + Query query = con.query(); + /* + query << "SELECT Id, Counter, Modified, Removed FROM oClass"; + query << " WHERE Counter > " << oe->sqlCounterClasses; + query << " OR Modified > '" << oe->sqlUpdateClasses << "'";*/ + + //Result res = query.store(); + Result res = query.store(selectUpdated("oClass", oe->sqlUpdateClasses, oe->sqlCounterClasses)); + + if (res) { + + for (int i=0; igetClass(Id); + if (c) { + c->changedObject(); + c->Removed=true; + } + } + else { + oClass *c=oe->getClass(Id); + + if (!c) { + oClass oc(oe, Id); + syncRead(true, &oc, false); + c=oe->addClass(oc); + if (c!=0) { + c->changed = false; + //syncRead(true, c, false); + } + } + else if (isOld(counter, modified, c)) + syncRead(false, c, false); + } + oe->sqlCounterClasses = max(counter, oe->sqlCounterClasses); + oe->sqlUpdateClasses = max(modified, oe->sqlUpdateClasses); + } + } + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCLIST oClass]"); + return false; + } + return true; +} + + +bool MeosSQL::syncListClub(oEvent *oe) +{ + errorMessage.clear(); + + if (!con.connected()) + return false; + + try{ + Query query = con.query(); + + /*query << "SELECT Id, Counter, Modified, Removed FROM oClub"; + query << " WHERE Counter > " << oe->sqlCounterClubs; + query << " OR Modified > '" << oe->sqlUpdateClubs << "'";*/ + Result res = query.store(selectUpdated("oClub", oe->sqlUpdateClubs, oe->sqlCounterClubs)); + + if (res) { + for(int i=0; igetClub(Id); + + if (c) { + c->Removed=true; + c->changedObject(); + } + } + else { + oClub *c=oe->getClub(Id); + + if (c==0) { + oClub oc(oe, Id); + syncRead(true, &oc); + oe->addClub(oc); + } + else if (isOld(counter, modified, c)) + syncRead(false, c); + } + oe->sqlCounterClubs = max(counter, oe->sqlCounterClubs); + oe->sqlUpdateClubs = max(modified, oe->sqlUpdateClubs); + } + } + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCLIST oClub]"); + return false; + } + return true; +} + + +bool MeosSQL::syncListCourse(oEvent *oe) +{ + errorMessage.clear(); + + if (!con.connected()) + return false; + + try{ + Query query = con.query(); + /* + query << "SELECT Id, Counter, Modified, Removed FROM oCourse"; + query << " WHERE Counter > " << oe->sqlCounterCourses; + query << " OR Modified > '" << oe->sqlUpdateCourses << "'"; + */ + Result res = query.store(selectUpdated("oCourse", oe->sqlUpdateCourses, oe->sqlCounterCourses)); + + + if (res) { + set tmp; + for(int i=0; igetCourse(Id); + + if (c) { + c->Removed=true; + c->changedObject(); + } + } + else{ + oCourse *c=oe->getCourse(Id); + + if (c==0) { + oCourse oc(oe, Id); + syncReadCourse(true, &oc, tmp); + oe->addCourse(oc); + } + else if (isOld(counter, modified, c)) + syncReadCourse(false, c, tmp); + } + oe->sqlCounterCourses = max(counter, oe->sqlCounterCourses); + oe->sqlUpdateCourses = max(modified, oe->sqlUpdateCourses); + } + } + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCLIST oCourse]"); + return false; + } + return true; +} + +bool MeosSQL::syncListCard(oEvent *oe) +{ + errorMessage.clear(); + + if (!con.connected()) + return false; + + try{ + Query query = con.query(); + + /*query << "SELECT Id, Counter, Modified, Removed FROM oCard"; + query << " WHERE Counter>0 AND (Counter>" << oe->sqlCounterCards; + query << " OR Modified>'" << oe->sqlUpdateCards << "')";*/ + + Result res = query.store(selectUpdated("oCard", oe->sqlUpdateCards, oe->sqlCounterCards)); + + if (res) { + for (int i=0; igetCard(Id); + if (c) { + c->changedObject(); + c->Removed=true; + } + } + else { + oCard *c=oe->getCard(Id); + + if (c) { + if (isOld(counter, modified, c)) + syncRead(false, c); + } + else { + oCard oc(oe, Id); + c = oe->addCard(oc); + if (c!=0) + syncRead(true, c); + } + } + oe->sqlCounterCards = max(counter, oe->sqlCounterCards); + oe->sqlUpdateCards = max(modified, oe->sqlUpdateCards); + } + } + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCLIST oCard]"); + return false; + } + return true; +} + +bool MeosSQL::syncListControl(oEvent *oe) +{ + errorMessage.clear(); + + if (!con.connected()) + return false; + + try{ + Query query = con.query(); + + /*query << "SELECT Id, Counter, Modified, Removed FROM oControl"; + query << " WHERE Counter > " << oe->sqlCounterControls; + query << " OR Modified > '" << oe->sqlUpdateControls << "'";*/ + + Result res = query.store(selectUpdated("oControl", oe->sqlUpdateControls, oe->sqlCounterControls)); + + //Result res = query.store(); + + if (res) { + for(int i=0; igetControl(Id, false); + + if (c) { + c->Removed=true; + c->changedObject(); + } + } + else { + oControl *c=oe->getControl(Id, false); + if (c) { + if (isOld(counter, modified, c)) + syncRead(false, c); + } + else { + oControl oc(oe, Id); + syncRead(true, &oc); + c = oe->addControl(oc); +// if (c!=0) +// syncRead(true, c); + } + } + oe->sqlCounterControls = max(counter, oe->sqlCounterControls); + oe->sqlUpdateControls = max(modified, oe->sqlUpdateControls); + } + } + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCLIST oControl]"); + return false; + } + return true; +} + +bool MeosSQL::syncListPunch(oEvent *oe) +{ + errorMessage.clear(); + + if (!con.connected()) + return false; + + try{ + Query query = con.query(); + + /*query << "SELECT Id, Counter, Modified, Removed FROM oPunch"; + query << " WHERE Counter > " << oe->sqlCounterPunches; + query << " OR Modified > '" << oe->sqlUpdatePunches << "' ORDER BY Id";*/ + Result res = query.store(selectUpdated("oPunch", oe->sqlUpdatePunches, oe->sqlCounterPunches) + " ORDER BY Id"); + //Result res = query.store(); + + if (res) { + for(int i=0; igetPunch(Id); + if (c) { + c->Removed=true; + int cid = c->getControlId(); + oFreePunch::rehashPunches(*oe, c->CardNo, 0); + pRunner r = oe->getRunner(c->tRunnerId, 0); + if (r) + r->markClassChanged(cid); + } + } + else { + oFreePunch *c=oe->getPunch(Id); + + if (c) { + if (isOld(counter, modified, c)) + syncRead(false, c, true); + } + else { + oFreePunch p(oe, Id); + syncRead(true, &p, false); + oe->addFreePunch(p); + } + } + oe->sqlCounterPunches = max(counter, oe->sqlCounterPunches); + oe->sqlUpdatePunches = max(modified, oe->sqlUpdatePunches); + } + } + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCLIST oPunch]"); + return false; + } + return true; +} + +bool MeosSQL::syncListTeam(oEvent *oe) +{ + errorMessage.clear(); + + if (!con.connected()) + return false; + + try{ + Query query = con.query(); + /* + query << "SELECT Id, Counter, Modified, Removed FROM oTeam"; + query << " WHERE Counter > " << oe->sqlCounterTeams; + query << " OR Modified > '" << oe->sqlUpdateTeams << "'";*/ + + Result res = query.store(selectUpdated("oTeam", oe->sqlUpdateTeams, oe->sqlCounterTeams)); + + if (res) { + for (int i=0; igetTeam(Id); + if (t) { + t->changedObject(); + t->prepareRemove(); + t->Removed=true; + oe->sqlChangedTeams = true; + } + } + else { + oTeam *t=oe->getTeam(Id); + + if (t) { + if (isOld(counter, modified, t)) + syncRead(false, t, false); + } + else{ + oTeam ot(oe, Id); + t = oe->addTeam(ot, false); + if (t) { + syncRead(true, t, false); + t->apply(false, 0, false); + t->changed = false; + } + } + } + oe->sqlCounterTeams = max(counter, oe->sqlCounterTeams); + oe->sqlUpdateTeams = max(modified, oe->sqlUpdateTeams); + } + } + } + catch (const mysqlpp::Exception& er){ + alert(string(er.what())+" [SYNCLIST oTeam]"); + return false; + } + return true; +} + +string MeosSQL::selectUpdated(const char *oTable, const string &updated, int counter) { + string p1 = string("SELECT Id, Counter, Modified, Removed FROM ") + oTable; + + string q = "(" + p1 + " WHERE Counter>" + itos(counter) + ") UNION ALL ("+ + p1 + " WHERE Modified>'" + updated + "' AND Counter<" + itos(counter) + " AND Counter>0)"; + + return q; +} + +bool MeosSQL::checkConnection(oEvent *oe) +{ + errorMessage.clear(); + + if (!oe) { + if (monitorId && con.connected()) { + try { + Query query = con.query(); + query << "Update oMonitor SET Removed=1 WHERE Id = " << monitorId; + query.execute(); + } + catch(...) { + return false; //Not an important error. + } + } + return true; + } + + oe->connectedClients.clear(); + if (monitorId==0) { + try { + Query query = con.query(); + query << "INSERT INTO oMonitor SET Count=1, Client=" << quote << oe->clientName; + ResNSel res=query.execute(); + if (res) + monitorId=static_cast(res.insert_id); + } + catch (const mysqlpp::Exception& er){ + oe->connectedClients.push_back(er.what()); + return false; + } + } + else { + try { + Query query = con.query(); + query << "Update oMonitor SET Count=Count+1, Client=" << quote << oe->clientName + << " WHERE Id = " << monitorId; + query.execute(); + } + catch (const mysqlpp::Exception& er){ + oe->connectedClients.push_back(er.what()); + return false; + } + } + bool callback=false; + + try { + Query query = con.query(); + query << "SELECT Id, Client FROM oMonitor WHERE Modified>TIMESTAMPADD(SECOND, -30, NOW())" + " AND Removed=0 ORDER BY Client"; + + Result res = query.store(); + + if (res) { + for (int i=0; iconnectedClients.push_back(string(row["Client"])); + + if (int(row["Id"])==monitorId) + callback=true; + } + } + } + catch (const mysqlpp::Exception& er){ + oe->connectedClients.push_back(er.what()); + return false; + } + return callback; +} + +void MeosSQL::setDefaultDB() +{ + errorMessage.clear(); + + if (CmpDataBase.empty()) + return; + + try { + if (!con.connected()) + return; + + con.select_db(CmpDataBase); + } + catch(...) { + } +} + +bool MeosSQL::dropDatabase(oEvent *oe) +{ + // Check if other cients are connected. + if ( !checkConnection(oe) ) { + if (!oe->connectedClients.empty()) + alert(oe->connectedClients[0]); + + return false; + } + + if (oe->connectedClients.size()!=1) { + alert("Database is used and cannot be deleted"); + return false; + } + + try { + con.select_db("MeOSMain"); + } + catch (const mysqlpp::Exception& er) { + alert(string(er.what()) + " MySQL Error. Select MeosMain"); + setDefaultDB(); + return 0; + } + + try { + con.drop_db(CmpDataBase); + } + catch (const mysqlpp::Exception& ) { + //Don't care if we fail. + } + + try { + Query query = con.query(); + query << "DELETE FROM oEvent WHERE NameId=" << quote << CmpDataBase; + query.execute(); + } + catch (const mysqlpp::Exception& ) { + //Don't care if we fail. + } + + CmpDataBase.clear(); + + errorMessage.clear(); + + try { + con.close(); + } + catch (const mysqlpp::Exception&) { + } + + return true; +} + +void MeosSQL::importLists(oEvent *oe, const char *bf) { + xmlparser xml(0); + xml.readMemory(bf, 0); + oe->listContainer->clearExternal(); + oe->listContainer->load(MetaListContainer::ExternalList, xml.getObject("Lists"), false); +} + +void MeosSQL::encodeLists(const oEvent *oe, string &listEnc) const { + xmlparser parser(0); + parser.openMemoryOutput(true); + parser.startTag("Lists"); + oe->listContainer->save(MetaListContainer::ExternalList, parser, oe); + parser.endTag(); + parser.getMemoryOutput(listEnc); +} + +void MeosSQL::clearReadTimes() { + readTimes.clear(); +} + +int getTypeId(const oBase &ob) +{ + if (typeid(ob)==typeid(oRunner)){ + return 1; + } + else if (typeid(ob)==typeid(oClass)){ + return 2; + } + else if (typeid(ob)==typeid(oCourse)){ + return 3; + } + else if (typeid(ob)==typeid(oControl)){ + return 4; + } + else if (typeid(ob)==typeid(oClub)){ + return 5; + } + else if (typeid(ob)==typeid(oCard)){ + return 6; + } + else if (typeid(ob)==typeid(oFreePunch)){ + return 7; + } + else if (typeid(ob)==typeid(oTeam)){ + return 8; + } + else if (typeid(ob)==typeid(oEvent)){ + return 9; + } + return -1; +} +static int skipped = 0, notskipped = 0, readent = 0; + +void MeosSQL::synchronized(const oBase &entity) { + int id = getTypeId(entity); + readTimes[make_pair(id, entity.getId())] = GetTickCount(); + readent++; + if (readent % 100 == 99) + OutputDebugString("Read 100 entities\n"); +} + +bool MeosSQL::skipSynchronize(const oBase &entity) const { + int id = getTypeId(entity); + map, DWORD>::const_iterator res = readTimes.find(make_pair(id, entity.getId())); + + if (res != readTimes.end()) { + DWORD t = GetTickCount(); + if (t > res->second && (t - res->second) < 1000) { + skipped++; + return true; + } + } + + notskipped++; + return false; +} + +int MeosSQL::getModifiedMask(oEvent &oe) { + try { + Query query = con.query(); + int res = 0; + Result store_res = query.store("SELECT * FROM oCounter"); + if (store_res.num_rows()>0) { + Row r = store_res.at(0); + int ctrl = r["oControl"]; + int crs = r["oCourse"]; + int cls = r["oClass"]; + int card = r["oCard"]; + int club = r["oClub"]; + int punch = r["oPunch"]; + int runner = r["oRunner"]; + int t = r["oTeam"]; + int e = r["oEvent"]; + + if (ctrl > oe.sqlCounterControls) + res |= oLControlId; + if (crs > oe.sqlCounterCourses) + res |= oLCourseId; + if (cls > oe.sqlCounterClasses) + res |= oLClassId; + if (card > oe.sqlCounterCards) + res |= oLCardId; + if (club > oe.sqlCounterClubs) + res |= oLClubId; + if (punch > oe.sqlCounterPunches) + res |= oLPunchId; + if (runner > oe.sqlCounterRunners) + res |= oLRunnerId; + if (t > oe.sqlCounterTeams) + res |= oLTeamId; + if (e > oe.counter) + res |= oLEventId; + + return res; + } + } + catch(...) { + } + return -1; +} \ No newline at end of file diff --git a/code/meosdb/MeosSQL.h b/code/meosdb/MeosSQL.h new file mode 100644 index 0000000..4b3d2c8 --- /dev/null +++ b/code/meosdb/MeosSQL.h @@ -0,0 +1,184 @@ +#pragma once +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2012 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + +#include + +#include +#include "sqltypes.h" + +class oRunner; +class oEvent; +class oCard; +class oClub; +class oCourse; +class oClass; +class oControl; +class oBase; +class oFreePunch; +class oDataInterface; +class oTeam; +class oDataContainer; + +namespace mysqlpp { + class Query; +} + +using namespace std; + + +class MeosSQL +{ +protected: + bool warnedOldVersion; + int monitorId; + int buildVersion; + mysqlpp::Connection con; + string CmpDataBase; + void alert(const string &s); + + string errorMessage; + + string serverName; + string serverUser; + string serverPassword; + unsigned int serverPort; + + bool isOld(int counter, const string &time, oBase *ob); + string andWhereOld(oBase *ob); + + OpFailStatus updateTime(const char *oTable, oBase *ob); + // Update object in database with fixed query. If useId is false, Id is ignored (used + OpFailStatus syncUpdate(mysqlpp::Query &updateqry, const char *oTable, oBase *ob); + bool storeData(oDataInterface odi, const mysqlpp::Row &row, unsigned long &revision); + + void importLists(oEvent *oe, const char *bf); + void encodeLists(const oEvent *or, string &listEnc) const; + + //Set DB to default competition DB + void setDefaultDB(); + + // Update the courses of a class. + OpFailStatus syncReadClassCourses(oClass *c,const set &courses, + bool readRecursive); + OpFailStatus syncRead(bool forceRead, oTeam *t, bool readRecursive); + OpFailStatus syncRead(bool forceRead, oRunner *r, bool readClassClub, bool readCourseCard); + OpFailStatus syncReadCourse(bool forceRead, oCourse *c, set &readControls); + OpFailStatus syncRead(bool forceRead, oClass *c, bool readCourses); + OpFailStatus syncReadControls(oEvent *oe, const set &controlIds); + + void storeClub(const mysqlpp::Row &row, oClub &c); + void storeControl(const mysqlpp::Row &row, oControl &c); + void storeCard(const mysqlpp::Row &row, oCard &c); + void storePunch(const mysqlpp::Row &row, oFreePunch &p, bool rehash); + + OpFailStatus storeTeam(const mysqlpp::Row &row, oTeam &t, + bool readRecursive); + + OpFailStatus storeRunner(const mysqlpp::Row &row, oRunner &r, + bool readCourseCard, + bool readClassClub, + bool readRunners); + OpFailStatus storeCourse(const mysqlpp::Row &row, oCourse &c, + set &readControls); + OpFailStatus storeClass(const mysqlpp::Row &row, oClass &c, + bool readCourses); + + void getColumns(const string &table, set &output); + + void upgradeDB(const string &db, oDataContainer const *odi); + + void warnOldDB(); + bool checkOldVersion(oEvent *oe, mysqlpp::Row &row); + + map, DWORD> readTimes; + void clearReadTimes(); + void synchronized(const oBase &entity); + bool skipSynchronize(const oBase &entity) const; + + mysqlpp::ResNSel updateCounter(const char *oTable, int id, mysqlpp::Query *updateqry); + string selectUpdated(const char *oTable, const string &updated, int counter); + +public: + bool dropDatabase(oEvent *oe); + bool checkConnection(oEvent *oe); + + bool repairTables(const string &db, vector &output); + + bool getErrorMessage(char *bf); + bool reConnect(); + bool listCompetitions(oEvent *oe, bool keepConnection); + bool Remove(oBase *ob); + + // Create database of runners and clubs + bool createRunnerDB(oEvent *oe, mysqlpp::Query &query); + + // Upload runner database to server + OpFailStatus uploadRunnerDB(oEvent *oe); + + bool openDB(oEvent *oe); + + bool closeDB(); + + bool syncListRunner(oEvent *oe); + bool syncListClass(oEvent *oe); + bool syncListCourse(oEvent *oe); + bool syncListControl(oEvent *oe); + bool syncListCard(oEvent *oe); + bool syncListClub(oEvent *oe); + bool syncListPunch(oEvent *oe); + bool syncListTeam(oEvent *oe); + + OpFailStatus SyncEvent(oEvent *oe); + + OpFailStatus SyncUpdate(oEvent *oe); + OpFailStatus SyncRead(oEvent *oe); + + OpFailStatus syncUpdate(oRunner *r, bool forceWriteAll); + OpFailStatus syncRead(bool forceRead, oRunner *r); + + OpFailStatus syncUpdate(oCard *c, bool forceWriteAll); + OpFailStatus syncRead(bool forceRead, oCard *c); + + OpFailStatus syncUpdate(oClass *c, bool forceWriteAll); + OpFailStatus syncRead(bool forceRead, oClass *c); + + OpFailStatus syncUpdate(oClub *c, bool forceWriteAll); + OpFailStatus syncRead(bool forceRead, oClub *c); + + OpFailStatus syncUpdate(oCourse *c, bool forceWriteAll); + OpFailStatus syncRead(bool forceRead, oCourse *c); + + OpFailStatus syncUpdate(oControl *c, bool forceWriteAll); + OpFailStatus syncRead(bool forceRead, oControl *c); + + OpFailStatus syncUpdate(oFreePunch *c, bool forceWriteAll); + OpFailStatus syncRead(bool forceRead, oFreePunch *c, bool rehash); + + OpFailStatus syncUpdate(oTeam *t, bool forceWriteAll); + OpFailStatus syncRead(bool forceRead, oTeam *t); + + int getModifiedMask(oEvent &oe); + + MeosSQL(void); + virtual ~MeosSQL(void); +}; diff --git a/code/meosdb/dllmain.cpp b/code/meosdb/dllmain.cpp new file mode 100644 index 0000000..8a4edd3 --- /dev/null +++ b/code/meosdb/dllmain.cpp @@ -0,0 +1,19 @@ +// dllmain.cpp : Defines the entry point for the DLL application. +#include "stdafx.h" + +BOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + diff --git a/code/meosdb/meosdb.cpp b/code/meosdb/meosdb.cpp new file mode 100644 index 0000000..bd65900 --- /dev/null +++ b/code/meosdb/meosdb.cpp @@ -0,0 +1,266 @@ +/************************************************************************ + MeOS - Orienteering Software + Copyright (C) 2009-2017 Melin Software HB + + 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 . + + Melin Software HB - software@melin.nu - www.melin.nu + Eksoppsvägen 16, SE-75646 UPPSALA, Sweden + +************************************************************************/ + + +// meosdb.cpp : Defines the exported functions for the DLL application. +// + +#include "stdafx.h" + +#ifdef c + #include "meosdb.h" +#else + #define MEOSDB_API +#endif + +#include + +#include +#include + +#include +#include +#include + +#include "MeosSQL.h" +#include "../meos_util.h" + +using namespace std; + +#include "../oRunner.h" +#include "../oEvent.h" +#include "../Localizer.h" + +#include + +#ifdef BUILD_DB_DLL + HINSTANCE hInst=0; + Localizer lang; +#endif + +extern "C"{ + +int MEOSDB_API getMeosVersion() +{ + return getMeosBuild(); +} + +MeosSQL msql; +static int nSynchList = 0; +static int nSynchEnt = 0; + +int getListMask(oEvent &oe) { + return msql.getModifiedMask(oe); +} + +bool MEOSDB_API msSynchronizeList(oEvent *oe, int lid) +{ + nSynchList++; + if (nSynchList % 100 == 99) + OutputDebugString("Synchronized 100 lists\n"); + + if (lid==oLRunnerId) + return msql.syncListRunner(oe); + else if (lid==oLClassId) + return msql.syncListClass(oe); + else if (lid==oLCourseId) + return msql.syncListCourse(oe); + else if (lid==oLControlId) + return msql.syncListControl(oe); + else if (lid==oLClubId) + return msql.syncListClub(oe); + else if (lid==oLCardId) + return msql.syncListCard(oe); + else if (lid==oLPunchId) + return msql.syncListPunch(oe); + else if (lid==oLTeamId) + return msql.syncListTeam(oe); + + return false; +} + +int MEOSDB_API msSynchronizeUpdate(oBase *obj) +{ + if (typeid(*obj)==typeid(oRunner)){ + return msql.syncUpdate((oRunner *) obj, false); + } + else if (typeid(*obj)==typeid(oClass)){ + return msql.syncUpdate((oClass *) obj, false); + } + else if (typeid(*obj)==typeid(oCourse)){ + return msql.syncUpdate((oCourse *) obj, false); + } + else if (typeid(*obj)==typeid(oControl)){ + return msql.syncUpdate((oControl *) obj, false); + } + else if (typeid(*obj)==typeid(oClub)){ + return msql.syncUpdate((oClub *) obj, false); + } + else if (typeid(*obj)==typeid(oCard)){ + return msql.syncUpdate((oCard *) obj, false); + } + else if (typeid(*obj)==typeid(oFreePunch)){ + return msql.syncUpdate((oFreePunch *) obj, false); + } + else if (typeid(*obj)==typeid(oEvent)){ + + return msql.SyncUpdate((oEvent *) obj); + } + else if (typeid(*obj)==typeid(oTeam)){ + return msql.syncUpdate((oTeam *) obj, false); + } + return 0; +} + +int MEOSDB_API msSynchronizeRead(oBase *obj) +{ + nSynchEnt++; + if (nSynchEnt % 100 == 99) + OutputDebugString("Synchronized 100 entities\n"); + + if (typeid(*obj)==typeid(oRunner)){ + return msql.syncRead(false, (oRunner *) obj ); + } + else if (typeid(*obj)==typeid(oClass)){ + return msql.syncRead(false, (oClass *) obj); + } + else if (typeid(*obj)==typeid(oCourse)){ + return msql.syncRead(false, (oCourse *) obj); + } + else if (typeid(*obj)==typeid(oControl)){ + return msql.syncRead(false, (oControl *) obj); + } + else if (typeid(*obj)==typeid(oClub)){ + return msql.syncRead(false, (oClub *) obj); + } + else if (typeid(*obj)==typeid(oCard)){ + return msql.syncRead(false, (oCard *) obj); + } + else if (typeid(*obj)==typeid(oFreePunch)){ + return msql.syncRead(false, (oFreePunch *) obj, true); + } + else if (typeid(*obj)==typeid(oTeam)){ + return msql.syncRead(false, (oTeam *) obj); + } + else if (typeid(*obj)==typeid(oEvent)){ + return msql.SyncRead((oEvent *) obj); + } + return 0; +} + +// Removes (marks it as removed) an entry from the database. +int MEOSDB_API msRemove(oBase *obj) +{ + return msql.Remove(obj); +} + +// Checks the database connection, lists other connected components +// and register ourself in the database. The value oe=0 unregister us. +int MEOSDB_API msMonitor(oEvent *oe) +{ + return msql.checkConnection(oe); +} + +// Tries to open the database defined by oe. +int MEOSDB_API msUploadRunnerDB(oEvent *oe) +{ + return msql.uploadRunnerDB(oe); +} + +// Tries to open the database defined by oe. +int MEOSDB_API msOpenDatabase(oEvent *oe) +{ + return msql.openDB(oe); +} + +// Tries to remove the database defined by oe. +int MEOSDB_API msDropDatabase(oEvent *oe) +{ + return msql.dropDatabase(oe); +} + +// Tries to connect to the server defined by oe. +int MEOSDB_API msConnectToServer(oEvent *oe) +{ + return msql.listCompetitions(oe, false); +} + +// Reloads competitions. Assumes a connection. +int MEOSDB_API msListCompetitions(oEvent *oe) +{ + return msql.listCompetitions(oe, true); +} + +// Fills string msgBuff with the current error stage +bool MEOSDB_API msGetErrorState(char *msgBuff) +{ + return msql.getErrorMessage(msgBuff); +} + +// Close database connection. +bool MEOSDB_API msResetConnection() +{ + return msql.closeDB(); +} + +// Try to reconnect to the database. Returns true if successful. +bool MEOSDB_API msReConnect() +{ + return msql.reConnect(); +} + + +} //Extern "C" + +bool repairTables(const string &db, vector &output) { + return msql.repairTables(db, output); +} + + +#ifdef BUILD_DB_DLL + +bool getUserFile(char *file, const char *in) +{ + throw 0; + strcpy_s(file, 256, in); + return true; +} + +string MakeDash(string) +{ + throw 0; + return ""; +} + +bool __cdecl GetRandomBit() +{ + throw 0; + return true; +} + +int __cdecl GetRandomNumber(int) +{ + throw 0; + return 0; +} + +#endif diff --git a/code/meosdb/meosdb.h b/code/meosdb/meosdb.h new file mode 100644 index 0000000..3dc6b47 --- /dev/null +++ b/code/meosdb/meosdb.h @@ -0,0 +1,29 @@ +// The following ifdef block is the standard way of creating macros which make exporting +// from a DLL simpler. All files within this DLL are compiled with the MEOSDB_EXPORTS +// symbol defined on the command line. this symbol should not be defined on any project +// that uses this DLL. This way any other project whose source files include this file see +// MEOSDB_API functions as being imported from a DLL, whereas this DLL sees symbols +// defined with this macro as being exported. +#ifdef MEOSDB_EXPORTS +#define MEOSDB_API __declspec(dllexport) __cdecl +#else +#define MEOSDB_API __declspec(dllimport) __cdecl +#endif + +#include +#include + +/* +extern "C"{ +// This class is exported from the meosdb.dll +class Cmeosdb { +public: + Cmeosdb(void); + // TODO: add your methods here. +}; + +//extern MEOSDB_API int nmeosdb; + + +MEOSDB_API int fnmeosdb(void); +}*/ \ No newline at end of file diff --git a/code/meosdb/meosdb.vcproj b/code/meosdb/meosdb.vcproj new file mode 100644 index 0000000..085de92 --- /dev/null +++ b/code/meosdb/meosdb.vcproj @@ -0,0 +1,391 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/meosdb/meosdb.vcxproj b/code/meosdb/meosdb.vcxproj new file mode 100644 index 0000000..ec88d9c --- /dev/null +++ b/code/meosdb/meosdb.vcxproj @@ -0,0 +1,158 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {13A51976-5F88-471F-A1E9-259102710806} + meosdb + Win32Proj + + + + DynamicLibrary + MultiByte + true + + + DynamicLibrary + NotSet + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + true + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + mysql++\;C:\Program Files\MySQL\MySQL Server 5.5\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;MEOSDB_EXPORTS;MEOSDB;%(PreprocessorDefinitions) + false + EnableFastChecks + MultiThreadedDebugDLL + Use + Level3 + EditAndContinue + true + + + mysqlpp.lib;Msimg32.lib;comctl32.lib;winmm.lib;%(AdditionalDependencies) + ..\lib_db;%(AdditionalLibraryDirectories) + true + Windows + MachineX86 + + + + + MaxSpeed + AnySuitable + true + Speed + F:\Dev\meos\code\meosdb\mysql++;F:\Dev\meos\code\meosdb\mysql50;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;MEOSDB_EXPORTS;MEOSDB;%(PreprocessorDefinitions) + MultiThreadedDLL + true + Use + Level3 + + + + + Msimg32.lib;comctl32.lib;mysqlpp.lib;winmm.lib;%(AdditionalDependencies) + ..\lib;%(AdditionalLibraryDirectories) + true + Windows + true + true + MachineX86 + + + + + + + + + + false + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/code/meosdb/mysql++/Doxyfile.in b/code/meosdb/mysql++/Doxyfile.in new file mode 100644 index 0000000..b5fa682 --- /dev/null +++ b/code/meosdb/mysql++/Doxyfile.in @@ -0,0 +1,1258 @@ +# Doxyfile 1.5.2-1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file that +# follow. The default is UTF-8 which is also the encoding used for all text before +# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into +# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of +# possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = MySQL++ + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = @PACKAGE_VERSION@ + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = ../doc + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, +# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, +# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, +# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to +# include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = YES + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from the +# version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = + +# This tag can be used to specify the character encoding of the source files that +# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default +# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. +# See http://www.gnu.org/software/libiconv for the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = custom.h \ + custom-macros.h + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the output. +# The symbol name can be a fully qualified name, a word, or if the wildcard * is used, +# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentstion. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html/refman + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = ../doc/html/refman/_header.html + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = letter + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = DOXYGEN_IGNORE + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to +# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to +# specify the directory where the mscgen tool resides. If left empty the tool is assumed to +# be found in the default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a caller dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen will always +# show the root nodes and its direct children regardless of this setting. + +DOT_GRAPH_MAX_NODES = 50 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, which results in a white background. +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/code/meosdb/mysql++/autoflag.h b/code/meosdb/mysql++/autoflag.h new file mode 100644 index 0000000..77ef8a6 --- /dev/null +++ b/code/meosdb/mysql++/autoflag.h @@ -0,0 +1,57 @@ +/// \file autoflag.h +/// \brief Defines a template for setting a flag within a given variable +/// scope, and resetting it when exiting that scope. + +/*********************************************************************** + Copyright (c) 2007 by Educational Technology Resources, Inc. Others + may also hold copyrights on code in this file. See the CREDITS file in + the top directory of the distribution for details. + + This file is part of MySQL++. + + MySQL++ is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + MySQL++ 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 Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with MySQL++; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 + USA +***********************************************************************/ + +#if !defined(MYSQLPP_AUTOFLAG_H) +#define MYSQLPP_AUTOFLAG_H + +/// \brief A template for setting a flag on a variable as long as the +/// object that set it is in scope. Flag resets when object goes +/// out of scope. Works on anything that looks like bool. + +template +class AutoFlag +{ +public: + /// \brief Constructor: sets ref to true. + AutoFlag(T& ref) : + referent_(ref) + { + referent_ = true; + } + + /// \brief Destructor: sets referent passed to ctor to false. + ~AutoFlag() + { + referent_ = false; + } + +private: + T& referent_; +}; + +#endif // !defined(MYSQLPP_AUTOFLAG_H) + diff --git a/code/meosdb/mysql++/coldata.cpp b/code/meosdb/mysql++/coldata.cpp new file mode 100644 index 0000000..9f9f3eb --- /dev/null +++ b/code/meosdb/mysql++/coldata.cpp @@ -0,0 +1,37 @@ +/*********************************************************************** + coldata.cpp - Implements the ColData_Tmpl template. + + Copyright (c) 1998 by Kevin Atkinson, (c) 1999, 2000 and 2001 by + MySQL AB, and (c) 2004, 2005 by Educational Technology Resources, Inc. + Others may also hold copyrights on code in this file. See the CREDITS + file in the top directory of the distribution for details. + + This file is part of MySQL++. + + MySQL++ is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + MySQL++ 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 Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with MySQL++; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 + USA +***********************************************************************/ + +#include "coldata.h" +#include "const_string.h" + +#include + +namespace mysqlpp { + +template class ColData_Tmpl; +template class ColData_Tmpl; + +} // end namespace mysqlpp diff --git a/code/meosdb/mysql++/coldata.h b/code/meosdb/mysql++/coldata.h new file mode 100644 index 0000000..1504f4c --- /dev/null +++ b/code/meosdb/mysql++/coldata.h @@ -0,0 +1,386 @@ +/// \file coldata.h +/// \brief Declares classes for converting string data to any of +/// the basic C types. +/// +/// Roughly speaking, this defines classes that are the inverse of +/// mysqlpp::SQLString. + +/*********************************************************************** + Copyright (c) 1998 by Kevin Atkinson, (c) 1999, 2000 and 2001 by + MySQL AB, and (c) 2004-2007 by Educational Technology Resources, Inc. + Others may also hold copyrights on code in this file. See the CREDITS + file in the top directory of the distribution for details. + + This file is part of MySQL++. + + MySQL++ is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + MySQL++ 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 Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with MySQL++; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 + USA +***********************************************************************/ + +#ifndef MYSQLPP_COLDATA_H +#define MYSQLPP_COLDATA_H + +#include "common.h" + +#include "const_string.h" +#include "convert.h" +#include "exceptions.h" +#include "null.h" +#include "string_util.h" +#include "type_info.h" + +#include +#include +#include + +#include + +namespace mysqlpp { + +/// \brief Template for string data that can convert itself to any +/// standard C data type. +/// +/// Do not use this class directly. Use the typedef ColData or +/// MutableColData instead. ColData is a \c ColData_Tmpl and MutableColData is a +/// \c ColData_Tmpl. +/// +/// The ColData types add to the C++ string type the ability to +/// automatically convert the string data to any of the basic C types. +/// This is important with SQL, because all data coming from the +/// database is in string form. MySQL++ uses this class internally +/// to hold the data it receives from the server, so you can use it +/// naturally, because it does the conversions implicitly: +/// +/// \code ColData("12.86") + 2.0 \endcode +/// +/// That works fine, but be careful. If you had said this instead: +/// +/// \code ColData("12.86") + 2 \endcode +/// +/// the result would be 14 because 2 is an integer, and C++'s type +/// conversion rules put the ColData object in an integer context. +/// +/// If these automatic conversions scare you, define the macro +/// NO_BINARY_OPERS to disable this behavior. +/// +/// This class also has some basic information about the type of data +/// stored in it, to allow it to do the conversions more intelligently +/// than a trivial implementation would allow. + +template +class MYSQLPP_EXPORT ColData_Tmpl : public Str +{ +public: + /// \brief Default constructor + /// + /// Null flag is set to false, type data is not set, and string + /// data is left empty. + /// + /// It's probably a bad idea to use this ctor, becuase there's no + /// way to set the type data once the object's constructed. + ColData_Tmpl() : + null_(false) + { + } + + /// \brief Copy ctor + /// + /// \param cd the other ColData_Tmpl object + ColData_Tmpl(const ColData_Tmpl& cd) : + Str(cd.data(), cd.length()), + type_(cd.type_), + null_(cd.null_) + { + } + + /// \brief Constructor allowing you to set the null flag and the + /// type data. + /// + /// \param n if true, data is a SQL null + /// \param t MySQL type information for data being stored + explicit ColData_Tmpl(bool n, + mysql_type_info t = mysql_type_info::string_type) : + type_(t), + null_(n) + { + } + + /// \brief C++ string version of full ctor + /// + /// \param str the string this object represents + /// \param t MySQL type information for data within str + /// \param n if true, str is a SQL null + explicit ColData_Tmpl(const std::string& str, + mysql_type_info t = mysql_type_info::string_type, + bool n = false) : + Str(str), + type_(t), + null_(n) + { + } + + /// \brief Null-terminated C string version of full ctor + /// + /// \param str the string this object represents + /// \param t MySQL type information for data within str + /// \param n if true, str is a SQL null + explicit ColData_Tmpl(const char* str, + mysql_type_info t = mysql_type_info::string_type, + bool n = false) : + Str(str), + type_(t), + null_(n) + { + } + + /// \brief Full constructor. + /// + /// \param str the string this object represents + /// \param len the length of the string; embedded nulls are legal + /// \param t MySQL type information for data within str + /// \param n if true, str is a SQL null + explicit ColData_Tmpl(const char* str, typename Str::size_type len, + mysql_type_info t = mysql_type_info::string_type, + bool n = false) : + Str(str, len), + type_(t), + null_(n) + { + } + + /// \brief Get this object's current MySQL type. + mysql_type_info type() const { return type_; } + + /// \brief Returns true if data of this type should be quoted, false + /// otherwise. + bool quote_q() const { return type_.quote_q(); } + + /// \brief Returns true if data of this type should be escaped, false + /// otherwise. + bool escape_q() const { return type_.escape_q(); } + + /// \brief Template for converting data from one type to another. + template Type conv(Type dummy) const; + + /// \brief Set a flag indicating that this object is a SQL null. + void it_is_null() { null_ = true; } + + /// \brief Returns true if this object is a SQL null. + inline const bool is_null() const { return null_; } + + /// \brief Returns this object's data in C++ string form. + /// + /// This method is inefficient, and not recommended. It makes a + /// duplicate copy of the string that lives as long as the + /// \c ColData object itself. + /// + /// If you are using the \c MutableColData typedef for this + /// template, you can avoid the duplicate copy entirely. You can + /// pass a \c MutableColData object to anything expecting a + /// \c std::string and get the right result. (This didn't work + /// reliably prior to v2.3.) + /// + /// This method is arguably useful with plain \c ColData objects, + /// but there are more efficient alternatives. If you know your + /// data is a null-terminated C string, just cast this object to + /// a \c const \c char* or call the \c data() method. This gives + /// you a pointer to our internal buffer, so the copy isn't needed. + /// If the \c ColData can contain embedded null characters, you do + /// need to make a copy, but it's better to make your own copy of + /// the string, instead of calling get_string(), so you can better + /// control its lifetime: + /// + /// \code + /// ColData cd = ...; + /// std::string s(cd.data(), cd.length()); + /// \endcode + inline const std::string& get_string() const + { + temp_buf_.assign(Str::data(), Str::length()); + return temp_buf_; + } + + /// \brief Returns a const char pointer to the object's raw data + operator cchar*() const { return Str::data(); } + + /// \brief Converts this object's string data to a signed char + operator signed char() const + { return conv(static_cast(0)); } + + /// \brief Converts this object's string data to an unsigned char + operator unsigned char() const + { return conv(static_cast(0)); } + + /// \brief Converts this object's string data to an int + operator int() const + { return conv(static_cast(0)); } + + /// \brief Converts this object's string data to an unsigned int + operator unsigned int() const + { return conv(static_cast(0)); } + + /// \brief Converts this object's string data to a short int + operator short int() const + { return conv(static_cast(0)); } + + /// \brief Converts this object's string data to an unsigned short + /// int + operator unsigned short int() const + { return conv(static_cast(0)); } + + /// \brief Converts this object's string data to a long int + operator long int() const + { return conv(static_cast(0)); } + + /// \brief Converts this object's string data to an unsigned long + /// int + operator unsigned long int() const + { return conv(static_cast(0)); } + +#if !defined(NO_LONG_LONGS) + /// \brief Converts this object's string data to the platform- + /// specific 'longlong' type, usually a 64-bit integer. + operator longlong() const + { return conv(static_cast(0)); } + + /// \brief Converts this object's string data to the platform- + /// specific 'ulonglong' type, usually a 64-bit unsigned integer. + operator ulonglong() const + { return conv(static_cast(0)); } +#endif + + /// \brief Converts this object's string data to a float + operator float() const + { return conv(static_cast(0)); } + + /// \brief Converts this object's string data to a double + operator double() const + { return conv(static_cast(0)); } + + /// \brief Converts this object's string data to a bool + operator bool() const { return conv(0); } + + template operator Null() const; + +private: + mysql_type_info type_; + mutable std::string temp_buf_; + bool null_; +}; + +/// \typedef ColData_Tmpl ColData +/// \brief The type that is returned by constant rows +typedef ColData_Tmpl ColData; + +/// \typedef ColData_Tmpl MutableColData +/// \brief The type that is returned by mutable rows +typedef ColData_Tmpl MutableColData; + + +#if !defined(NO_BINARY_OPERS) && !defined(DOXYGEN_IGNORE) +// Ignore this section is NO_BINARY_OPERS is defined, or if this section +// is being parsed by Doxygen. In the latter case, it's ignored because +// Doxygen doesn't understand it correctly, and we can't be bothered to +// explain it to Doxygen. + +#define oprsw(opr, other, conv) \ + template \ + inline other operator opr (ColData_Tmpl x, other y) \ + {return static_cast(x) opr y;} \ + template \ + inline other operator opr (other x, ColData_Tmpl y) \ + {return x opr static_cast(y);} + +#define operator_binary(other, conv) \ + oprsw(+, other, conv) \ + oprsw(-, other, conv) \ + oprsw(*, other, conv) \ + oprsw(/, other, conv) + +#define operator_binary_int(other, conv) \ + operator_binary(other, conv) \ + oprsw(%, other, conv) \ + oprsw(&, other, conv) \ + oprsw(^, other, conv) \ + oprsw(|, other, conv) \ + oprsw(<<, other, conv) \ + oprsw(>>, other, conv) + +operator_binary(float, double) +operator_binary(double, double) + +operator_binary_int(char, long int) +operator_binary_int(int, long int) +operator_binary_int(short int, long int) +operator_binary_int(long int, long int) + +operator_binary_int(unsigned char, unsigned long int) +operator_binary_int(unsigned int, unsigned long int) +operator_binary_int(unsigned short int, unsigned long int) +operator_binary_int(unsigned long int, unsigned long int) + +#if !defined(NO_LONG_LONGS) +operator_binary_int(longlong, longlong) +operator_binary_int(ulonglong, ulonglong) +#endif +#endif // NO_BINARY_OPERS + +/// \brief Converts this object to a SQL null +/// +/// Returns a copy of the global null object if the string data held by +/// the object is exactly equal to "NULL". Else, it constructs an empty +/// object of type T and tries to convert it to Null. +template template +ColData_Tmpl::operator Null() const +{ + if ((Str::size() == 4) && + (*this)[0] == 'N' && + (*this)[1] == 'U' && + (*this)[2] == 'L' && + (*this)[3] == 'L') { + return Null(null); + } + else { + return Null(conv(T())); + } +} + +template template +Type ColData_Tmpl::conv(Type /* dummy */) const +{ + std::string strbuf(Str::data(), Str::length()); + strip_all_blanks(strbuf); + std::string::size_type len = strbuf.size(); + const char* str = strbuf.c_str(); + const char* end = str; + Type num = mysql_convert(str, end); + + if (*end == '.') { + ++end; + for (; *end == '0'; ++end) ; + } + + if (*end != '\0' && end != 0) { + throw BadConversion(typeid(Type).name(), Str::c_str(), + end - str, len); + } + + return num; +} + +} // end namespace mysqlpp + +#endif diff --git a/code/meosdb/mysql++/common.h b/code/meosdb/mysql++/common.h new file mode 100644 index 0000000..065fa57 --- /dev/null +++ b/code/meosdb/mysql++/common.h @@ -0,0 +1,161 @@ +/// \file common.h +/// \brief This file includes top-level definitions for use both +/// internal to the library, and outside it. Contrast mysql++.h +/// +/// This file mostly takes care of platform differences. + +/*********************************************************************** + Copyright (c) 1998 by Kevin Atkinson, (c) 1999, 2000 and 2001 by + MySQL AB, and (c) 2004-2007 by Educational Technology Resources, Inc. + Others may also hold copyrights on code in this file. See the CREDITS + file in the top directory of the distribution for details. + + This file is part of MySQL++. + + MySQL++ is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + MySQL++ 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 Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with MySQL++; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 + USA +***********************************************************************/ + +#if !defined(MYSQLPP_COMMON_H) +#define MYSQLPP_COMMON_H + +#if !defined(DOXYGEN_IGNORE) +// Doxygen will not generate documentation for the following stuff. + +// Work out major platform-specific stuff here. +#if defined(__WIN32__) || defined(_WIN32) +# define MYSQLPP_PLATFORM_WINDOWS + + // Windows compiler support. Tested with Microsoft Visual C++, + // Borland C++ Builder, and MinGW GCC. +# include + + // Stuff for Visual C++ only +# if defined(_MSC_VER) + // Disable whining about using 'this' as a member initializer on VC++. +# pragma warning(disable: 4355) + // Disable whining about implicit conversions to bool +# pragma warning(disable: 4800) + // Disable nagging about new "secure" functions like strncpy_s() +# pragma warning(disable: 4996) + // Disable complaints about STL data members: VC++ believes + // these need to be __declspec(dllexport) for some reason. +//# pragma warning(disable: 4251) + // Call _snprintf() for VC++ version of snprintf() function +//# define snprintf _snprintf +# endif + + // Define DLL import/export tags for Windows compilers, where we build + // the library into a DLL, for LGPL license compatibility reasons. + // (This is based on a similar mechanism in wxWindows.) + + #ifdef MYSQLPP_MAKING_DLL + // When making the DLL, export tagged symbols, so they appear + // in the import library. + #define MYSQLPP_EXPORT __declspec(dllexport) + #elif !defined(MYSQLPP_NO_DLL) + // We must be _using_ the DLL, so import symbols instead. + #define MYSQLPP_EXPORT __declspec(dllimport) + #else + // Not making a DLL at all, so no-op these declspecs + #define MYSQLPP_EXPORT + #endif +#else + // If not Windows, we assume some sort of Unixy build environment, + // where autotools is used. (This includes Cygwin!) #include the + // config.h file only if this file was included from a non-header + // file, because headers must not be dependent on config.h. +# if defined(MYSQLPP_NOT_HEADER) +# include "config.h" +# endif + + // Make DLL stuff a no-op on this platform. + #define MYSQLPP_EXPORT +#endif + +#if defined(MYSQLPP_MYSQL_HEADERS_BURIED) +# include +#else +# include +#endif + +namespace mysqlpp { + +/// \brief Alias for 'true', to make code requesting exceptions more +/// readable. +const bool use_exceptions = true; + +/// \brief Used to disambiguate overloads of equal_list() in SSQLSes. +enum sql_cmp_type { sql_use_compare }; + +#if !defined(DOXYGEN_IGNORE) +// Figure out how to get large integer support on this system. Suppress +// refman documentation for these typedefs, as they're system-dependent. +#if defined(NO_LONG_LONGS) +// Alias "longlong" and "ulonglong" to the regular "long" counterparts +typedef unsigned long ulonglong; +typedef long longlong; +#elif defined(_MSC_VER) +// It's VC++, so we'll use Microsoft's 64-bit integer types +typedef unsigned __int64 ulonglong; +typedef __int64 longlong; +#else +// No better idea, so assume the C99 convention. If your compiler +// doesn't support this, please provide a patch to extend this ifdef, or +// define NO_LONG_LONGS. +typedef unsigned long long ulonglong; +typedef long long longlong; +#endif +#endif // !defined(DOXYGEN_IGNORE) + +/// \brief Contraction for 'const char*' +typedef const char cchar; + +#if !defined(MYSQLPP_NO_UNSIGNED_INT_TYPES) +/// \brief Contraction for 'unsigned int' +typedef unsigned int uint; +/// \brief Contraction for 'unsigned long' +typedef unsigned long ulong; +#endif + +} // end namespace mysqlpp + +// The MySQL headers define these macros, which is completely wrong in a +// C++ project. Undo the damage. +#undef min +#undef max + +#endif // !defined(DOXYGEN_IGNORE) + + +// Now that we've defined all the stuff above, we can pull in the full +// MySQL header. Basically, the above largely replaces MySQL's my_global.h +// while actually working with C++. This is why we disobey the MySQL +// developer docs, which recommend including my_global.h before mysql.h. +#if defined(MYSQLPP_MYSQL_HEADERS_BURIED) +# include +#else +# include +#endif + + +namespace mysqlpp { + +/// \brief Alias for MYSQL_FIELD +typedef MYSQL_FIELD Field; + +} // end namespace mysqlpp + +#endif // !defined(MYSQLPP_COMMON_H) diff --git a/code/meosdb/mysql++/connection.cpp b/code/meosdb/mysql++/connection.cpp new file mode 100644 index 0000000..e575d2d --- /dev/null +++ b/code/meosdb/mysql++/connection.cpp @@ -0,0 +1,725 @@ +/*********************************************************************** + connection.cpp - Implements the Connection class. + + Copyright (c) 1998 by Kevin Atkinson, (c) 1999, 2000 and 2001 by + MySQL AB, and (c) 2004-2006 by Educational Technology Resources, Inc. + Others may also hold copyrights on code in this file. See the CREDITS + file in the top directory of the distribution for details. + + This file is part of MySQL++. + + MySQL++ is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + MySQL++ 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 Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with MySQL++; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 + USA +***********************************************************************/ + +#define MYSQLPP_NOT_HEADER +#include "common.h" + +#include "connection.h" + +#include "query.h" +#include "result.h" + +// An argument was added to mysql_shutdown() in MySQL 4.1.3 and 5.0.1. +#if ((MYSQL_VERSION_ID >= 40103) && (MYSQL_VERSION_ID <= 49999)) || (MYSQL_VERSION_ID >= 50001) +# define SHUTDOWN_ARG ,SHUTDOWN_DEFAULT +#else +# define SHUTDOWN_ARG +#endif + +#define NELEMS(a) (sizeof(a) / sizeof(a[0])) + +using namespace std; + +namespace mysqlpp { + +/// \brief Sets a variable to a given value temporarily. +/// +/// Saves existing value, sets new value, and restores old value when +/// the object is destroyed. Used to set a flag in an exception-safe +/// manner. +template +class scoped_var_set +{ +public: + /// \brief Create object, saving old value, setting new value + scoped_var_set(T& var, T new_value) : + var_(var) + { + old_value_ = var_; + var_ = new_value; + } + + /// \brief Destroy object, restoring old value + ~scoped_var_set() + { + var_ = old_value_; + } + +private: + T& var_; + T old_value_; +}; + + +// Initialize table of legal option argument types. +Connection::OptionArgType +Connection::legal_opt_arg_types_[Connection::opt_COUNT] = { + Connection::opt_type_integer, // opt_connect_timeout + Connection::opt_type_none, // opt_compress + Connection::opt_type_none, // opt_named_pipe + Connection::opt_type_string, // opt_init_command + Connection::opt_type_string, // opt_read_default_file + Connection::opt_type_string, // opt_read_default_group + Connection::opt_type_string, // opt_set_charset_dir + Connection::opt_type_string, // opt_set_charset_name + Connection::opt_type_integer, // opt_local_infile + Connection::opt_type_integer, // opt_protocol + Connection::opt_type_string, // opt_shared_memory_base_name + Connection::opt_type_integer, // opt_read_timeout + Connection::opt_type_integer, // opt_write_timeout + Connection::opt_type_none, // opt_use_result + Connection::opt_type_none, // opt_use_remote_connection + Connection::opt_type_none, // opt_use_embedded_connection + Connection::opt_type_none, // opt_guess_connection + Connection::opt_type_string, // opt_set_client_ip + Connection::opt_type_boolean, // opt_secure_auth + Connection::opt_type_boolean, // opt_multi_statements + Connection::opt_type_boolean, // opt_report_data_truncation + Connection::opt_type_boolean, // opt_reconnect +}; + + +Connection::Connection(bool te) : +OptionalExceptions(te), +Lockable(false), +is_connected_(false), +connecting_(false), +success_(false) +{ + mysql_init(&mysql_); +} + + +Connection::Connection(const char* db, const char* host, + const char* user, const char* passwd, uint port, + my_bool compress, unsigned int connect_timeout, + cchar* socket_name, unsigned int client_flag) : +OptionalExceptions(), +Lockable(false), +connecting_(false) +{ + mysql_init(&mysql_); + if (connect(db, host, user, passwd, port, compress, + connect_timeout, socket_name, client_flag)) { + unlock(); + success_ = is_connected_ = true; + } + else { + unlock(); + success_ = is_connected_ = false; + if (throw_exceptions()) { + throw ConnectionFailed(error()); + } + } +} + + +Connection::Connection(const Connection& other) : +OptionalExceptions(), +Lockable(false), +is_connected_(false) +{ + copy(other); +} + + +Connection::~Connection() +{ + disconnect(); +} + + +Connection& +Connection::operator=(const Connection& rhs) +{ + copy(rhs); + return *this; +} + + +bool +Connection::connect(cchar* db, cchar* host, cchar* user, + cchar* passwd, uint port, my_bool compress, + unsigned int connect_timeout, cchar* socket_name, + unsigned int client_flag) +{ + lock(); + + // Drop previous connection, if any + if (connected()) { + disconnect(); + } + + // Set defaults for certain connection options. User can override + // these by calling set_option() before connect(). + set_option_default(opt_read_default_file, "my"); + set_option_default(opt_connect_timeout, connect_timeout); + if (compress) { + set_option_default(opt_compress); + } + +#if MYSQL_VERSION_ID >= 40101 + // Check to see if user turned on multi-statements before + // establishing the connection. This one we handle specially, by + // setting a flag during connection establishment. + if (option_set(opt_multi_statements)) { + client_flag |= CLIENT_MULTI_STATEMENTS; + } +#endif + + // Establish connection + scoped_var_set sb(connecting_, true); + if (mysql_real_connect(&mysql_, host, user, passwd, db, port, + socket_name, client_flag)) { + unlock(); + success_ = is_connected_ = true; + + if (db && db[0]) { + // Also attach to given database + success_ = select_db(db); + } + } + else { + unlock(); + success_ = is_connected_ = false; + if (throw_exceptions()) { + throw ConnectionFailed(error()); + } + } + + return success_; +} + + +bool +Connection::connect(const MYSQL& mysql) +{ + return connect(mysql.db, mysql.host, mysql.user, mysql.passwd, + mysql.port, mysql.options.compress, + mysql.options.connect_timeout, mysql.unix_socket, + mysql.client_flag); +} + + +void +Connection::copy(const Connection& other) +{ + if (connected()) { + disconnect(); + } + + mysql_init(&mysql_); + set_exceptions(other.throw_exceptions()); + + if (other.connected()) { + // Try to reconnect to server using same parameters + connect(other.mysql_); + } + else { + is_connected_ = false; + connecting_ = false; + success_ = false; + } +} + + +void +Connection::disconnect() +{ + mysql_close(&mysql_); + is_connected_ = false; +} + + +bool +Connection::create_db(const std::string& db) +{ + Query q(this, throw_exceptions()); + return q.exec("CREATE DATABASE " + db); +} + + +bool +Connection::drop_db(const std::string& db) +{ + Query q(this, throw_exceptions()); + return q.exec("DROP DATABASE " + db); +} + + +bool +Connection::select_db(const char *db) +{ + if (connected()) { + bool suc = !(mysql_select_db(&mysql_, db)); + if (throw_exceptions() && !suc) { + throw DBSelectionFailed(error()); + } + else { + return suc; + } + } + else { + if (throw_exceptions()) { + throw DBSelectionFailed("MySQL++ connection not established"); + } + else { + return false; + } + } +} + + +bool +Connection::reload() +{ + if (connected()) { + bool suc = !mysql_reload(&mysql_); + if (throw_exceptions() && !suc) { + // Reloading grant tables through this API isn't precisely a + // query, but it's acceptable to signal errors with BadQuery + // because the new mechanism is the FLUSH PRIVILEGES query. + // A program won't have to change when doing it the new way. + throw BadQuery(error()); + } + else { + return suc; + } + } + else { + if (throw_exceptions()) { + throw BadQuery("MySQL++ connection not established"); + } + else { + return false; + } + } +} + + +bool +Connection::shutdown() +{ + if (connected()) { + bool suc = !(mysql_shutdown(&mysql_ SHUTDOWN_ARG)); + if (throw_exceptions() && !suc) { + throw ConnectionFailed(error()); + } + else { + return suc; + } + } + else { + if (throw_exceptions()) { + throw ConnectionFailed("MySQL++ connection not established"); + } + else { + return false; + } + } +} + + +string +Connection::info() +{ + const char* i = mysql_info(&mysql_); + if (!i) { + return string(); + } + else { + return string(i); + } +} + + +Query +Connection::query() +{ + return Query(this, throw_exceptions()); +} + + +bool +Connection::set_option(Option option) +{ + if (connected()) { + // None of the argument-less options can be set once the + // connection is up. + return bad_option(option, opt_err_conn); + } + + bool success = false; + switch (option) { + case opt_compress: + success = set_option_impl(MYSQL_OPT_COMPRESS); + break; + + case opt_named_pipe: + success = set_option_impl(MYSQL_OPT_NAMED_PIPE); + break; + +#if MYSQL_VERSION_ID >= 40101 + case opt_use_result: + success = set_option_impl(MYSQL_OPT_USE_RESULT); + break; + + case opt_use_remote_connection: + success = set_option_impl(MYSQL_OPT_USE_REMOTE_CONNECTION); + break; + + case opt_use_embedded_connection: + success = set_option_impl(MYSQL_OPT_USE_EMBEDDED_CONNECTION); + break; + + case opt_guess_connection: + success = set_option_impl(MYSQL_OPT_GUESS_CONNECTION); + break; +#endif + default: + return bad_option(option, opt_err_type); + } + + if (success) { + applied_options_.push_back(OptionInfo(option)); + return true; + } + else { + return bad_option(option, opt_err_value); + } +} + + +bool +Connection::set_option(Option option, const char* arg) +{ + if (connected()) { + // None of the options taking a char* argument can be set once + // the connection is up. + return bad_option(option, opt_err_conn); + } + + bool success = false; + switch (option) { + case opt_init_command: + success = set_option_impl(MYSQL_INIT_COMMAND, arg); + break; + + case opt_read_default_file: + success = set_option_impl(MYSQL_READ_DEFAULT_FILE, arg); + break; + + case opt_read_default_group: + success = set_option_impl(MYSQL_READ_DEFAULT_GROUP, arg); + break; + + case opt_set_charset_dir: + success = set_option_impl(MYSQL_SET_CHARSET_DIR, arg); + break; + + case opt_set_charset_name: + success = set_option_impl(MYSQL_SET_CHARSET_NAME, arg); + break; + +#if MYSQL_VERSION_ID >= 40100 + case opt_shared_memory_base_name: + success = set_option_impl(MYSQL_SHARED_MEMORY_BASE_NAME, arg); + break; +#endif +#if MYSQL_VERSION_ID >= 40101 + case opt_set_client_ip: + success = set_option_impl(MYSQL_SET_CLIENT_IP, arg); + break; +#endif + default: + return bad_option(option, opt_err_type); + } + + if (success) { + applied_options_.push_back(OptionInfo(option, arg)); + return true; + } + else { + return bad_option(option, opt_err_value); + } +} + + +bool +Connection::set_option(Option option, unsigned int arg) +{ + if (connected()) { + // None of the options taking an int argument can be set once + // the connection is up. + return bad_option(option, opt_err_conn); + } + + bool success = false; + switch (option) { + case opt_connect_timeout: + success = set_option_impl(MYSQL_OPT_CONNECT_TIMEOUT, &arg); + break; + + case opt_local_infile: + success = set_option_impl(MYSQL_OPT_LOCAL_INFILE, &arg); + break; + +#if MYSQL_VERSION_ID >= 40100 + case opt_protocol: + success = set_option_impl(MYSQL_OPT_PROTOCOL, &arg); + break; +#endif +#if MYSQL_VERSION_ID >= 40101 + case opt_read_timeout: + success = set_option_impl(MYSQL_OPT_READ_TIMEOUT, &arg); + break; + + case opt_write_timeout: + success = set_option_impl(MYSQL_OPT_WRITE_TIMEOUT, &arg); + break; +#endif + default: + return bad_option(option, opt_err_type); + } + + if (success) { + applied_options_.push_back(OptionInfo(option, arg)); + return true; + } + else { + return bad_option(option, opt_err_value); + } +} + + +bool +Connection::set_option(Option option, bool arg) +{ + if (connected() && (option != opt_multi_statements)) { + // We're connected and it isn't an option that can be set + // after connection is up, so complain to user. + return bad_option(option, opt_err_conn); + } + + bool success = false; + switch (option) { +#if MYSQL_VERSION_ID >= 40101 + case opt_secure_auth: + success = set_option_impl(MYSQL_SECURE_AUTH, &arg); + break; + + case opt_multi_statements: + // If connection is up, set the flag immediately. If not, + // and caller wants this turned on, pretend success so that + // we store the info we need to turn this flag on when + // bringing the connection up. (If the caller is turning it + // off before conn comes up, we effectively ignore this, + // because that's the default.) + if (connected()) { + success = set_option_impl(arg ? + MYSQL_OPTION_MULTI_STATEMENTS_ON : + MYSQL_OPTION_MULTI_STATEMENTS_OFF); + } + else { + success = arg; + } + break; +#endif +#if MYSQL_VERSION_ID >= 50003 + case opt_report_data_truncation: + success = set_option_impl(MYSQL_REPORT_DATA_TRUNCATION, &arg); + break; +#endif +#if MYSQL_VERSION_ID >= 50013 + case opt_reconnect: + success = set_option_impl(MYSQL_OPT_RECONNECT, &arg); + break; +#endif + default: + return bad_option(option, opt_err_type); + } + + if (success) { + applied_options_.push_back(OptionInfo(option, arg)); + return true; + } + else { + return bad_option(option, opt_err_value); + } +} + + +bool +Connection::set_option_default(Option option) +{ + if (option_set(option)) { + return true; + } + else { + return set_option(option); + } +} + + +template +bool +Connection::set_option_default(Option option, T arg) +{ + if (option_set(option)) { + return true; + } + else { + return set_option(option, arg); + } +} + + +bool +Connection::set_option_impl(mysql_option moption, const void* arg) +{ + return !mysql_options(&mysql_, moption, + static_cast(arg)); +} + + +#if MYSQL_VERSION_ID >= 40101 +bool +Connection::set_option_impl(enum_mysql_set_option msoption) +{ + return !mysql_set_server_option(&mysql_, msoption); +} +#endif + + +bool +Connection::bad_option(Option option, OptionError error) +{ + if (throw_exceptions()) { + ostringstream os; + + switch (error) { + case opt_err_type: { + // Option was set using wrong argument type + OptionArgType type = option_arg_type(option); + os << "option " << option; + if (type == opt_type_none) { + os << " does not take an argument"; + } + else { + os << " requires an argument of type " << type; + } + break; + } + + case opt_err_value: + // C API rejected option, which probably indicates that + // you passed a option that it doesn't understand. + os << "option " << option << " not supported in MySQL " + "C API v"; + api_version(os); + break; + + case opt_err_conn: + os << "option " << option << " can only be set " + "before connection is established"; + break; + } + + throw BadOption(os.str(), option); + } + + return false; +} + + +Connection::OptionArgType +Connection::option_arg_type(Option option) +{ + if ((option > opt_FIRST) && (option < opt_COUNT)) { + return legal_opt_arg_types_[option]; + } + else { + // Non-optional exception. Something is wrong with the library + // internals if this one is thrown. + throw BadOption("bad value given to option_arg_type()", option); + } +} + + +bool +Connection::option_set(Option option) +{ + for (OptionListIt it = applied_options_.begin(); + it != applied_options_.end(); + ++it) { + if (it->option == option) { + return true; + } + } + + return false; +} + + +void +Connection::enable_ssl(const char* key, const char* cert, + const char* ca, const char* capath, const char* cipher) +{ +#if defined(HAVE_MYSQL_SSL_SET) + mysql_ssl_set(&mysql_, key, cert, ca, capath, cipher); +#endif +} + + +ostream& +Connection::api_version(ostream& os) +{ + const int major = MYSQL_VERSION_ID / 10000; + const int minor = (MYSQL_VERSION_ID - (major * 10000)) / 100; + const int bug = MYSQL_VERSION_ID - (major * 10000) - (minor * 100); + + os << major << '.' << minor << '.' << bug; + + return os; +} + + +int +Connection::ping() +{ + if (connected()) { + return mysql_ping(&mysql_); + } + else { + // Not connected, and we've forgotten everything we need in + // order to re-connect, if we once were connected. + return 1; + } +} + + +} // end namespace mysqlpp + diff --git a/code/meosdb/mysql++/connection.h b/code/meosdb/mysql++/connection.h new file mode 100644 index 0000000..0debaf5 --- /dev/null +++ b/code/meosdb/mysql++/connection.h @@ -0,0 +1,579 @@ +/// \file connection.h +/// \brief Declares the Connection class. +/// +/// Every program using MySQL++ must create a Connection object, which +/// manages information about the connection to the MySQL database, and +/// performs connection-related operations once the connection is up. +/// Subordinate classes, such as Query and Row take their defaults as +/// to whether exceptions are thrown when errors are encountered from +/// the Connection object that created them, directly or indirectly. + +/*********************************************************************** + Copyright (c) 1998 by Kevin Atkinson, (c) 1999, 2000 and 2001 by + MySQL AB, and (c) 2004-2007 by Educational Technology Resources, Inc. + Others may also hold copyrights on code in this file. See the CREDITS + file in the top directory of the distribution for details. + + This file is part of MySQL++. + + MySQL++ is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + MySQL++ 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 Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with MySQL++; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 + USA +***********************************************************************/ + +#ifndef MYSQLPP_CONNECTION_H +#define MYSQLPP_CONNECTION_H + +#include "common.h" + +#include "lockable.h" +#include "noexceptions.h" + +#include +#include + +namespace mysqlpp { + +#if !defined(DOXYGEN_IGNORE) +// Make Doxygen ignore this +class MYSQLPP_EXPORT Query; +#endif + +/// \brief Manages the connection to the MySQL database. + +class MYSQLPP_EXPORT Connection : public OptionalExceptions, public Lockable +{ +public: + /// \brief Legal types of option arguments + enum OptionArgType { + opt_type_none, + opt_type_string, + opt_type_integer, + opt_type_boolean + }; + + /// \brief Per-connection options you can set with set_option() + /// + /// This is currently a combination of the MySQL C API + /// \c mysql_option and \c enum_mysql_set_option enums. It may + /// be extended in the future. + enum Option + { + // Symbolic "first" option, before real options. Never send + // this to set_option()! + opt_FIRST = -1, + + opt_connect_timeout = 0, + opt_compress, + opt_named_pipe, + opt_init_command, + opt_read_default_file, + opt_read_default_group, + opt_set_charset_dir, + opt_set_charset_name, + opt_local_infile, + opt_protocol, + opt_shared_memory_base_name, + opt_read_timeout, + opt_write_timeout, + opt_use_result, + opt_use_remote_connection, + opt_use_embedded_connection, + opt_guess_connection, + opt_set_client_ip, + opt_secure_auth, + + // Set multi-query statement support; no argument + opt_multi_statements, + + // Set reporting of data truncation errors + opt_report_data_truncation, + + // Enable or disable automatic reconnection to the server if + // the connection is found to have been lost. + opt_reconnect, + + // Number of options supported. Never send this to + // set_option()! + opt_COUNT + }; + + /// \brief Create object without connecting it to the MySQL server. + /// + /// \param te if true, exceptions are thrown on errors + Connection(bool te = true); + + /// \brief Create object and connect to database server in one step. + /// + /// This constructor allows you to most fully specify the options + /// used when connecting to the MySQL database. It is the thinnest + /// layer in MySQL++ over the MySQL C API function + /// \c mysql_real_connect(). The correspondence isn't exact as + /// we have some additional parameters you'd have to set with + /// \c mysql_option() when using the C API. + /// + /// \param db name of database to use + /// \param host host name or IP address of MySQL server, or 0 + /// if server is running on the same host as your program + /// \param user user name to log in under, or 0 to use the user + /// name this program is running under + /// \param passwd password to use when logging in + /// \param port TCP port number MySQL server is listening on, or 0 + /// to use default value + /// \param compress if true, compress data passing through + /// connection, to save bandwidth at the expense of CPU time + /// \param connect_timeout max seconds to wait for server to + /// respond to our connection attempt + /// \param socket_name Unix domain socket server is using, if + /// connecting to MySQL server on the same host as this program + /// running on, or 0 to use default name + /// \param client_flag special connection flags. See MySQL C API + /// documentation for \c mysql_real_connect() for details. + Connection(const char* db, const char* host = "", + const char* user = "", const char* passwd = "", + uint port = 0, my_bool compress = 0, + unsigned int connect_timeout = 60, cchar* socket_name = 0, + unsigned int client_flag = 0); + + /// \brief Establish a new connection using the same parameters as + /// an existing C API connection. + /// + /// \param other existing Connection object + Connection(const Connection& other); + + /// \brief Establish a new connection using the same parameters as + /// an existing C API connection. + /// + /// \param mysql existing MySQL C API connection object + bool connect(const MYSQL& mysql); + + /// \brief Destroy connection object + ~Connection(); + + /// \brief Connect to database after object is created. + /// + /// It's better to use the connect-on-create constructor if you can. + /// See its documentation for the meaning of these parameters. + /// + /// If you call this method on an object that is already connected + /// to a database server, the previous connection is dropped and a + /// new connection is established. + bool connect(cchar* db = "", cchar* host = "", + cchar* user = "", cchar* passwd = "", uint port = 0, + my_bool compress = 0, unsigned int connect_timeout = 60, + cchar* socket_name = 0, unsigned int client_flag = 0); + + /// \brief Close connection to MySQL server. + /// + /// Closes the connection to the MySQL server. + void close() + { + mysql_close(&mysql_); + is_connected_ = false; + } + + /// \brief Calls MySQL C API function \c mysql_info() and returns + /// result as a C++ string. + std::string info(); + + /// \brief return true if connection was established successfully + /// + /// \return true if connection was established successfully + bool connected() const + { + return is_connected_; + } + + /// \brief Return true if the last query was successful + bool success() const + { + return success_; + } + + /// \brief Alias for close() + void purge() { close(); } + + /// \brief Return a new query object. + /// + /// The returned query object is tied to this MySQL connection, + /// so when you call a method like + /// \link mysqlpp::Query::execute() execute() \endlink + /// on that object, the query is sent to the server this object + /// is connected to. + Query query(); + + /// \brief Alias for success() + /// + /// Alias for success() member function. Allows you to have code + /// constructs like this: + /// + /// \code + /// Connection conn; + /// .... use conn + /// if (conn) { + /// ... last SQL query was successful + /// } + /// else { + /// ... error occurred in SQL query + /// } + /// \endcode + operator bool() { return success(); } + + /// \brief Copy an existing Connection object's state into this + /// object. + Connection& operator=(const Connection& rhs); + + /// \brief Return error message for last MySQL error associated with + /// this connection. + /// + /// Simply wraps \c mysql_error() in the C API. + const char* error() + { + return mysql_error(&mysql_); + } + + /// \brief Return last MySQL error number associated with this + /// connection + /// + /// Simply wraps \c mysql_errno() in the C API. + int errnum() { return mysql_errno(&mysql_); } + + /// \brief Wraps MySQL C API function \c mysql_refresh() + /// + /// The corresponding C API function is undocumented. All I know + /// is that it's used by \c mysqldump and \c mysqladmin, according + /// to MySQL bug database entry http://bugs.mysql.com/bug.php?id=9816 + /// If that entry changes to say that the function is now documented, + /// reevaluate whether we need to wrap it. It may be that it's not + /// supposed to be used by regular end-user programs. + int refresh(unsigned int refresh_options) + { + return mysql_refresh(&mysql_, refresh_options); + } + + /// \brief "Pings" the MySQL database + /// + /// Wraps \c mysql_ping() in the C API. As a result, this function + /// will try to reconnect to the server if the connection has been + /// dropped. + /// + /// \retval 0 if server is responding, regardless of whether we had + /// to reconnect or not + /// \retval nonzero if either we already know the connection is down + /// and cannot re-establish it, or if the server did not respond to + /// the ping and we could not re-establish the connection. + int ping(); + + /// \brief Kill a MySQL server thread + /// + /// \param pid ID of thread to kill + /// + /// Simply wraps \c mysql_kill() in the C API. + int kill(unsigned long pid) + { + return mysql_kill(&mysql_, pid); + } + + /// \brief Get MySQL client library version + /// + /// Simply wraps \c mysql_get_client_info() in the C API. + std::string client_info() + { + return std::string(mysql_get_client_info()); + } + + /// \brief Get information about the network connection + /// + /// String contains info about type of connection and the server + /// hostname. + /// + /// Simply wraps \c mysql_get_host_info() in the C API. + std::string host_info() + { + return std::string(mysql_get_host_info(&mysql_)); + } + + /// \brief Returns version number of MySQL protocol this connection + /// is using + /// + /// Simply wraps \c mysql_get_proto_info() in the C API. + int proto_info() + { + return mysql_get_proto_info(&mysql_); + } + + /// \brief Get the MySQL server's version number + /// + /// Simply wraps \c mysql_get_server_info() in the C API. + std::string server_info() + { + return std::string(mysql_get_server_info(&mysql_)); + } + + /// \brief Returns information about MySQL server status + /// + /// String is similar to that returned by the \c mysqladmin + /// \c status command. Among other things, it contains uptime + /// in seconds, and the number of running threads, questions + /// and open tables. + std::string stat() + { + return std::string(mysql_stat(&mysql_)); + } + + /// \brief Create a database + /// + /// \param db name of database to create + /// + /// \return true if database was created successfully + bool create_db(const std::string& db); + + /// \brief Drop a database + /// + /// \param db name of database to destroy + /// + /// \return true if database was created successfully + bool drop_db(const std::string& db); + + /// \brief Change to a different database + bool select_db(const std::string& db) + { + return select_db(db.c_str()); + } + + /// \brief Change to a different database + bool select_db(const char* db); + + /// \brief Ask MySQL server to reload the grant tables + /// + /// User must have the "reload" privilege. + /// + /// Simply wraps \c mysql_reload() in the C API. Since that + /// function is deprecated, this one is, too. The MySQL++ + /// replacement is execute("FLUSH PRIVILEGES"). + bool reload(); + + /// \brief Ask MySQL server to shut down. + /// + /// User must have the "shutdown" privilege. + /// + /// Simply wraps \c mysql_shutdown() in the C API. + bool shutdown(); + + /// \brief Return the connection options object + st_mysql_options get_options() const + { + return mysql_.options; + } + + /// \brief Sets a connection option, with no argument + /// + /// \param option any of the Option enum constants + /// + /// Based on the option you give, this function calls either + /// \c mysql_options() or \c mysql_set_server_option() in the C API. + /// + /// There are several overloaded versions of this function. The + /// others take an additional argument for the option and differ + /// only by the type of the option. Unlike with the underlying C + /// API, it does matter which of these overloads you call: if you + /// use the wrong argument type or pass an argument where one is + /// not expected (or vice versa), the call will either throw an + /// exception or return false, depending on the object's "throw + /// exceptions" flag. + /// + /// This mechanism parallels the underlying C API structure fairly + /// closely, but do not expect this to continue in the future. + /// Its very purpose is to 'paper over' the differences among the + /// C API's option setting mechanisms, so it may become further + /// abstracted from these mechanisms. + /// + /// \retval true if option was successfully set, or at least queued + /// for setting during connection establishment sequence + /// + /// If exceptions are enabled, a false return means the C API + /// rejected the option, or the connection is not established and + /// so the option was queued for later processing. If exceptions + /// are disabled, false can also mean that the argument was of the + /// wrong type (wrong overload was called), the option value was out + /// of range, or the option is not supported by the C API, most + /// because it isn't a high enough version. These latter cases will + /// cause BadOption exceptions otherwise. + bool set_option(Option option); + + /// \brief Sets a connection option, with string argument + bool set_option(Option option, const char* arg); + + /// \brief Sets a connection option, with integer argument + bool set_option(Option option, unsigned int arg); + + /// \brief Sets a connection option, with Boolean argument + bool set_option(Option option, bool arg); + + /// \brief Same as set_option(), except that it won't override + /// a previously-set option. + bool set_option_default(Option option); + + /// \brief Same as set_option(), except that it won't override + /// a previously-set option. + template + bool set_option_default(Option option, T arg); + + /// \brief Returns true if the given option has been set already + bool option_set(Option option); + + /// \brief Enable SSL-encrypted connection. + /// + /// \param key the pathname to the key file + /// \param cert the pathname to the certificate file + /// \param ca the pathname to the certificate authority file + /// \param capath directory that contains trusted SSL CA + /// certificates in pem format. + /// \param cipher list of allowable ciphers to use + /// + /// Must be called before connection is established. + /// + /// Wraps \c mysql_ssl_set() in MySQL C API. + void enable_ssl(const char* key = 0, + const char* cert = 0, const char* ca = 0, + const char* capath = 0, const char* cipher = 0); + + /// \brief Return the number of rows affected by the last query + /// + /// Simply wraps \c mysql_affected_rows() in the C API. + my_ulonglong affected_rows() + { + return mysql_affected_rows(&mysql_); + } + + /// \brief Get ID generated for an AUTO_INCREMENT column in the + /// previous INSERT query. + /// + /// \retval 0 if the previous query did not generate an ID. Use + /// the SQL function LAST_INSERT_ID() if you need the last ID + /// generated by any query, not just the previous one. + my_ulonglong insert_id() + { + return mysql_insert_id(&mysql_); + } + + /// \brief Insert C API version we're linked against into C++ stream + /// + /// Version will be of the form X.Y.Z, where X is the major version + /// number, Y the minor version, and Z the bug fix number. + std::ostream& api_version(std::ostream& os); + +protected: + /// \brief Types of option setting errors we can diagnose + enum OptionError { + opt_err_type, + opt_err_value, + opt_err_conn + }; + + /// \brief Drop the connection to the database server + /// + /// This method is protected because it should only be used within + /// the library. Unless you use the default constructor, this + /// object should always be connected. + void disconnect(); + + /// \brief Error handling routine for set_option() + bool bad_option(Option option, OptionError error); + + /// \brief Given option value, return its proper argument type + OptionArgType option_arg_type(Option option); + + /// \brief Set MySQL C API connection option + /// + /// Wraps \c mysql_options() in C API. This is an internal + /// implementation detail, to be used only by the public overloads + /// above. + bool set_option_impl(mysql_option moption, const void* arg = 0); + +#if MYSQL_VERSION_ID >= 40101 + /// \brief Set MySQL C API connection option + /// + /// Wraps \c mysql_set_server_option() in C API. This is an + /// internal implementation detail, to be used only by the public + /// overloads above. + bool set_option_impl(enum_mysql_set_option msoption); +#endif + + /// \brief Establish a new connection as a copy of an existing one + /// + /// \param other the connection to copy + void copy(const Connection& other); + +private: + friend class ResNSel; + friend class ResUse; + friend class Query; + + struct OptionInfo { + Option option; + OptionArgType arg_type; + std::string str_arg; + unsigned int int_arg; + bool bool_arg; + + OptionInfo(Option o) : + option(o), + arg_type(opt_type_none), + int_arg(0), + bool_arg(false) + { + } + + OptionInfo(Option o, const char* a) : + option(o), + arg_type(opt_type_string), + str_arg(a), + int_arg(0), + bool_arg(false) + { + } + + OptionInfo(Option o, unsigned int a) : + option(o), + arg_type(opt_type_integer), + int_arg(a), + bool_arg(false) + { + } + + OptionInfo(Option o, bool a) : + option(o), + arg_type(opt_type_boolean), + int_arg(0), + bool_arg(a) + { + } + }; + typedef std::deque OptionList; + typedef OptionList::const_iterator OptionListIt; + + MYSQL mysql_; + bool is_connected_; + bool connecting_; + bool success_; + OptionList applied_options_; + static OptionArgType legal_opt_arg_types_[]; +}; + + +} // end namespace mysqlpp + +#endif + diff --git a/code/meosdb/mysql++/const_string.h b/code/meosdb/mysql++/const_string.h new file mode 100644 index 0000000..10d751e --- /dev/null +++ b/code/meosdb/mysql++/const_string.h @@ -0,0 +1,258 @@ +/// \file const_string.h +/// \brief Declares a wrapper for const char* which behaves +/// in a way more useful to MySQL++. + +/*********************************************************************** + Copyright (c) 1998 by Kevin Atkinson, (c) 1999, 2000 and 2001 by + MySQL AB, and (c) 2004, 2005 by Educational Technology Resources, Inc. + Others may also hold copyrights on code in this file. See the CREDITS + file in the top directory of the distribution for details. + + This file is part of MySQL++. + + MySQL++ is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + MySQL++ 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 Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with MySQL++; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 + USA +***********************************************************************/ + +#ifndef MYSQLPP_CONST_STRING_H +#define MYSQLPP_CONST_STRING_H + +#include "common.h" + +#include +#include +#include +#include + +namespace mysqlpp { + +/// \brief Wrapper for const char* to make it behave in a +/// way more useful to MySQL++. +/// +/// This class implements a small subset of the standard string class. +/// +/// As of MySQL++ 2.3, it makes a copy of the string we are initialized +/// with, instead of just copying the pointer. This is required to +/// avoid problems with the new SSQLS + BLOB support. +class MYSQLPP_EXPORT const_string +{ +public: + /// \brief Type of the data stored in this object, when it is not + /// equal to SQL null. + typedef const char value_type; + + /// \brief Type of "size" integers + typedef unsigned int size_type; + + /// \brief Type used when returning a reference to a character in + /// the string. + typedef const char& const_reference; + + /// \brief Type of iterators + typedef const char* const_iterator; + + /// \brief Same as const_iterator because the data cannot be + /// changed. + typedef const_iterator iterator; + +#if !defined(DOXYGEN_IGNORE) +// Doxygen will not generate documentation for this section. + typedef int difference_type; + typedef const_reference reference; + typedef const char* const_pointer; + typedef const_pointer pointer; +#endif // !defined(DOXYGEN_IGNORE) + + /// \brief Create empty string + const_string() : + str_data_(0), + length_(0) + { + } + + /// \brief Initialize string from existing C++ string + const_string(const std::string& str) : + str_data_(0), + length_(str.length()) + { + str_data_ = new char[length_ + 1]; + memcpy(str_data_, str.data(), length_); + str_data_[length_] = '\0'; + } + + /// \brief Initialize string from existing C string + const_string(const char* str) : + str_data_(0), + length_(size_type(strlen(str))) + { + str_data_ = new char[length_ + 1]; + memcpy(str_data_, str, length_); + str_data_[length_] = '\0'; + } + + /// \brief Initialize string from existing C string of known length + const_string(const char* str, size_type len) : + str_data_(0), + length_(size_type(len)) + { + str_data_ = new char[length_ + 1]; + memcpy(str_data_, str, length_); + str_data_[length_] = '\0'; + } + + /// \brief Destroy string + ~const_string() + { + delete[] str_data_; + } + + /// \brief Assignment operator, from C string + const_string& operator=(const char* str) + { + delete[] str_data_; + length_ = size_type(strlen(str)); + str_data_ = new char[length_]; + memcpy(str_data_, str, length_); + return *this; + } + + /// \brief Assignment operator, from other const_string + const_string& operator=(const const_string& cs) + { + delete[] str_data_; + length_ = cs.length_; + str_data_ = new char[length_]; + memcpy(str_data_, cs.str_data_, length_); + return *this; + } + + /// \brief Return number of characters in the string + size_type length() const { return length_; } + + /// \brief Return number of characters in string + size_type size() const { return length_; } + + /// \brief Return iterator pointing to the first character of + /// the string + const_iterator begin() const { return str_data_; } + + /// \brief Return iterator pointing to one past the last character + /// of the string. + const_iterator end() const { return str_data_ + size(); } + + /// \brief Return the maximum number of characters in the string. + /// + /// Because this is a \c const string, this is just an alias for + /// size(); its size is always equal to the amount of data currently + /// stored. + size_type max_size() const { return size(); } + + /// \brief Return a reference to a character within the string. + const_reference operator [](size_type pos) const + { return str_data_[pos]; } + + /// \brief Return a reference to a character within the string. + /// + /// Unlike \c operator[](), this function throws an + /// \c std::out_of_range exception if the index isn't within range. + const_reference at(size_type pos) const + { + if (pos >= size()) + throw std::out_of_range(""); + else + return str_data_[pos]; + } + + /// \brief Return a const pointer to the string data. Not + /// necessarily null-terminated! + const char* c_str() const { return str_data_; } + + /// \brief Alias for \c c_str() + const char* data() const { return str_data_; } + + /// \brief Lexically compare this string to another. + /// + /// \param str string to compare against this one + /// + /// \retval <0 if str1 is lexically "less than" str2 + /// \retval 0 if str1 is equal to str2 + /// \retval >0 if str1 is lexically "greater than" str2 + int compare(const const_string& str) const + { + size_type i = 0, short_len = std::min(length(), str.length()); + while ((i < short_len) && (str_data_[i] != str.str_data_[i])) { + ++i; + } + return str_data_[i] - str.str_data_[i]; + } + +private: + char* str_data_; + size_type length_; +}; + + +/// \brief Inserts a const_string into a C++ stream +inline std::ostream& operator <<(std::ostream& o, + const const_string& str) +{ + return o << str.c_str(); +} + +/// \brief Calls lhs.compare(), passing rhs +inline int compare(const const_string& lhs, const const_string& rhs) +{ + return lhs.compare(rhs); +} + +/// \brief Returns true if lhs is the same as rhs +inline bool operator ==(const_string& lhs, const_string& rhs) +{ + return compare(lhs, rhs) == 0; +} + +/// \brief Returns true if lhs is not the same as rhs +inline bool operator !=(const_string& lhs, const_string& rhs) +{ + return compare(lhs, rhs) != 0; +} + +/// \brief Returns true if lhs is lexically less than rhs +inline bool operator <(const_string& lhs, const_string& rhs) +{ + return compare(lhs, rhs) < 0; +} + +/// \brief Returns true if lhs is lexically less or equal to rhs +inline bool operator <=(const_string& lhs, const_string& rhs) +{ + return compare(lhs, rhs) <= 0; +} + +/// \brief Returns true if lhs is lexically greater than rhs +inline bool operator >(const_string& lhs, const_string& rhs) +{ + return compare(lhs, rhs) > 0; +} + +/// \brief Returns true if lhs is lexically greater than or equal to rhs +inline bool operator >=(const_string& lhs, const_string& rhs) +{ + return compare(lhs, rhs) >= 0; +} + +} // end namespace mysqlpp + +#endif diff --git a/code/meosdb/mysql++/convert.h b/code/meosdb/mysql++/convert.h new file mode 100644 index 0000000..fd27642 --- /dev/null +++ b/code/meosdb/mysql++/convert.h @@ -0,0 +1,117 @@ +/// \file convert.h +/// \brief Declares various string-to-integer type conversion templates. +/// +/// These templates are the mechanism used within mysqlpp::ColData_Tmpl +/// for its string-to-\e something conversions. + +/*********************************************************************** + Copyright (c) 1998 by Kevin Atkinson, (c) 1999, 2000 and 2001 by + MySQL AB, and (c) 2004, 2005 by Educational Technology Resources, Inc. + Others may also hold copyrights on code in this file. See the CREDITS + file in the top directory of the distribution for details. + + This file is part of MySQL++. + + MySQL++ is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + MySQL++ 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 Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with MySQL++; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 + USA +***********************************************************************/ + +#ifndef MYSQLPP_CONVERT_H +#define MYSQLPP_CONVERT_H + +#include "common.h" + +#include + +namespace mysqlpp { + +#if !defined(DOXYGEN_IGNORE) +// Doxygen will not generate documentation for this section. + +template class mysql_convert; + +#define mysql__convert(TYPE, FUNC) \ + template <> \ + class mysql_convert {\ + public:\ + mysql_convert(const char* str, const char *& end) { \ + num_ = FUNC(str, const_cast(&end));}\ + operator TYPE () {return num_;}\ + private:\ + TYPE num_;\ + };\ + +#if defined(_MSC_VER) +# pragma warning(disable: 4244) +#endif + + mysql__convert(float, strtod) + mysql__convert(double, strtod) + +#if defined(_MSC_VER) +# pragma warning(default: 4244) +#endif + +#undef mysql__convert +#define mysql__convert(TYPE, FUNC) \ + template <> \ + class mysql_convert {\ + public:\ + mysql_convert(const char* str, const char *& end) { \ + num_ = FUNC(str, const_cast(&end),10);}\ + operator TYPE () {return num_;}\ + private:\ + TYPE num_;\ + };\ + +#if defined(_MSC_VER) +# pragma warning(disable: 4244) +#endif + + mysql__convert(char, strtol) + mysql__convert(signed char, strtol) + mysql__convert(int, strtol) + mysql__convert(short int, strtol) + mysql__convert(long int, strtol) + + mysql__convert(unsigned char, strtoul) + mysql__convert(unsigned int, strtoul) + mysql__convert(unsigned short int, strtoul) + mysql__convert(unsigned long int, strtoul) + +#if defined(_MSC_VER) +# pragma warning(default: 4244) +#endif + +#if !defined(NO_LONG_LONGS) +#if defined(_MSC_VER) +// Handle 64-bit ints the VC++ way +mysql__convert(longlong, _strtoi64) +mysql__convert(ulonglong, _strtoui64) +#else +// No better idea, so assume the C99 way. If your compiler doesn't +// support this, please provide a patch to extend this ifdef, or define +// NO_LONG_LONGS. +mysql__convert(longlong, strtoll) +mysql__convert(ulonglong, strtoull) +#endif +#endif // !defined(NO_LONG_LONGS) + +#endif // !defined(DOXYGEN_IGNORE) + +} // end namespace mysqlpp + +#endif + diff --git a/code/meosdb/mysql++/custom-macros.h b/code/meosdb/mysql++/custom-macros.h new file mode 100644 index 0000000..dd4dfdc --- /dev/null +++ b/code/meosdb/mysql++/custom-macros.h @@ -0,0 +1,24938 @@ + +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// This file is generated by the Perl script custom.pl. Please do +// not modify this file directly. Change the script instead. +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +// --------------------------------------------------- +// Begin Mandatory Compare +// --------------------------------------------------- + +#define sql_compare_define(NAME) \ + bool operator == (const NAME &other) const \ + {return sql_compare_##NAME(*this,other) == 0;} \ + bool operator != (const NAME &other) const \ + {return sql_compare_##NAME(*this,other) != 0;} \ + bool operator > (const NAME &other) const \ + {return sql_compare_##NAME(*this,other) > 0;} \ + bool operator < (const NAME &other) const \ + {return sql_compare_##NAME(*this,other) < 0;} \ + bool operator >= (const NAME &other) const \ + {return sql_compare_##NAME(*this,other) >= 0;} \ + bool operator <= (const NAME &other) const \ + {return sql_compare_##NAME(*this,other) <= 0;} \ + int cmp (const NAME &other) const \ + {return sql_compare_##NAME(*this,other);} \ + int compare (const NAME &other) const \ + {return sql_compare_##NAME(*this,other);} + +#define sql_compare_define_0(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) + +#define sql_construct_define_0(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) + +#define sql_COMPARE__0(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) + +#define sql_compare_type_def_0(NAME, WHAT, NUM) \ + sql_compare_type_def_##NUM (NAME, WHAT, NUM) + +#define sql_compare_type_defe_0(NAME, WHAT, NUM) \ + sql_compare_type_defe_##NUM (NAME, WHAT, NUM) + +// --------------------------------------------------- +// End Mandatory Compare +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Compare 1 +// --------------------------------------------------- + +#define sql_compare_define_1(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1) : C1 (p1) {} \ + void set (const T1 &p1) { \ + C1 = p1;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_1(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1) { \ + C1 = p1;\ + \ + } \ + NAME (const T1 &p1) : C1 (p1) {} + +#define sql_compare_type_def_1(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true) + +#define sql_compare_type_defe_1(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true) + +#define sql_COMPARE__1(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + return mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + return mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + } + +// --------------------------------------------------- +// End Compare 1 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 2 +// --------------------------------------------------- + +#define sql_compare_define_2(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2) : C1 (p1), C2 (p2) {} \ + void set (const T1 &p1, const T2 &p2) { \ + C1 = p1;\ + C2 = p2;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_2(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2) { \ + C1 = p1;\ + C2 = p2;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2) : C1 (p1), C2 (p2) {} + +#define sql_compare_type_def_2(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true) + +#define sql_compare_type_defe_2(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true) + +#define sql_COMPARE__2(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + } + +// --------------------------------------------------- +// End Compare 2 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 3 +// --------------------------------------------------- + +#define sql_compare_define_3(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3) : C1 (p1), C2 (p2), C3 (p3) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_3(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3) : C1 (p1), C2 (p2), C3 (p3) {} + +#define sql_compare_type_def_3(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true) + +#define sql_compare_type_defe_3(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true) + +#define sql_COMPARE__3(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + } + +// --------------------------------------------------- +// End Compare 3 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 4 +// --------------------------------------------------- + +#define sql_compare_define_4(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4) : C1 (p1), C2 (p2), C3 (p3), C4 (p4) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_4(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4) : C1 (p1), C2 (p2), C3 (p3), C4 (p4) {} + +#define sql_compare_type_def_4(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true) + +#define sql_compare_type_defe_4(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true) + +#define sql_COMPARE__4(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + } + +// --------------------------------------------------- +// End Compare 4 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 5 +// --------------------------------------------------- + +#define sql_compare_define_5(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_5(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5) {} + +#define sql_compare_type_def_5(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true) + +#define sql_compare_type_defe_5(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true) + +#define sql_COMPARE__5(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + } + +// --------------------------------------------------- +// End Compare 5 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 6 +// --------------------------------------------------- + +#define sql_compare_define_6(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_6(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6) {} + +#define sql_compare_type_def_6(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true, true) + +#define sql_compare_type_defe_6(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true, true) + +#define sql_COMPARE__6(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + } + +// --------------------------------------------------- +// End Compare 6 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 7 +// --------------------------------------------------- + +#define sql_compare_define_7(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_7(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7) {} + +#define sql_compare_type_def_7(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true, true, true) + +#define sql_compare_type_defe_7(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true, true, true) + +#define sql_COMPARE__7(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + } + +// --------------------------------------------------- +// End Compare 7 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 8 +// --------------------------------------------------- + +#define sql_compare_define_8(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_8(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8) {} + +#define sql_compare_type_def_8(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true, true, true, true) + +#define sql_compare_type_defe_8(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true, true, true, true) + +#define sql_COMPARE__8(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + } + +// --------------------------------------------------- +// End Compare 8 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 9 +// --------------------------------------------------- + +#define sql_compare_define_9(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_9(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9) {} + +#define sql_compare_type_def_9(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true, true, true, true, true) + +#define sql_compare_type_defe_9(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true, true, true, true, true) + +#define sql_COMPARE__9(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + } + +// --------------------------------------------------- +// End Compare 9 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 10 +// --------------------------------------------------- + +#define sql_compare_define_10(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_10(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10) {} + +#define sql_compare_type_def_10(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true, true, true, true, true, true) + +#define sql_compare_type_defe_10(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true, true, true, true, true, true) + +#define sql_COMPARE__10(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + } + +// --------------------------------------------------- +// End Compare 10 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 11 +// --------------------------------------------------- + +#define sql_compare_define_11(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_11(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11) {} + +#define sql_compare_type_def_11(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_compare_type_defe_11(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_COMPARE__11(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + } + +// --------------------------------------------------- +// End Compare 11 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 12 +// --------------------------------------------------- + +#define sql_compare_define_12(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_12(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12) {} + +#define sql_compare_type_def_12(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_compare_type_defe_12(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_COMPARE__12(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + } + +// --------------------------------------------------- +// End Compare 12 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 13 +// --------------------------------------------------- + +#define sql_compare_define_13(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_13(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13) {} + +#define sql_compare_type_def_13(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_compare_type_defe_13(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_COMPARE__13(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + } + +// --------------------------------------------------- +// End Compare 13 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 14 +// --------------------------------------------------- + +#define sql_compare_define_14(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_14(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14) {} + +#define sql_compare_type_def_14(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_compare_type_defe_14(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_COMPARE__14(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + } + +// --------------------------------------------------- +// End Compare 14 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 15 +// --------------------------------------------------- + +#define sql_compare_define_15(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_15(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15) {} + +#define sql_compare_type_def_15(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_compare_type_defe_15(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_COMPARE__15(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + } + +// --------------------------------------------------- +// End Compare 15 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 16 +// --------------------------------------------------- + +#define sql_compare_define_16(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15), C16 (p16) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + C16 = p16;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_16(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + C16 = p16;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15), C16 (p16) {} + +#define sql_compare_type_def_16(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_compare_type_defe_16(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_COMPARE__16(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C16 , y.C16 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C16 , y.C16 ); \ + } + +// --------------------------------------------------- +// End Compare 16 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 17 +// --------------------------------------------------- + +#define sql_compare_define_17(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15), C16 (p16), C17 (p17) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + C16 = p16;\ + C17 = p17;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_17(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + C16 = p16;\ + C17 = p17;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15), C16 (p16), C17 (p17) {} + +#define sql_compare_type_def_17(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_compare_type_defe_17(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_COMPARE__17(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C16 , y.C16 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C17 , y.C17 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C16 , y.C16 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C17 , y.C17 ); \ + } + +// --------------------------------------------------- +// End Compare 17 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 18 +// --------------------------------------------------- + +#define sql_compare_define_18(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15), C16 (p16), C17 (p17), C18 (p18) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + C16 = p16;\ + C17 = p17;\ + C18 = p18;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_18(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + C16 = p16;\ + C17 = p17;\ + C18 = p18;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15), C16 (p16), C17 (p17), C18 (p18) {} + +#define sql_compare_type_def_18(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_compare_type_defe_18(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_COMPARE__18(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C16 , y.C16 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C17 , y.C17 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C18 , y.C18 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C16 , y.C16 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C17 , y.C17 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C18 , y.C18 ); \ + } + +// --------------------------------------------------- +// End Compare 18 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 19 +// --------------------------------------------------- + +#define sql_compare_define_19(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15), C16 (p16), C17 (p17), C18 (p18), C19 (p19) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + C16 = p16;\ + C17 = p17;\ + C18 = p18;\ + C19 = p19;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_19(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + C16 = p16;\ + C17 = p17;\ + C18 = p18;\ + C19 = p19;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15), C16 (p16), C17 (p17), C18 (p18), C19 (p19) {} + +#define sql_compare_type_def_19(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_compare_type_defe_19(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_COMPARE__19(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C16 , y.C16 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C17 , y.C17 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C18 , y.C18 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C19 , y.C19 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C16 , y.C16 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C17 , y.C17 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C18 , y.C18 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C19 , y.C19 ); \ + } + +// --------------------------------------------------- +// End Compare 19 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 20 +// --------------------------------------------------- + +#define sql_compare_define_20(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15), C16 (p16), C17 (p17), C18 (p18), C19 (p19), C20 (p20) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + C16 = p16;\ + C17 = p17;\ + C18 = p18;\ + C19 = p19;\ + C20 = p20;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_20(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + C16 = p16;\ + C17 = p17;\ + C18 = p18;\ + C19 = p19;\ + C20 = p20;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15), C16 (p16), C17 (p17), C18 (p18), C19 (p19), C20 (p20) {} + +#define sql_compare_type_def_20(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_compare_type_defe_20(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_COMPARE__20(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C16 , y.C16 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C17 , y.C17 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C18 , y.C18 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C19 , y.C19 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C20 , y.C20 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C16 , y.C16 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C17 , y.C17 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C18 , y.C18 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C19 , y.C19 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C20 , y.C20 ); \ + } + +// --------------------------------------------------- +// End Compare 20 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 21 +// --------------------------------------------------- + +#define sql_compare_define_21(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20, const T21 &p21) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15), C16 (p16), C17 (p17), C18 (p18), C19 (p19), C20 (p20), C21 (p21) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20, const T21 &p21) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + C16 = p16;\ + C17 = p17;\ + C18 = p18;\ + C19 = p19;\ + C20 = p20;\ + C21 = p21;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_21(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20, const T21 &p21) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + C16 = p16;\ + C17 = p17;\ + C18 = p18;\ + C19 = p19;\ + C20 = p20;\ + C21 = p21;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20, const T21 &p21) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15), C16 (p16), C17 (p17), C18 (p18), C19 (p19), C20 (p20), C21 (p21) {} + +#define sql_compare_type_def_21(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_compare_type_defe_21(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_COMPARE__21(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C16 , y.C16 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C17 , y.C17 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C18 , y.C18 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C19 , y.C19 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C20 , y.C20 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C21 , y.C21 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C16 , y.C16 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C17 , y.C17 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C18 , y.C18 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C19 , y.C19 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C20 , y.C20 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C21 , y.C21 ); \ + } + +// --------------------------------------------------- +// End Compare 21 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 22 +// --------------------------------------------------- + +#define sql_compare_define_22(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20, const T21 &p21, const T22 &p22) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15), C16 (p16), C17 (p17), C18 (p18), C19 (p19), C20 (p20), C21 (p21), C22 (p22) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20, const T21 &p21, const T22 &p22) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + C16 = p16;\ + C17 = p17;\ + C18 = p18;\ + C19 = p19;\ + C20 = p20;\ + C21 = p21;\ + C22 = p22;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_22(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20, const T21 &p21, const T22 &p22) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + C16 = p16;\ + C17 = p17;\ + C18 = p18;\ + C19 = p19;\ + C20 = p20;\ + C21 = p21;\ + C22 = p22;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20, const T21 &p21, const T22 &p22) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15), C16 (p16), C17 (p17), C18 (p18), C19 (p19), C20 (p20), C21 (p21), C22 (p22) {} + +#define sql_compare_type_def_22(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_compare_type_defe_22(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_COMPARE__22(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C16 , y.C16 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C17 , y.C17 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C18 , y.C18 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C19 , y.C19 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C20 , y.C20 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C21 , y.C21 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C22 , y.C22 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C16 , y.C16 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C17 , y.C17 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C18 , y.C18 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C19 , y.C19 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C20 , y.C20 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C21 , y.C21 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C22 , y.C22 ); \ + } + +// --------------------------------------------------- +// End Compare 22 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 23 +// --------------------------------------------------- + +#define sql_compare_define_23(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20, const T21 &p21, const T22 &p22, const T23 &p23) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15), C16 (p16), C17 (p17), C18 (p18), C19 (p19), C20 (p20), C21 (p21), C22 (p22), C23 (p23) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20, const T21 &p21, const T22 &p22, const T23 &p23) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + C16 = p16;\ + C17 = p17;\ + C18 = p18;\ + C19 = p19;\ + C20 = p20;\ + C21 = p21;\ + C22 = p22;\ + C23 = p23;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_23(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20, const T21 &p21, const T22 &p22, const T23 &p23) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + C16 = p16;\ + C17 = p17;\ + C18 = p18;\ + C19 = p19;\ + C20 = p20;\ + C21 = p21;\ + C22 = p22;\ + C23 = p23;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20, const T21 &p21, const T22 &p22, const T23 &p23) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15), C16 (p16), C17 (p17), C18 (p18), C19 (p19), C20 (p20), C21 (p21), C22 (p22), C23 (p23) {} + +#define sql_compare_type_def_23(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_compare_type_defe_23(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_COMPARE__23(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C16 , y.C16 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C17 , y.C17 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C18 , y.C18 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C19 , y.C19 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C20 , y.C20 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C21 , y.C21 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C22 , y.C22 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C23 , y.C23 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C16 , y.C16 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C17 , y.C17 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C18 , y.C18 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C19 , y.C19 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C20 , y.C20 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C21 , y.C21 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C22 , y.C22 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C23 , y.C23 ); \ + } + +// --------------------------------------------------- +// End Compare 23 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 24 +// --------------------------------------------------- + +#define sql_compare_define_24(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20, const T21 &p21, const T22 &p22, const T23 &p23, const T24 &p24) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15), C16 (p16), C17 (p17), C18 (p18), C19 (p19), C20 (p20), C21 (p21), C22 (p22), C23 (p23), C24 (p24) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20, const T21 &p21, const T22 &p22, const T23 &p23, const T24 &p24) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + C16 = p16;\ + C17 = p17;\ + C18 = p18;\ + C19 = p19;\ + C20 = p20;\ + C21 = p21;\ + C22 = p22;\ + C23 = p23;\ + C24 = p24;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_24(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20, const T21 &p21, const T22 &p22, const T23 &p23, const T24 &p24) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + C16 = p16;\ + C17 = p17;\ + C18 = p18;\ + C19 = p19;\ + C20 = p20;\ + C21 = p21;\ + C22 = p22;\ + C23 = p23;\ + C24 = p24;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20, const T21 &p21, const T22 &p22, const T23 &p23, const T24 &p24) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15), C16 (p16), C17 (p17), C18 (p18), C19 (p19), C20 (p20), C21 (p21), C22 (p22), C23 (p23), C24 (p24) {} + +#define sql_compare_type_def_24(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_compare_type_defe_24(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_COMPARE__24(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C16 , y.C16 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C17 , y.C17 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C18 , y.C18 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C19 , y.C19 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C20 , y.C20 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C21 , y.C21 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C22 , y.C22 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C23 , y.C23 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C24 , y.C24 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C16 , y.C16 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C17 , y.C17 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C18 , y.C18 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C19 , y.C19 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C20 , y.C20 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C21 , y.C21 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C22 , y.C22 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C23 , y.C23 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C24 , y.C24 ); \ + } + +// --------------------------------------------------- +// End Compare 24 +// --------------------------------------------------- + + +// --------------------------------------------------- +// Begin Compare 25 +// --------------------------------------------------- + +#define sql_compare_define_25(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20, const T21 &p21, const T22 &p22, const T23 &p23, const T24 &p24, const T25 &p25) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15), C16 (p16), C17 (p17), C18 (p18), C19 (p19), C20 (p20), C21 (p21), C22 (p22), C23 (p23), C24 (p24), C25 (p25) {} \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20, const T21 &p21, const T22 &p22, const T23 &p23, const T24 &p24, const T25 &p25) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + C16 = p16;\ + C17 = p17;\ + C18 = p18;\ + C19 = p19;\ + C20 = p20;\ + C21 = p21;\ + C22 = p22;\ + C23 = p23;\ + C24 = p24;\ + C25 = p25;\ + \ + } \ + sql_compare_define(NAME) + +#define sql_construct_define_25(NAME, T1, C1, T2, C2, T3, C3, T4, C4, T5, C5, T6, C6, T7, C7, T8, C8, T9, C9, T10, C10, T11, C11, T12, C12, T13, C13, T14, C14, T15, C15, T16, C16, T17, C17, T18, C18, T19, C19, T20, C20, T21, C21, T22, C22, T23, C23, T24, C24, T25, C25) \ + void set (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20, const T21 &p21, const T22 &p22, const T23 &p23, const T24 &p24, const T25 &p25) { \ + C1 = p1;\ + C2 = p2;\ + C3 = p3;\ + C4 = p4;\ + C5 = p5;\ + C6 = p6;\ + C7 = p7;\ + C8 = p8;\ + C9 = p9;\ + C10 = p10;\ + C11 = p11;\ + C12 = p12;\ + C13 = p13;\ + C14 = p14;\ + C15 = p15;\ + C16 = p16;\ + C17 = p17;\ + C18 = p18;\ + C19 = p19;\ + C20 = p20;\ + C21 = p21;\ + C22 = p22;\ + C23 = p23;\ + C24 = p24;\ + C25 = p25;\ + \ + } \ + NAME (const T1 &p1, const T2 &p2, const T3 &p3, const T4 &p4, const T5 &p5, const T6 &p6, const T7 &p7, const T8 &p8, const T9 &p9, const T10 &p10, const T11 &p11, const T12 &p12, const T13 &p13, const T14 &p14, const T15 &p15, const T16 &p16, const T17 &p17, const T18 &p18, const T19 &p19, const T20 &p20, const T21 &p21, const T22 &p22, const T23 &p23, const T24 &p24, const T25 &p25) : C1 (p1), C2 (p2), C3 (p3), C4 (p4), C5 (p5), C6 (p6), C7 (p7), C8 (p8), C9 (p9), C10 (p10), C11 (p11), C12 (p12), C13 (p13), C14 (p14), C15 (p15), C16 (p16), C17 (p17), C18 (p18), C19 (p19), C20 (p20), C21 (p21), C22 (p22), C23 (p23), C24 (p24), C25 (p25) {} + +#define sql_compare_type_def_25(NAME, WHAT, NUM) \ + return WHAT##_list(d, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_compare_type_defe_25(NAME, WHAT, NUM) \ + return WHAT##_list(d, c, m, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true) + +#define sql_COMPARE__25(NAME, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25) \ + template \ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C16 , y.C16 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C17 , y.C17 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C18 , y.C18 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C19 , y.C19 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C20 , y.C20 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C21 , y.C21 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C22 , y.C22 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C23 , y.C23 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C24 , y.C24 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C25 , y.C25 ); \ + } \ + template \ + int compare (const NAME &x, const NAME &y) { \ + int cmp; \ + cmp = mysqlpp::sql_cmp(x.C1 , y.C1 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C2 , y.C2 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C3 , y.C3 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C4 , y.C4 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C5 , y.C5 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C6 , y.C6 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C7 , y.C7 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C8 , y.C8 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C9 , y.C9 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C10 , y.C10 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C11 , y.C11 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C12 , y.C12 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C13 , y.C13 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C14 , y.C14 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C15 , y.C15 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C16 , y.C16 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C17 , y.C17 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C18 , y.C18 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C19 , y.C19 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C20 , y.C20 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C21 , y.C21 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C22 , y.C22 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C23 , y.C23 ); \ + if (cmp) return cmp; \ + cmp = mysqlpp::sql_cmp(x.C24 , y.C24 ); \ + if (cmp) return cmp; \ + return mysqlpp::sql_cmp(x.C25 , y.C25 ); \ + } + +// --------------------------------------------------- +// End Compare 25 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 1 +// --------------------------------------------------- +#define sql_create_basic_c_order_1(NAME, CMP, CONTR, T1, I1, O1)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_complete_1(NAME, CMP, CONTR, T1, I1, N1, O1) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1) const {\ + return value_list(",", mysqlpp::quote, i1);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1) const {\ + return value_list(",", mysqlpp::quote, i1);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1) const {\ + return value_list(d, mysqlpp::quote, i1);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1) const {\ + return value_list(d, mysqlpp::quote, i1);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1) const {\ + return field_list(",", mysqlpp::do_nothing, i1);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1) const {\ + return field_list(",", mysqlpp::do_nothing, i1);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1) const {\ + return field_list(d, mysqlpp::do_nothing, i1);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1) const {\ + return field_list(d, mysqlpp::do_nothing, i1);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1) const {\ + return equal_list(d, c, mysqlpp::quote, i1);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1) const {\ + return equal_list(d, c, mysqlpp::quote, i1);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(1, false);\ + if (i1) (*include)[0]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(1, false); \ + (*include)[i1]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(1, false); \ + if (i1) (*include)[0]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(1, false); \ + (*include)[i1]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(1, false); \ + if (i1) (*include)[0]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(1, false); \ + (*include)[i1]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1) const {\ + return NAME##_cus_value_list (this, d, m, i1); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1) const { \ + return NAME##_cus_field_list (this, d, m, i1); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1) const { \ + return NAME##_cus_value_list (this, d, m, i1); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1) const {\ + return NAME##_cus_field_list (this, d, m, i1); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_basic_1(NAME, CMP, CONTR, T1, I1) \ + sql_create_basic_c_order_1(NAME, CMP, CONTR, T1, I1, 0) + +#define sql_create_1(NAME, CMP, CONTR, T1, I1) \ + sql_create_complete_1(NAME, CMP, CONTR, T1, I1, #I1, 0) \ + +#define sql_create_c_order_1(NAME, CMP, CONTR, T1, I1, O1) \ + sql_create_complete_1(NAME, CMP, CONTR, T1, I1, #I1, O1) + +#define sql_create_c_names_1(NAME, CMP, CONTR, T1, I1, N1) \ + sql_create_complete_1(NAME, CMP, CONTR, T1, I1, N1, 0) + +// --------------------------------------------------- +// End Create 1 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 2 +// --------------------------------------------------- +#define sql_create_basic_c_order_2(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_complete_2(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(2, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(2, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(2, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(2, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(2, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(2, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_basic_2(NAME, CMP, CONTR, T1, I1, T2, I2) \ + sql_create_basic_c_order_2(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1) + +#define sql_create_2(NAME, CMP, CONTR, T1, I1, T2, I2) \ + sql_create_complete_2(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1) \ + +#define sql_create_c_order_2(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2) \ + sql_create_complete_2(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2) + +#define sql_create_c_names_2(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2) \ + sql_create_complete_2(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1) + +// --------------------------------------------------- +// End Create 2 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 3 +// --------------------------------------------------- +#define sql_create_basic_c_order_3(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_complete_3(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(3, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(3, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(3, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(3, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(3, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(3, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_basic_3(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3) \ + sql_create_basic_c_order_3(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2) + +#define sql_create_3(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3) \ + sql_create_complete_3(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2) \ + +#define sql_create_c_order_3(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3) \ + sql_create_complete_3(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3) + +#define sql_create_c_names_3(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3) \ + sql_create_complete_3(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2) + +// --------------------------------------------------- +// End Create 3 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 4 +// --------------------------------------------------- +#define sql_create_basic_c_order_4(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_complete_4(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(4, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(4, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(4, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(4, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(4, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(4, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_basic_4(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4) \ + sql_create_basic_c_order_4(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3) + +#define sql_create_4(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4) \ + sql_create_complete_4(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3) \ + +#define sql_create_c_order_4(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4) \ + sql_create_complete_4(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4) + +#define sql_create_c_names_4(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4) \ + sql_create_complete_4(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3) + +// --------------------------------------------------- +// End Create 4 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 5 +// --------------------------------------------------- +#define sql_create_basic_c_order_5(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_complete_5(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(5, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(5, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(5, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(5, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(5, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(5, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_basic_5(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5) \ + sql_create_basic_c_order_5(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4) + +#define sql_create_5(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5) \ + sql_create_complete_5(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4) \ + +#define sql_create_c_order_5(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5) \ + sql_create_complete_5(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5) + +#define sql_create_c_names_5(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5) \ + sql_create_complete_5(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4) + +// --------------------------------------------------- +// End Create 5 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 6 +// --------------------------------------------------- +#define sql_create_basic_c_order_6(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_complete_6(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5, T6, I6, N6, O6) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5,\ + NAME##_##I6 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 ,\ + N6 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(6, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(6, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(6, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(6, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(6, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(6, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.manip << obj.obj->I6; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4] << obj.delem;\ + s << obj.manip << obj.obj->names[5]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I6;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[5];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_basic_6(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6) \ + sql_create_basic_c_order_6(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4, T6, I6, 5) + +#define sql_create_6(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6) \ + sql_create_complete_6(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4, T6, I6, #I6, 5) \ + +#define sql_create_c_order_6(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6) \ + sql_create_complete_6(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5, T6, I6, #I6, O6) + +#define sql_create_c_names_6(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5, T6, I6, N6) \ + sql_create_complete_6(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4, T6, I6, N6, 5) + +// --------------------------------------------------- +// End Create 6 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 7 +// --------------------------------------------------- +#define sql_create_basic_c_order_7(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_complete_7(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5, T6, I6, N6, O6, T7, I7, N7, O7) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5,\ + NAME##_##I6,\ + NAME##_##I7 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 ,\ + N6 ,\ + N7 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(7, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(7, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(7, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(7, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(7, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(7, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.manip << obj.obj->I7; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4] << obj.delem;\ + s << obj.manip << obj.obj->names[5] << obj.delem;\ + s << obj.manip << obj.obj->names[6]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I7;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[5];\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[6];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_basic_7(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7) \ + sql_create_basic_c_order_7(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4, T6, I6, 5, T7, I7, 6) + +#define sql_create_7(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7) \ + sql_create_complete_7(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4, T6, I6, #I6, 5, T7, I7, #I7, 6) \ + +#define sql_create_c_order_7(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7) \ + sql_create_complete_7(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5, T6, I6, #I6, O6, T7, I7, #I7, O7) + +#define sql_create_c_names_7(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5, T6, I6, N6, T7, I7, N7) \ + sql_create_complete_7(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4, T6, I6, N6, 5, T7, I7, N7, 6) + +// --------------------------------------------------- +// End Create 7 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 8 +// --------------------------------------------------- +#define sql_create_basic_c_order_8(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_complete_8(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5, T6, I6, N6, O6, T7, I7, N7, O7, T8, I8, N8, O8) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5,\ + NAME##_##I6,\ + NAME##_##I7,\ + NAME##_##I8 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 ,\ + N6 ,\ + N7 ,\ + N8 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(8, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(8, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(8, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(8, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(8, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(8, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.manip << obj.obj->I8; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4] << obj.delem;\ + s << obj.manip << obj.obj->names[5] << obj.delem;\ + s << obj.manip << obj.obj->names[6] << obj.delem;\ + s << obj.manip << obj.obj->names[7]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I8;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[5];\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[6];\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[7];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_basic_8(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8) \ + sql_create_basic_c_order_8(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4, T6, I6, 5, T7, I7, 6, T8, I8, 7) + +#define sql_create_8(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8) \ + sql_create_complete_8(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4, T6, I6, #I6, 5, T7, I7, #I7, 6, T8, I8, #I8, 7) \ + +#define sql_create_c_order_8(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8) \ + sql_create_complete_8(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5, T6, I6, #I6, O6, T7, I7, #I7, O7, T8, I8, #I8, O8) + +#define sql_create_c_names_8(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5, T6, I6, N6, T7, I7, N7, T8, I8, N8) \ + sql_create_complete_8(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4, T6, I6, N6, 5, T7, I7, N7, 6, T8, I8, N8, 7) + +// --------------------------------------------------- +// End Create 8 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 9 +// --------------------------------------------------- +#define sql_create_basic_c_order_9(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_complete_9(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5, T6, I6, N6, O6, T7, I7, N7, O7, T8, I8, N8, O8, T9, I9, N9, O9) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5,\ + NAME##_##I6,\ + NAME##_##I7,\ + NAME##_##I8,\ + NAME##_##I9 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 ,\ + N6 ,\ + N7 ,\ + N8 ,\ + N9 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(9, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(9, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(9, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(9, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(9, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(9, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.manip << obj.obj->I9; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4] << obj.delem;\ + s << obj.manip << obj.obj->names[5] << obj.delem;\ + s << obj.manip << obj.obj->names[6] << obj.delem;\ + s << obj.manip << obj.obj->names[7] << obj.delem;\ + s << obj.manip << obj.obj->names[8]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I9;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[5];\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[6];\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[7];\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[8];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_basic_9(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9) \ + sql_create_basic_c_order_9(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4, T6, I6, 5, T7, I7, 6, T8, I8, 7, T9, I9, 8) + +#define sql_create_9(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9) \ + sql_create_complete_9(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4, T6, I6, #I6, 5, T7, I7, #I7, 6, T8, I8, #I8, 7, T9, I9, #I9, 8) \ + +#define sql_create_c_order_9(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9) \ + sql_create_complete_9(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5, T6, I6, #I6, O6, T7, I7, #I7, O7, T8, I8, #I8, O8, T9, I9, #I9, O9) + +#define sql_create_c_names_9(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5, T6, I6, N6, T7, I7, N7, T8, I8, N8, T9, I9, N9) \ + sql_create_complete_9(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4, T6, I6, N6, 5, T7, I7, N7, 6, T8, I8, N8, 7, T9, I9, N9, 8) + +// --------------------------------------------------- +// End Create 9 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 10 +// --------------------------------------------------- +#define sql_create_basic_c_order_10(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_complete_10(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5, T6, I6, N6, O6, T7, I7, N7, O7, T8, I8, N8, O8, T9, I9, N9, O9, T10, I10, N10, O10) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5,\ + NAME##_##I6,\ + NAME##_##I7,\ + NAME##_##I8,\ + NAME##_##I9,\ + NAME##_##I10 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 ,\ + N6 ,\ + N7 ,\ + N8 ,\ + N9 ,\ + N10 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(10, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(10, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(10, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(10, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(10, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(10, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.manip << obj.obj->I10; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4] << obj.delem;\ + s << obj.manip << obj.obj->names[5] << obj.delem;\ + s << obj.manip << obj.obj->names[6] << obj.delem;\ + s << obj.manip << obj.obj->names[7] << obj.delem;\ + s << obj.manip << obj.obj->names[8] << obj.delem;\ + s << obj.manip << obj.obj->names[9]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I10;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[5];\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[6];\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[7];\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[8];\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[9];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_basic_10(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10) \ + sql_create_basic_c_order_10(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4, T6, I6, 5, T7, I7, 6, T8, I8, 7, T9, I9, 8, T10, I10, 9) + +#define sql_create_10(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10) \ + sql_create_complete_10(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4, T6, I6, #I6, 5, T7, I7, #I7, 6, T8, I8, #I8, 7, T9, I9, #I9, 8, T10, I10, #I10, 9) \ + +#define sql_create_c_order_10(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10) \ + sql_create_complete_10(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5, T6, I6, #I6, O6, T7, I7, #I7, O7, T8, I8, #I8, O8, T9, I9, #I9, O9, T10, I10, #I10, O10) + +#define sql_create_c_names_10(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5, T6, I6, N6, T7, I7, N7, T8, I8, N8, T9, I9, N9, T10, I10, N10) \ + sql_create_complete_10(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4, T6, I6, N6, 5, T7, I7, N7, 6, T8, I8, N8, 7, T9, I9, N9, 8, T10, I10, N10, 9) + +// --------------------------------------------------- +// End Create 10 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 11 +// --------------------------------------------------- +#define sql_create_basic_c_order_11(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_complete_11(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5, T6, I6, N6, O6, T7, I7, N7, O7, T8, I8, N8, O8, T9, I9, N9, O9, T10, I10, N10, O10, T11, I11, N11, O11) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5,\ + NAME##_##I6,\ + NAME##_##I7,\ + NAME##_##I8,\ + NAME##_##I9,\ + NAME##_##I10,\ + NAME##_##I11 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 ,\ + N6 ,\ + N7 ,\ + N8 ,\ + N9 ,\ + N10 ,\ + N11 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(11, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(11, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(11, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(11, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(11, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(11, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.manip << obj.obj->I11; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4] << obj.delem;\ + s << obj.manip << obj.obj->names[5] << obj.delem;\ + s << obj.manip << obj.obj->names[6] << obj.delem;\ + s << obj.manip << obj.obj->names[7] << obj.delem;\ + s << obj.manip << obj.obj->names[8] << obj.delem;\ + s << obj.manip << obj.obj->names[9] << obj.delem;\ + s << obj.manip << obj.obj->names[10]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I11;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[5];\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[6];\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[7];\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[8];\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[9];\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[10];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_basic_11(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11) \ + sql_create_basic_c_order_11(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4, T6, I6, 5, T7, I7, 6, T8, I8, 7, T9, I9, 8, T10, I10, 9, T11, I11, 10) + +#define sql_create_11(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11) \ + sql_create_complete_11(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4, T6, I6, #I6, 5, T7, I7, #I7, 6, T8, I8, #I8, 7, T9, I9, #I9, 8, T10, I10, #I10, 9, T11, I11, #I11, 10) \ + +#define sql_create_c_order_11(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11) \ + sql_create_complete_11(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5, T6, I6, #I6, O6, T7, I7, #I7, O7, T8, I8, #I8, O8, T9, I9, #I9, O9, T10, I10, #I10, O10, T11, I11, #I11, O11) + +#define sql_create_c_names_11(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5, T6, I6, N6, T7, I7, N7, T8, I8, N8, T9, I9, N9, T10, I10, N10, T11, I11, N11) \ + sql_create_complete_11(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4, T6, I6, N6, 5, T7, I7, N7, 6, T8, I8, N8, 7, T9, I9, N9, 8, T10, I10, N10, 9, T11, I11, N11, 10) + +// --------------------------------------------------- +// End Create 11 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 12 +// --------------------------------------------------- +#define sql_create_basic_c_order_12(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_complete_12(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5, T6, I6, N6, O6, T7, I7, N7, O7, T8, I8, N8, O8, T9, I9, N9, O9, T10, I10, N10, O10, T11, I11, N11, O11, T12, I12, N12, O12) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5,\ + NAME##_##I6,\ + NAME##_##I7,\ + NAME##_##I8,\ + NAME##_##I9,\ + NAME##_##I10,\ + NAME##_##I11,\ + NAME##_##I12 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 ,\ + N6 ,\ + N7 ,\ + N8 ,\ + N9 ,\ + N10 ,\ + N11 ,\ + N12 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(12, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(12, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(12, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(12, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(12, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(12, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.manip << obj.obj->I12; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4] << obj.delem;\ + s << obj.manip << obj.obj->names[5] << obj.delem;\ + s << obj.manip << obj.obj->names[6] << obj.delem;\ + s << obj.manip << obj.obj->names[7] << obj.delem;\ + s << obj.manip << obj.obj->names[8] << obj.delem;\ + s << obj.manip << obj.obj->names[9] << obj.delem;\ + s << obj.manip << obj.obj->names[10] << obj.delem;\ + s << obj.manip << obj.obj->names[11]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I12;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[5];\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[6];\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[7];\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[8];\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[9];\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[10];\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[11];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_basic_12(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12) \ + sql_create_basic_c_order_12(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4, T6, I6, 5, T7, I7, 6, T8, I8, 7, T9, I9, 8, T10, I10, 9, T11, I11, 10, T12, I12, 11) + +#define sql_create_12(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12) \ + sql_create_complete_12(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4, T6, I6, #I6, 5, T7, I7, #I7, 6, T8, I8, #I8, 7, T9, I9, #I9, 8, T10, I10, #I10, 9, T11, I11, #I11, 10, T12, I12, #I12, 11) \ + +#define sql_create_c_order_12(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12) \ + sql_create_complete_12(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5, T6, I6, #I6, O6, T7, I7, #I7, O7, T8, I8, #I8, O8, T9, I9, #I9, O9, T10, I10, #I10, O10, T11, I11, #I11, O11, T12, I12, #I12, O12) + +#define sql_create_c_names_12(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5, T6, I6, N6, T7, I7, N7, T8, I8, N8, T9, I9, N9, T10, I10, N10, T11, I11, N11, T12, I12, N12) \ + sql_create_complete_12(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4, T6, I6, N6, 5, T7, I7, N7, 6, T8, I8, N8, 7, T9, I9, N9, 8, T10, I10, N10, 9, T11, I11, N11, 10, T12, I12, N12, 11) + +// --------------------------------------------------- +// End Create 12 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 13 +// --------------------------------------------------- +#define sql_create_basic_c_order_13(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_complete_13(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5, T6, I6, N6, O6, T7, I7, N7, O7, T8, I8, N8, O8, T9, I9, N9, O9, T10, I10, N10, O10, T11, I11, N11, O11, T12, I12, N12, O12, T13, I13, N13, O13) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5,\ + NAME##_##I6,\ + NAME##_##I7,\ + NAME##_##I8,\ + NAME##_##I9,\ + NAME##_##I10,\ + NAME##_##I11,\ + NAME##_##I12,\ + NAME##_##I13 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 ,\ + N6 ,\ + N7 ,\ + N8 ,\ + N9 ,\ + N10 ,\ + N11 ,\ + N12 ,\ + N13 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(13, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(13, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(13, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(13, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(13, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(13, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.manip << obj.obj->I13; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4] << obj.delem;\ + s << obj.manip << obj.obj->names[5] << obj.delem;\ + s << obj.manip << obj.obj->names[6] << obj.delem;\ + s << obj.manip << obj.obj->names[7] << obj.delem;\ + s << obj.manip << obj.obj->names[8] << obj.delem;\ + s << obj.manip << obj.obj->names[9] << obj.delem;\ + s << obj.manip << obj.obj->names[10] << obj.delem;\ + s << obj.manip << obj.obj->names[11] << obj.delem;\ + s << obj.manip << obj.obj->names[12]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I13;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[5];\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[6];\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[7];\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[8];\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[9];\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[10];\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[11];\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[12];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_basic_13(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13) \ + sql_create_basic_c_order_13(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4, T6, I6, 5, T7, I7, 6, T8, I8, 7, T9, I9, 8, T10, I10, 9, T11, I11, 10, T12, I12, 11, T13, I13, 12) + +#define sql_create_13(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13) \ + sql_create_complete_13(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4, T6, I6, #I6, 5, T7, I7, #I7, 6, T8, I8, #I8, 7, T9, I9, #I9, 8, T10, I10, #I10, 9, T11, I11, #I11, 10, T12, I12, #I12, 11, T13, I13, #I13, 12) \ + +#define sql_create_c_order_13(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13) \ + sql_create_complete_13(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5, T6, I6, #I6, O6, T7, I7, #I7, O7, T8, I8, #I8, O8, T9, I9, #I9, O9, T10, I10, #I10, O10, T11, I11, #I11, O11, T12, I12, #I12, O12, T13, I13, #I13, O13) + +#define sql_create_c_names_13(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5, T6, I6, N6, T7, I7, N7, T8, I8, N8, T9, I9, N9, T10, I10, N10, T11, I11, N11, T12, I12, N12, T13, I13, N13) \ + sql_create_complete_13(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4, T6, I6, N6, 5, T7, I7, N7, 6, T8, I8, N8, 7, T9, I9, N9, 8, T10, I10, N10, 9, T11, I11, N11, 10, T12, I12, N12, 11, T13, I13, N13, 12) + +// --------------------------------------------------- +// End Create 13 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 14 +// --------------------------------------------------- +#define sql_create_basic_c_order_14(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_complete_14(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5, T6, I6, N6, O6, T7, I7, N7, O7, T8, I8, N8, O8, T9, I9, N9, O9, T10, I10, N10, O10, T11, I11, N11, O11, T12, I12, N12, O12, T13, I13, N13, O13, T14, I14, N14, O14) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5,\ + NAME##_##I6,\ + NAME##_##I7,\ + NAME##_##I8,\ + NAME##_##I9,\ + NAME##_##I10,\ + NAME##_##I11,\ + NAME##_##I12,\ + NAME##_##I13,\ + NAME##_##I14 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 ,\ + N6 ,\ + N7 ,\ + N8 ,\ + N9 ,\ + N10 ,\ + N11 ,\ + N12 ,\ + N13 ,\ + N14 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(14, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(14, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(14, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(14, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(14, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(14, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.manip << obj.obj->I14; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4] << obj.delem;\ + s << obj.manip << obj.obj->names[5] << obj.delem;\ + s << obj.manip << obj.obj->names[6] << obj.delem;\ + s << obj.manip << obj.obj->names[7] << obj.delem;\ + s << obj.manip << obj.obj->names[8] << obj.delem;\ + s << obj.manip << obj.obj->names[9] << obj.delem;\ + s << obj.manip << obj.obj->names[10] << obj.delem;\ + s << obj.manip << obj.obj->names[11] << obj.delem;\ + s << obj.manip << obj.obj->names[12] << obj.delem;\ + s << obj.manip << obj.obj->names[13]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I14;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[5];\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[6];\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[7];\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[8];\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[9];\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[10];\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[11];\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[12];\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[13];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_basic_14(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14) \ + sql_create_basic_c_order_14(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4, T6, I6, 5, T7, I7, 6, T8, I8, 7, T9, I9, 8, T10, I10, 9, T11, I11, 10, T12, I12, 11, T13, I13, 12, T14, I14, 13) + +#define sql_create_14(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14) \ + sql_create_complete_14(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4, T6, I6, #I6, 5, T7, I7, #I7, 6, T8, I8, #I8, 7, T9, I9, #I9, 8, T10, I10, #I10, 9, T11, I11, #I11, 10, T12, I12, #I12, 11, T13, I13, #I13, 12, T14, I14, #I14, 13) \ + +#define sql_create_c_order_14(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14) \ + sql_create_complete_14(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5, T6, I6, #I6, O6, T7, I7, #I7, O7, T8, I8, #I8, O8, T9, I9, #I9, O9, T10, I10, #I10, O10, T11, I11, #I11, O11, T12, I12, #I12, O12, T13, I13, #I13, O13, T14, I14, #I14, O14) + +#define sql_create_c_names_14(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5, T6, I6, N6, T7, I7, N7, T8, I8, N8, T9, I9, N9, T10, I10, N10, T11, I11, N11, T12, I12, N12, T13, I13, N13, T14, I14, N14) \ + sql_create_complete_14(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4, T6, I6, N6, 5, T7, I7, N7, 6, T8, I8, N8, 7, T9, I9, N9, 8, T10, I10, N10, 9, T11, I11, N11, 10, T12, I12, N12, 11, T13, I13, N13, 12, T14, I14, N14, 13) + +// --------------------------------------------------- +// End Create 14 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 15 +// --------------------------------------------------- +#define sql_create_basic_c_order_15(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_complete_15(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5, T6, I6, N6, O6, T7, I7, N7, O7, T8, I8, N8, O8, T9, I9, N9, O9, T10, I10, N10, O10, T11, I11, N11, O11, T12, I12, N12, O12, T13, I13, N13, O13, T14, I14, N14, O14, T15, I15, N15, O15) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5,\ + NAME##_##I6,\ + NAME##_##I7,\ + NAME##_##I8,\ + NAME##_##I9,\ + NAME##_##I10,\ + NAME##_##I11,\ + NAME##_##I12,\ + NAME##_##I13,\ + NAME##_##I14,\ + NAME##_##I15 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 ,\ + N6 ,\ + N7 ,\ + N8 ,\ + N9 ,\ + N10 ,\ + N11 ,\ + N12 ,\ + N13 ,\ + N14 ,\ + N15 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(15, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(15, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(15, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(15, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(15, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(15, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.manip << obj.obj->I15; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4] << obj.delem;\ + s << obj.manip << obj.obj->names[5] << obj.delem;\ + s << obj.manip << obj.obj->names[6] << obj.delem;\ + s << obj.manip << obj.obj->names[7] << obj.delem;\ + s << obj.manip << obj.obj->names[8] << obj.delem;\ + s << obj.manip << obj.obj->names[9] << obj.delem;\ + s << obj.manip << obj.obj->names[10] << obj.delem;\ + s << obj.manip << obj.obj->names[11] << obj.delem;\ + s << obj.manip << obj.obj->names[12] << obj.delem;\ + s << obj.manip << obj.obj->names[13] << obj.delem;\ + s << obj.manip << obj.obj->names[14]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I15;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[5];\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[6];\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[7];\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[8];\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[9];\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[10];\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[11];\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[12];\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[13];\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[14];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_basic_15(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15) \ + sql_create_basic_c_order_15(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4, T6, I6, 5, T7, I7, 6, T8, I8, 7, T9, I9, 8, T10, I10, 9, T11, I11, 10, T12, I12, 11, T13, I13, 12, T14, I14, 13, T15, I15, 14) + +#define sql_create_15(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15) \ + sql_create_complete_15(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4, T6, I6, #I6, 5, T7, I7, #I7, 6, T8, I8, #I8, 7, T9, I9, #I9, 8, T10, I10, #I10, 9, T11, I11, #I11, 10, T12, I12, #I12, 11, T13, I13, #I13, 12, T14, I14, #I14, 13, T15, I15, #I15, 14) \ + +#define sql_create_c_order_15(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15) \ + sql_create_complete_15(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5, T6, I6, #I6, O6, T7, I7, #I7, O7, T8, I8, #I8, O8, T9, I9, #I9, O9, T10, I10, #I10, O10, T11, I11, #I11, O11, T12, I12, #I12, O12, T13, I13, #I13, O13, T14, I14, #I14, O14, T15, I15, #I15, O15) + +#define sql_create_c_names_15(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5, T6, I6, N6, T7, I7, N7, T8, I8, N8, T9, I9, N9, T10, I10, N10, T11, I11, N11, T12, I12, N12, T13, I13, N13, T14, I14, N14, T15, I15, N15) \ + sql_create_complete_15(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4, T6, I6, N6, 5, T7, I7, N7, 6, T8, I8, N8, 7, T9, I9, N9, 8, T10, I10, N10, 9, T11, I11, N11, 10, T12, I12, N12, 11, T13, I13, N13, 12, T14, I14, N14, 13, T15, I15, N15, 14) + +// --------------------------------------------------- +// End Create 15 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 16 +// --------------------------------------------------- +#define sql_create_basic_c_order_16(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15, T16, I16, O16)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15;\ + T16 I16; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + s->I16 = static_cast(row.at(O16)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_complete_16(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5, T6, I6, N6, O6, T7, I7, N7, O7, T8, I8, N8, O8, T9, I9, N9, O9, T10, I10, N10, O10, T11, I11, N11, O11, T12, I12, N12, O12, T13, I13, N13, O13, T14, I14, N14, O14, T15, I15, N15, O15, T16, I16, N16, O16) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5,\ + NAME##_##I6,\ + NAME##_##I7,\ + NAME##_##I8,\ + NAME##_##I9,\ + NAME##_##I10,\ + NAME##_##I11,\ + NAME##_##I12,\ + NAME##_##I13,\ + NAME##_##I14,\ + NAME##_##I15,\ + NAME##_##I16 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15;\ + T16 I16; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 ,\ + N6 ,\ + N7 ,\ + N8 ,\ + N9 ,\ + N10 ,\ + N11 ,\ + N12 ,\ + N13 ,\ + N14 ,\ + N15 ,\ + N16 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(16, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(16, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(16, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(16, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(16, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(16, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.manip << obj.obj->I15 << obj.delem;\ + s << obj.manip << obj.obj->I16; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4] << obj.delem;\ + s << obj.manip << obj.obj->names[5] << obj.delem;\ + s << obj.manip << obj.obj->names[6] << obj.delem;\ + s << obj.manip << obj.obj->names[7] << obj.delem;\ + s << obj.manip << obj.obj->names[8] << obj.delem;\ + s << obj.manip << obj.obj->names[9] << obj.delem;\ + s << obj.manip << obj.obj->names[10] << obj.delem;\ + s << obj.manip << obj.obj->names[11] << obj.delem;\ + s << obj.manip << obj.obj->names[12] << obj.delem;\ + s << obj.manip << obj.obj->names[13] << obj.delem;\ + s << obj.manip << obj.obj->names[14] << obj.delem;\ + s << obj.manip << obj.obj->names[15]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15 << obj.delem;\ + s << obj.obj->names[15] << obj.comp << obj.manip << obj.obj->I16; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I15;\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I16;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[5];\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[6];\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[7];\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[8];\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[9];\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[10];\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[11];\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[12];\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[13];\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[14];\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[15];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15;\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[15] << obj.comp << obj.manip << obj.obj->I16;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + s->I16 = static_cast(row.at(O16));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_basic_16(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16) \ + sql_create_basic_c_order_16(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4, T6, I6, 5, T7, I7, 6, T8, I8, 7, T9, I9, 8, T10, I10, 9, T11, I11, 10, T12, I12, 11, T13, I13, 12, T14, I14, 13, T15, I15, 14, T16, I16, 15) + +#define sql_create_16(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16) \ + sql_create_complete_16(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4, T6, I6, #I6, 5, T7, I7, #I7, 6, T8, I8, #I8, 7, T9, I9, #I9, 8, T10, I10, #I10, 9, T11, I11, #I11, 10, T12, I12, #I12, 11, T13, I13, #I13, 12, T14, I14, #I14, 13, T15, I15, #I15, 14, T16, I16, #I16, 15) \ + +#define sql_create_c_order_16(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15, T16, I16, O16) \ + sql_create_complete_16(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5, T6, I6, #I6, O6, T7, I7, #I7, O7, T8, I8, #I8, O8, T9, I9, #I9, O9, T10, I10, #I10, O10, T11, I11, #I11, O11, T12, I12, #I12, O12, T13, I13, #I13, O13, T14, I14, #I14, O14, T15, I15, #I15, O15, T16, I16, #I16, O16) + +#define sql_create_c_names_16(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5, T6, I6, N6, T7, I7, N7, T8, I8, N8, T9, I9, N9, T10, I10, N10, T11, I11, N11, T12, I12, N12, T13, I13, N13, T14, I14, N14, T15, I15, N15, T16, I16, N16) \ + sql_create_complete_16(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4, T6, I6, N6, 5, T7, I7, N7, 6, T8, I8, N8, 7, T9, I9, N9, 8, T10, I10, N10, 9, T11, I11, N11, 10, T12, I12, N12, 11, T13, I13, N13, 12, T14, I14, N14, 13, T15, I15, N15, 14, T16, I16, N16, 15) + +// --------------------------------------------------- +// End Create 16 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 17 +// --------------------------------------------------- +#define sql_create_basic_c_order_17(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15, T16, I16, O16, T17, I17, O17)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15;\ + T16 I16;\ + T17 I17; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + s->I16 = static_cast(row.at(O16));\ + s->I17 = static_cast(row.at(O17)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, I17, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_complete_17(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5, T6, I6, N6, O6, T7, I7, N7, O7, T8, I8, N8, O8, T9, I9, N9, O9, T10, I10, N10, O10, T11, I11, N11, O11, T12, I12, N12, O12, T13, I13, N13, O13, T14, I14, N14, O14, T15, I15, N15, O15, T16, I16, N16, O16, T17, I17, N17, O17) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5,\ + NAME##_##I6,\ + NAME##_##I7,\ + NAME##_##I8,\ + NAME##_##I9,\ + NAME##_##I10,\ + NAME##_##I11,\ + NAME##_##I12,\ + NAME##_##I13,\ + NAME##_##I14,\ + NAME##_##I15,\ + NAME##_##I16,\ + NAME##_##I17 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15;\ + T16 I16;\ + T17 I17; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 ,\ + N6 ,\ + N7 ,\ + N8 ,\ + N9 ,\ + N10 ,\ + N11 ,\ + N12 ,\ + N13 ,\ + N14 ,\ + N15 ,\ + N16 ,\ + N17 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(17, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(17, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(17, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(17, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(17, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(17, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.manip << obj.obj->I15 << obj.delem;\ + s << obj.manip << obj.obj->I16 << obj.delem;\ + s << obj.manip << obj.obj->I17; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4] << obj.delem;\ + s << obj.manip << obj.obj->names[5] << obj.delem;\ + s << obj.manip << obj.obj->names[6] << obj.delem;\ + s << obj.manip << obj.obj->names[7] << obj.delem;\ + s << obj.manip << obj.obj->names[8] << obj.delem;\ + s << obj.manip << obj.obj->names[9] << obj.delem;\ + s << obj.manip << obj.obj->names[10] << obj.delem;\ + s << obj.manip << obj.obj->names[11] << obj.delem;\ + s << obj.manip << obj.obj->names[12] << obj.delem;\ + s << obj.manip << obj.obj->names[13] << obj.delem;\ + s << obj.manip << obj.obj->names[14] << obj.delem;\ + s << obj.manip << obj.obj->names[15] << obj.delem;\ + s << obj.manip << obj.obj->names[16]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15 << obj.delem;\ + s << obj.obj->names[15] << obj.comp << obj.manip << obj.obj->I16 << obj.delem;\ + s << obj.obj->names[16] << obj.comp << obj.manip << obj.obj->I17; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I15;\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I16;\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I17;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[5];\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[6];\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[7];\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[8];\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[9];\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[10];\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[11];\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[12];\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[13];\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[14];\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[15];\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[16];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15;\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[15] << obj.comp << obj.manip << obj.obj->I16;\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[16] << obj.comp << obj.manip << obj.obj->I17;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + s->I16 = static_cast(row.at(O16));\ + s->I17 = static_cast(row.at(O17));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, I17, 0, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_basic_17(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17) \ + sql_create_basic_c_order_17(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4, T6, I6, 5, T7, I7, 6, T8, I8, 7, T9, I9, 8, T10, I10, 9, T11, I11, 10, T12, I12, 11, T13, I13, 12, T14, I14, 13, T15, I15, 14, T16, I16, 15, T17, I17, 16) + +#define sql_create_17(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17) \ + sql_create_complete_17(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4, T6, I6, #I6, 5, T7, I7, #I7, 6, T8, I8, #I8, 7, T9, I9, #I9, 8, T10, I10, #I10, 9, T11, I11, #I11, 10, T12, I12, #I12, 11, T13, I13, #I13, 12, T14, I14, #I14, 13, T15, I15, #I15, 14, T16, I16, #I16, 15, T17, I17, #I17, 16) \ + +#define sql_create_c_order_17(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15, T16, I16, O16, T17, I17, O17) \ + sql_create_complete_17(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5, T6, I6, #I6, O6, T7, I7, #I7, O7, T8, I8, #I8, O8, T9, I9, #I9, O9, T10, I10, #I10, O10, T11, I11, #I11, O11, T12, I12, #I12, O12, T13, I13, #I13, O13, T14, I14, #I14, O14, T15, I15, #I15, O15, T16, I16, #I16, O16, T17, I17, #I17, O17) + +#define sql_create_c_names_17(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5, T6, I6, N6, T7, I7, N7, T8, I8, N8, T9, I9, N9, T10, I10, N10, T11, I11, N11, T12, I12, N12, T13, I13, N13, T14, I14, N14, T15, I15, N15, T16, I16, N16, T17, I17, N17) \ + sql_create_complete_17(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4, T6, I6, N6, 5, T7, I7, N7, 6, T8, I8, N8, 7, T9, I9, N9, 8, T10, I10, N10, 9, T11, I11, N11, 10, T12, I12, N12, 11, T13, I13, N13, 12, T14, I14, N14, 13, T15, I15, N15, 14, T16, I16, N16, 15, T17, I17, N17, 16) + +// --------------------------------------------------- +// End Create 17 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 18 +// --------------------------------------------------- +#define sql_create_basic_c_order_18(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15, T16, I16, O16, T17, I17, O17, T18, I18, O18)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15;\ + T16 I16;\ + T17 I17;\ + T18 I18; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + s->I16 = static_cast(row.at(O16));\ + s->I17 = static_cast(row.at(O17));\ + s->I18 = static_cast(row.at(O18)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, I17, I18, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_complete_18(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5, T6, I6, N6, O6, T7, I7, N7, O7, T8, I8, N8, O8, T9, I9, N9, O9, T10, I10, N10, O10, T11, I11, N11, O11, T12, I12, N12, O12, T13, I13, N13, O13, T14, I14, N14, O14, T15, I15, N15, O15, T16, I16, N16, O16, T17, I17, N17, O17, T18, I18, N18, O18) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5,\ + NAME##_##I6,\ + NAME##_##I7,\ + NAME##_##I8,\ + NAME##_##I9,\ + NAME##_##I10,\ + NAME##_##I11,\ + NAME##_##I12,\ + NAME##_##I13,\ + NAME##_##I14,\ + NAME##_##I15,\ + NAME##_##I16,\ + NAME##_##I17,\ + NAME##_##I18 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15;\ + T16 I16;\ + T17 I17;\ + T18 I18; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 ,\ + N6 ,\ + N7 ,\ + N8 ,\ + N9 ,\ + N10 ,\ + N11 ,\ + N12 ,\ + N13 ,\ + N14 ,\ + N15 ,\ + N16 ,\ + N17 ,\ + N18 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(18, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(18, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(18, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(18, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(18, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(18, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.manip << obj.obj->I15 << obj.delem;\ + s << obj.manip << obj.obj->I16 << obj.delem;\ + s << obj.manip << obj.obj->I17 << obj.delem;\ + s << obj.manip << obj.obj->I18; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4] << obj.delem;\ + s << obj.manip << obj.obj->names[5] << obj.delem;\ + s << obj.manip << obj.obj->names[6] << obj.delem;\ + s << obj.manip << obj.obj->names[7] << obj.delem;\ + s << obj.manip << obj.obj->names[8] << obj.delem;\ + s << obj.manip << obj.obj->names[9] << obj.delem;\ + s << obj.manip << obj.obj->names[10] << obj.delem;\ + s << obj.manip << obj.obj->names[11] << obj.delem;\ + s << obj.manip << obj.obj->names[12] << obj.delem;\ + s << obj.manip << obj.obj->names[13] << obj.delem;\ + s << obj.manip << obj.obj->names[14] << obj.delem;\ + s << obj.manip << obj.obj->names[15] << obj.delem;\ + s << obj.manip << obj.obj->names[16] << obj.delem;\ + s << obj.manip << obj.obj->names[17]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15 << obj.delem;\ + s << obj.obj->names[15] << obj.comp << obj.manip << obj.obj->I16 << obj.delem;\ + s << obj.obj->names[16] << obj.comp << obj.manip << obj.obj->I17 << obj.delem;\ + s << obj.obj->names[17] << obj.comp << obj.manip << obj.obj->I18; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I15;\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I16;\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I17;\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I18;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[5];\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[6];\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[7];\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[8];\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[9];\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[10];\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[11];\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[12];\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[13];\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[14];\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[15];\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[16];\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[17];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15;\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[15] << obj.comp << obj.manip << obj.obj->I16;\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[16] << obj.comp << obj.manip << obj.obj->I17;\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[17] << obj.comp << obj.manip << obj.obj->I18;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + s->I16 = static_cast(row.at(O16));\ + s->I17 = static_cast(row.at(O17));\ + s->I18 = static_cast(row.at(O18));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, I17, I18, 0, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_basic_18(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18) \ + sql_create_basic_c_order_18(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4, T6, I6, 5, T7, I7, 6, T8, I8, 7, T9, I9, 8, T10, I10, 9, T11, I11, 10, T12, I12, 11, T13, I13, 12, T14, I14, 13, T15, I15, 14, T16, I16, 15, T17, I17, 16, T18, I18, 17) + +#define sql_create_18(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18) \ + sql_create_complete_18(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4, T6, I6, #I6, 5, T7, I7, #I7, 6, T8, I8, #I8, 7, T9, I9, #I9, 8, T10, I10, #I10, 9, T11, I11, #I11, 10, T12, I12, #I12, 11, T13, I13, #I13, 12, T14, I14, #I14, 13, T15, I15, #I15, 14, T16, I16, #I16, 15, T17, I17, #I17, 16, T18, I18, #I18, 17) \ + +#define sql_create_c_order_18(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15, T16, I16, O16, T17, I17, O17, T18, I18, O18) \ + sql_create_complete_18(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5, T6, I6, #I6, O6, T7, I7, #I7, O7, T8, I8, #I8, O8, T9, I9, #I9, O9, T10, I10, #I10, O10, T11, I11, #I11, O11, T12, I12, #I12, O12, T13, I13, #I13, O13, T14, I14, #I14, O14, T15, I15, #I15, O15, T16, I16, #I16, O16, T17, I17, #I17, O17, T18, I18, #I18, O18) + +#define sql_create_c_names_18(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5, T6, I6, N6, T7, I7, N7, T8, I8, N8, T9, I9, N9, T10, I10, N10, T11, I11, N11, T12, I12, N12, T13, I13, N13, T14, I14, N14, T15, I15, N15, T16, I16, N16, T17, I17, N17, T18, I18, N18) \ + sql_create_complete_18(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4, T6, I6, N6, 5, T7, I7, N7, 6, T8, I8, N8, 7, T9, I9, N9, 8, T10, I10, N10, 9, T11, I11, N11, 10, T12, I12, N12, 11, T13, I13, N13, 12, T14, I14, N14, 13, T15, I15, N15, 14, T16, I16, N16, 15, T17, I17, N17, 16, T18, I18, N18, 17) + +// --------------------------------------------------- +// End Create 18 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 19 +// --------------------------------------------------- +#define sql_create_basic_c_order_19(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15, T16, I16, O16, T17, I17, O17, T18, I18, O18, T19, I19, O19)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15;\ + T16 I16;\ + T17 I17;\ + T18 I18;\ + T19 I19; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + s->I16 = static_cast(row.at(O16));\ + s->I17 = static_cast(row.at(O17));\ + s->I18 = static_cast(row.at(O18));\ + s->I19 = static_cast(row.at(O19)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, I17, I18, I19, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_complete_19(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5, T6, I6, N6, O6, T7, I7, N7, O7, T8, I8, N8, O8, T9, I9, N9, O9, T10, I10, N10, O10, T11, I11, N11, O11, T12, I12, N12, O12, T13, I13, N13, O13, T14, I14, N14, O14, T15, I15, N15, O15, T16, I16, N16, O16, T17, I17, N17, O17, T18, I18, N18, O18, T19, I19, N19, O19) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5,\ + NAME##_##I6,\ + NAME##_##I7,\ + NAME##_##I8,\ + NAME##_##I9,\ + NAME##_##I10,\ + NAME##_##I11,\ + NAME##_##I12,\ + NAME##_##I13,\ + NAME##_##I14,\ + NAME##_##I15,\ + NAME##_##I16,\ + NAME##_##I17,\ + NAME##_##I18,\ + NAME##_##I19 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15;\ + T16 I16;\ + T17 I17;\ + T18 I18;\ + T19 I19; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 ,\ + N6 ,\ + N7 ,\ + N8 ,\ + N9 ,\ + N10 ,\ + N11 ,\ + N12 ,\ + N13 ,\ + N14 ,\ + N15 ,\ + N16 ,\ + N17 ,\ + N18 ,\ + N19 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(19, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(19, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(19, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(19, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(19, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(19, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.manip << obj.obj->I15 << obj.delem;\ + s << obj.manip << obj.obj->I16 << obj.delem;\ + s << obj.manip << obj.obj->I17 << obj.delem;\ + s << obj.manip << obj.obj->I18 << obj.delem;\ + s << obj.manip << obj.obj->I19; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4] << obj.delem;\ + s << obj.manip << obj.obj->names[5] << obj.delem;\ + s << obj.manip << obj.obj->names[6] << obj.delem;\ + s << obj.manip << obj.obj->names[7] << obj.delem;\ + s << obj.manip << obj.obj->names[8] << obj.delem;\ + s << obj.manip << obj.obj->names[9] << obj.delem;\ + s << obj.manip << obj.obj->names[10] << obj.delem;\ + s << obj.manip << obj.obj->names[11] << obj.delem;\ + s << obj.manip << obj.obj->names[12] << obj.delem;\ + s << obj.manip << obj.obj->names[13] << obj.delem;\ + s << obj.manip << obj.obj->names[14] << obj.delem;\ + s << obj.manip << obj.obj->names[15] << obj.delem;\ + s << obj.manip << obj.obj->names[16] << obj.delem;\ + s << obj.manip << obj.obj->names[17] << obj.delem;\ + s << obj.manip << obj.obj->names[18]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15 << obj.delem;\ + s << obj.obj->names[15] << obj.comp << obj.manip << obj.obj->I16 << obj.delem;\ + s << obj.obj->names[16] << obj.comp << obj.manip << obj.obj->I17 << obj.delem;\ + s << obj.obj->names[17] << obj.comp << obj.manip << obj.obj->I18 << obj.delem;\ + s << obj.obj->names[18] << obj.comp << obj.manip << obj.obj->I19; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I15;\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I16;\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I17;\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I18;\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I19;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[5];\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[6];\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[7];\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[8];\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[9];\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[10];\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[11];\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[12];\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[13];\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[14];\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[15];\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[16];\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[17];\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[18];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15;\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[15] << obj.comp << obj.manip << obj.obj->I16;\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[16] << obj.comp << obj.manip << obj.obj->I17;\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[17] << obj.comp << obj.manip << obj.obj->I18;\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[18] << obj.comp << obj.manip << obj.obj->I19;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + s->I16 = static_cast(row.at(O16));\ + s->I17 = static_cast(row.at(O17));\ + s->I18 = static_cast(row.at(O18));\ + s->I19 = static_cast(row.at(O19));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, I17, I18, I19, 0, 0, 0, 0, 0, 0 ) + +#define sql_create_basic_19(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19) \ + sql_create_basic_c_order_19(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4, T6, I6, 5, T7, I7, 6, T8, I8, 7, T9, I9, 8, T10, I10, 9, T11, I11, 10, T12, I12, 11, T13, I13, 12, T14, I14, 13, T15, I15, 14, T16, I16, 15, T17, I17, 16, T18, I18, 17, T19, I19, 18) + +#define sql_create_19(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19) \ + sql_create_complete_19(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4, T6, I6, #I6, 5, T7, I7, #I7, 6, T8, I8, #I8, 7, T9, I9, #I9, 8, T10, I10, #I10, 9, T11, I11, #I11, 10, T12, I12, #I12, 11, T13, I13, #I13, 12, T14, I14, #I14, 13, T15, I15, #I15, 14, T16, I16, #I16, 15, T17, I17, #I17, 16, T18, I18, #I18, 17, T19, I19, #I19, 18) \ + +#define sql_create_c_order_19(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15, T16, I16, O16, T17, I17, O17, T18, I18, O18, T19, I19, O19) \ + sql_create_complete_19(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5, T6, I6, #I6, O6, T7, I7, #I7, O7, T8, I8, #I8, O8, T9, I9, #I9, O9, T10, I10, #I10, O10, T11, I11, #I11, O11, T12, I12, #I12, O12, T13, I13, #I13, O13, T14, I14, #I14, O14, T15, I15, #I15, O15, T16, I16, #I16, O16, T17, I17, #I17, O17, T18, I18, #I18, O18, T19, I19, #I19, O19) + +#define sql_create_c_names_19(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5, T6, I6, N6, T7, I7, N7, T8, I8, N8, T9, I9, N9, T10, I10, N10, T11, I11, N11, T12, I12, N12, T13, I13, N13, T14, I14, N14, T15, I15, N15, T16, I16, N16, T17, I17, N17, T18, I18, N18, T19, I19, N19) \ + sql_create_complete_19(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4, T6, I6, N6, 5, T7, I7, N7, 6, T8, I8, N8, 7, T9, I9, N9, 8, T10, I10, N10, 9, T11, I11, N11, 10, T12, I12, N12, 11, T13, I13, N13, 12, T14, I14, N14, 13, T15, I15, N15, 14, T16, I16, N16, 15, T17, I17, N17, 16, T18, I18, N18, 17, T19, I19, N19, 18) + +// --------------------------------------------------- +// End Create 19 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 20 +// --------------------------------------------------- +#define sql_create_basic_c_order_20(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15, T16, I16, O16, T17, I17, O17, T18, I18, O18, T19, I19, O19, T20, I20, O20)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15;\ + T16 I16;\ + T17 I17;\ + T18 I18;\ + T19 I19;\ + T20 I20; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + s->I16 = static_cast(row.at(O16));\ + s->I17 = static_cast(row.at(O17));\ + s->I18 = static_cast(row.at(O18));\ + s->I19 = static_cast(row.at(O19));\ + s->I20 = static_cast(row.at(O20)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, I17, I18, I19, I20, 0, 0, 0, 0, 0 ) + +#define sql_create_complete_20(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5, T6, I6, N6, O6, T7, I7, N7, O7, T8, I8, N8, O8, T9, I9, N9, O9, T10, I10, N10, O10, T11, I11, N11, O11, T12, I12, N12, O12, T13, I13, N13, O13, T14, I14, N14, O14, T15, I15, N15, O15, T16, I16, N16, O16, T17, I17, N17, O17, T18, I18, N18, O18, T19, I19, N19, O19, T20, I20, N20, O20) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5,\ + NAME##_##I6,\ + NAME##_##I7,\ + NAME##_##I8,\ + NAME##_##I9,\ + NAME##_##I10,\ + NAME##_##I11,\ + NAME##_##I12,\ + NAME##_##I13,\ + NAME##_##I14,\ + NAME##_##I15,\ + NAME##_##I16,\ + NAME##_##I17,\ + NAME##_##I18,\ + NAME##_##I19,\ + NAME##_##I20 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15;\ + T16 I16;\ + T17 I17;\ + T18 I18;\ + T19 I19;\ + T20 I20; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 ,\ + N6 ,\ + N7 ,\ + N8 ,\ + N9 ,\ + N10 ,\ + N11 ,\ + N12 ,\ + N13 ,\ + N14 ,\ + N15 ,\ + N16 ,\ + N17 ,\ + N18 ,\ + N19 ,\ + N20 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(20, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + if (i20) (*include)[19]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(20, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + if (i20 == NAME##_NULL) return;\ + (*include)[i20]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(20, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + if (i20) (*include)[19]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(20, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + if (i20 == NAME##_NULL) return;\ + (*include)[i20]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(20, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + if (i20) (*include)[19]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(20, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + if (i20 == NAME##_NULL) return;\ + (*include)[i20]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.manip << obj.obj->I15 << obj.delem;\ + s << obj.manip << obj.obj->I16 << obj.delem;\ + s << obj.manip << obj.obj->I17 << obj.delem;\ + s << obj.manip << obj.obj->I18 << obj.delem;\ + s << obj.manip << obj.obj->I19 << obj.delem;\ + s << obj.manip << obj.obj->I20; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4] << obj.delem;\ + s << obj.manip << obj.obj->names[5] << obj.delem;\ + s << obj.manip << obj.obj->names[6] << obj.delem;\ + s << obj.manip << obj.obj->names[7] << obj.delem;\ + s << obj.manip << obj.obj->names[8] << obj.delem;\ + s << obj.manip << obj.obj->names[9] << obj.delem;\ + s << obj.manip << obj.obj->names[10] << obj.delem;\ + s << obj.manip << obj.obj->names[11] << obj.delem;\ + s << obj.manip << obj.obj->names[12] << obj.delem;\ + s << obj.manip << obj.obj->names[13] << obj.delem;\ + s << obj.manip << obj.obj->names[14] << obj.delem;\ + s << obj.manip << obj.obj->names[15] << obj.delem;\ + s << obj.manip << obj.obj->names[16] << obj.delem;\ + s << obj.manip << obj.obj->names[17] << obj.delem;\ + s << obj.manip << obj.obj->names[18] << obj.delem;\ + s << obj.manip << obj.obj->names[19]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15 << obj.delem;\ + s << obj.obj->names[15] << obj.comp << obj.manip << obj.obj->I16 << obj.delem;\ + s << obj.obj->names[16] << obj.comp << obj.manip << obj.obj->I17 << obj.delem;\ + s << obj.obj->names[17] << obj.comp << obj.manip << obj.obj->I18 << obj.delem;\ + s << obj.obj->names[18] << obj.comp << obj.manip << obj.obj->I19 << obj.delem;\ + s << obj.obj->names[19] << obj.comp << obj.manip << obj.obj->I20; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I15;\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I16;\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I17;\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I18;\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I19;\ + before = true; \ + } \ + if ((*obj.include)[19]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I20;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[5];\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[6];\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[7];\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[8];\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[9];\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[10];\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[11];\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[12];\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[13];\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[14];\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[15];\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[16];\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[17];\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[18];\ + before = true; \ + } \ + if ((*obj.include)[19]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[19];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15;\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[15] << obj.comp << obj.manip << obj.obj->I16;\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[16] << obj.comp << obj.manip << obj.obj->I17;\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[17] << obj.comp << obj.manip << obj.obj->I18;\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[18] << obj.comp << obj.manip << obj.obj->I19;\ + before = true; \ + } \ + if ((*obj.include)[19]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[19] << obj.comp << obj.manip << obj.obj->I20;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + s->I16 = static_cast(row.at(O16));\ + s->I17 = static_cast(row.at(O17));\ + s->I18 = static_cast(row.at(O18));\ + s->I19 = static_cast(row.at(O19));\ + s->I20 = static_cast(row.at(O20));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, I17, I18, I19, I20, 0, 0, 0, 0, 0 ) + +#define sql_create_basic_20(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20) \ + sql_create_basic_c_order_20(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4, T6, I6, 5, T7, I7, 6, T8, I8, 7, T9, I9, 8, T10, I10, 9, T11, I11, 10, T12, I12, 11, T13, I13, 12, T14, I14, 13, T15, I15, 14, T16, I16, 15, T17, I17, 16, T18, I18, 17, T19, I19, 18, T20, I20, 19) + +#define sql_create_20(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20) \ + sql_create_complete_20(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4, T6, I6, #I6, 5, T7, I7, #I7, 6, T8, I8, #I8, 7, T9, I9, #I9, 8, T10, I10, #I10, 9, T11, I11, #I11, 10, T12, I12, #I12, 11, T13, I13, #I13, 12, T14, I14, #I14, 13, T15, I15, #I15, 14, T16, I16, #I16, 15, T17, I17, #I17, 16, T18, I18, #I18, 17, T19, I19, #I19, 18, T20, I20, #I20, 19) \ + +#define sql_create_c_order_20(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15, T16, I16, O16, T17, I17, O17, T18, I18, O18, T19, I19, O19, T20, I20, O20) \ + sql_create_complete_20(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5, T6, I6, #I6, O6, T7, I7, #I7, O7, T8, I8, #I8, O8, T9, I9, #I9, O9, T10, I10, #I10, O10, T11, I11, #I11, O11, T12, I12, #I12, O12, T13, I13, #I13, O13, T14, I14, #I14, O14, T15, I15, #I15, O15, T16, I16, #I16, O16, T17, I17, #I17, O17, T18, I18, #I18, O18, T19, I19, #I19, O19, T20, I20, #I20, O20) + +#define sql_create_c_names_20(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5, T6, I6, N6, T7, I7, N7, T8, I8, N8, T9, I9, N9, T10, I10, N10, T11, I11, N11, T12, I12, N12, T13, I13, N13, T14, I14, N14, T15, I15, N15, T16, I16, N16, T17, I17, N17, T18, I18, N18, T19, I19, N19, T20, I20, N20) \ + sql_create_complete_20(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4, T6, I6, N6, 5, T7, I7, N7, 6, T8, I8, N8, 7, T9, I9, N9, 8, T10, I10, N10, 9, T11, I11, N11, 10, T12, I12, N12, 11, T13, I13, N13, 12, T14, I14, N14, 13, T15, I15, N15, 14, T16, I16, N16, 15, T17, I17, N17, 16, T18, I18, N18, 17, T19, I19, N19, 18, T20, I20, N20, 19) + +// --------------------------------------------------- +// End Create 20 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 21 +// --------------------------------------------------- +#define sql_create_basic_c_order_21(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15, T16, I16, O16, T17, I17, O17, T18, I18, O18, T19, I19, O19, T20, I20, O20, T21, I21, O21)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15;\ + T16 I16;\ + T17 I17;\ + T18 I18;\ + T19 I19;\ + T20 I20;\ + T21 I21; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, 0, 0, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + s->I16 = static_cast(row.at(O16));\ + s->I17 = static_cast(row.at(O17));\ + s->I18 = static_cast(row.at(O18));\ + s->I19 = static_cast(row.at(O19));\ + s->I20 = static_cast(row.at(O20));\ + s->I21 = static_cast(row.at(O21)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, I17, I18, I19, I20, I21, 0, 0, 0, 0 ) + +#define sql_create_complete_21(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5, T6, I6, N6, O6, T7, I7, N7, O7, T8, I8, N8, O8, T9, I9, N9, O9, T10, I10, N10, O10, T11, I11, N11, O11, T12, I12, N12, O12, T13, I13, N13, O13, T14, I14, N14, O14, T15, I15, N15, O15, T16, I16, N16, O16, T17, I17, N17, O17, T18, I18, N18, O18, T19, I19, N19, O19, T20, I20, N20, O20, T21, I21, N21, O21) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5,\ + NAME##_##I6,\ + NAME##_##I7,\ + NAME##_##I8,\ + NAME##_##I9,\ + NAME##_##I10,\ + NAME##_##I11,\ + NAME##_##I12,\ + NAME##_##I13,\ + NAME##_##I14,\ + NAME##_##I15,\ + NAME##_##I16,\ + NAME##_##I17,\ + NAME##_##I18,\ + NAME##_##I19,\ + NAME##_##I20,\ + NAME##_##I21 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15;\ + T16 I16;\ + T17 I17;\ + T18 I18;\ + T19 I19;\ + T20 I20;\ + T21 I21; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, 0, 0, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, 0, 0, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 ,\ + N6 ,\ + N7 ,\ + N8 ,\ + N9 ,\ + N10 ,\ + N11 ,\ + N12 ,\ + N13 ,\ + N14 ,\ + N15 ,\ + N16 ,\ + N17 ,\ + N18 ,\ + N19 ,\ + N20 ,\ + N21 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(21, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + if (i20) (*include)[19]=true;\ + if (i21) (*include)[20]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(21, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + if (i20 == NAME##_NULL) return;\ + (*include)[i20]=true;\ + if (i21 == NAME##_NULL) return;\ + (*include)[i21]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(21, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + if (i20) (*include)[19]=true;\ + if (i21) (*include)[20]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(21, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + if (i20 == NAME##_NULL) return;\ + (*include)[i20]=true;\ + if (i21 == NAME##_NULL) return;\ + (*include)[i21]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(21, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + if (i20) (*include)[19]=true;\ + if (i21) (*include)[20]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(21, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + if (i20 == NAME##_NULL) return;\ + (*include)[i20]=true;\ + if (i21 == NAME##_NULL) return;\ + (*include)[i21]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.manip << obj.obj->I15 << obj.delem;\ + s << obj.manip << obj.obj->I16 << obj.delem;\ + s << obj.manip << obj.obj->I17 << obj.delem;\ + s << obj.manip << obj.obj->I18 << obj.delem;\ + s << obj.manip << obj.obj->I19 << obj.delem;\ + s << obj.manip << obj.obj->I20 << obj.delem;\ + s << obj.manip << obj.obj->I21; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4] << obj.delem;\ + s << obj.manip << obj.obj->names[5] << obj.delem;\ + s << obj.manip << obj.obj->names[6] << obj.delem;\ + s << obj.manip << obj.obj->names[7] << obj.delem;\ + s << obj.manip << obj.obj->names[8] << obj.delem;\ + s << obj.manip << obj.obj->names[9] << obj.delem;\ + s << obj.manip << obj.obj->names[10] << obj.delem;\ + s << obj.manip << obj.obj->names[11] << obj.delem;\ + s << obj.manip << obj.obj->names[12] << obj.delem;\ + s << obj.manip << obj.obj->names[13] << obj.delem;\ + s << obj.manip << obj.obj->names[14] << obj.delem;\ + s << obj.manip << obj.obj->names[15] << obj.delem;\ + s << obj.manip << obj.obj->names[16] << obj.delem;\ + s << obj.manip << obj.obj->names[17] << obj.delem;\ + s << obj.manip << obj.obj->names[18] << obj.delem;\ + s << obj.manip << obj.obj->names[19] << obj.delem;\ + s << obj.manip << obj.obj->names[20]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15 << obj.delem;\ + s << obj.obj->names[15] << obj.comp << obj.manip << obj.obj->I16 << obj.delem;\ + s << obj.obj->names[16] << obj.comp << obj.manip << obj.obj->I17 << obj.delem;\ + s << obj.obj->names[17] << obj.comp << obj.manip << obj.obj->I18 << obj.delem;\ + s << obj.obj->names[18] << obj.comp << obj.manip << obj.obj->I19 << obj.delem;\ + s << obj.obj->names[19] << obj.comp << obj.manip << obj.obj->I20 << obj.delem;\ + s << obj.obj->names[20] << obj.comp << obj.manip << obj.obj->I21; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I15;\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I16;\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I17;\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I18;\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I19;\ + before = true; \ + } \ + if ((*obj.include)[19]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I20;\ + before = true; \ + } \ + if ((*obj.include)[20]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I21;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[5];\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[6];\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[7];\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[8];\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[9];\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[10];\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[11];\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[12];\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[13];\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[14];\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[15];\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[16];\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[17];\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[18];\ + before = true; \ + } \ + if ((*obj.include)[19]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[19];\ + before = true; \ + } \ + if ((*obj.include)[20]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[20];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15;\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[15] << obj.comp << obj.manip << obj.obj->I16;\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[16] << obj.comp << obj.manip << obj.obj->I17;\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[17] << obj.comp << obj.manip << obj.obj->I18;\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[18] << obj.comp << obj.manip << obj.obj->I19;\ + before = true; \ + } \ + if ((*obj.include)[19]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[19] << obj.comp << obj.manip << obj.obj->I20;\ + before = true; \ + } \ + if ((*obj.include)[20]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[20] << obj.comp << obj.manip << obj.obj->I21;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + s->I16 = static_cast(row.at(O16));\ + s->I17 = static_cast(row.at(O17));\ + s->I18 = static_cast(row.at(O18));\ + s->I19 = static_cast(row.at(O19));\ + s->I20 = static_cast(row.at(O20));\ + s->I21 = static_cast(row.at(O21));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, I17, I18, I19, I20, I21, 0, 0, 0, 0 ) + +#define sql_create_basic_21(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21) \ + sql_create_basic_c_order_21(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4, T6, I6, 5, T7, I7, 6, T8, I8, 7, T9, I9, 8, T10, I10, 9, T11, I11, 10, T12, I12, 11, T13, I13, 12, T14, I14, 13, T15, I15, 14, T16, I16, 15, T17, I17, 16, T18, I18, 17, T19, I19, 18, T20, I20, 19, T21, I21, 20) + +#define sql_create_21(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21) \ + sql_create_complete_21(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4, T6, I6, #I6, 5, T7, I7, #I7, 6, T8, I8, #I8, 7, T9, I9, #I9, 8, T10, I10, #I10, 9, T11, I11, #I11, 10, T12, I12, #I12, 11, T13, I13, #I13, 12, T14, I14, #I14, 13, T15, I15, #I15, 14, T16, I16, #I16, 15, T17, I17, #I17, 16, T18, I18, #I18, 17, T19, I19, #I19, 18, T20, I20, #I20, 19, T21, I21, #I21, 20) \ + +#define sql_create_c_order_21(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15, T16, I16, O16, T17, I17, O17, T18, I18, O18, T19, I19, O19, T20, I20, O20, T21, I21, O21) \ + sql_create_complete_21(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5, T6, I6, #I6, O6, T7, I7, #I7, O7, T8, I8, #I8, O8, T9, I9, #I9, O9, T10, I10, #I10, O10, T11, I11, #I11, O11, T12, I12, #I12, O12, T13, I13, #I13, O13, T14, I14, #I14, O14, T15, I15, #I15, O15, T16, I16, #I16, O16, T17, I17, #I17, O17, T18, I18, #I18, O18, T19, I19, #I19, O19, T20, I20, #I20, O20, T21, I21, #I21, O21) + +#define sql_create_c_names_21(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5, T6, I6, N6, T7, I7, N7, T8, I8, N8, T9, I9, N9, T10, I10, N10, T11, I11, N11, T12, I12, N12, T13, I13, N13, T14, I14, N14, T15, I15, N15, T16, I16, N16, T17, I17, N17, T18, I18, N18, T19, I19, N19, T20, I20, N20, T21, I21, N21) \ + sql_create_complete_21(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4, T6, I6, N6, 5, T7, I7, N7, 6, T8, I8, N8, 7, T9, I9, N9, 8, T10, I10, N10, 9, T11, I11, N11, 10, T12, I12, N12, 11, T13, I13, N13, 12, T14, I14, N14, 13, T15, I15, N15, 14, T16, I16, N16, 15, T17, I17, N17, 16, T18, I18, N18, 17, T19, I19, N19, 18, T20, I20, N20, 19, T21, I21, N21, 20) + +// --------------------------------------------------- +// End Create 21 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 22 +// --------------------------------------------------- +#define sql_create_basic_c_order_22(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15, T16, I16, O16, T17, I17, O17, T18, I18, O18, T19, I19, O19, T20, I20, O20, T21, I21, O21, T22, I22, O22)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15;\ + T16 I16;\ + T17 I17;\ + T18 I18;\ + T19 I19;\ + T20 I20;\ + T21 I21;\ + T22 I22; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, T22, I22, 0, 0, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + s->I16 = static_cast(row.at(O16));\ + s->I17 = static_cast(row.at(O17));\ + s->I18 = static_cast(row.at(O18));\ + s->I19 = static_cast(row.at(O19));\ + s->I20 = static_cast(row.at(O20));\ + s->I21 = static_cast(row.at(O21));\ + s->I22 = static_cast(row.at(O22)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, I17, I18, I19, I20, I21, I22, 0, 0, 0 ) + +#define sql_create_complete_22(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5, T6, I6, N6, O6, T7, I7, N7, O7, T8, I8, N8, O8, T9, I9, N9, O9, T10, I10, N10, O10, T11, I11, N11, O11, T12, I12, N12, O12, T13, I13, N13, O13, T14, I14, N14, O14, T15, I15, N15, O15, T16, I16, N16, O16, T17, I17, N17, O17, T18, I18, N18, O18, T19, I19, N19, O19, T20, I20, N20, O20, T21, I21, N21, O21, T22, I22, N22, O22) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5,\ + NAME##_##I6,\ + NAME##_##I7,\ + NAME##_##I8,\ + NAME##_##I9,\ + NAME##_##I10,\ + NAME##_##I11,\ + NAME##_##I12,\ + NAME##_##I13,\ + NAME##_##I14,\ + NAME##_##I15,\ + NAME##_##I16,\ + NAME##_##I17,\ + NAME##_##I18,\ + NAME##_##I19,\ + NAME##_##I20,\ + NAME##_##I21,\ + NAME##_##I22 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15;\ + T16 I16;\ + T17 I17;\ + T18 I18;\ + T19 I19;\ + T20 I20;\ + T21 I21;\ + T22 I22; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, T22, I22, 0, 0, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, T22, I22, 0, 0, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 ,\ + N6 ,\ + N7 ,\ + N8 ,\ + N9 ,\ + N10 ,\ + N11 ,\ + N12 ,\ + N13 ,\ + N14 ,\ + N15 ,\ + N16 ,\ + N17 ,\ + N18 ,\ + N19 ,\ + N20 ,\ + N21 ,\ + N22 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(22, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + if (i20) (*include)[19]=true;\ + if (i21) (*include)[20]=true;\ + if (i22) (*include)[21]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(22, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + if (i20 == NAME##_NULL) return;\ + (*include)[i20]=true;\ + if (i21 == NAME##_NULL) return;\ + (*include)[i21]=true;\ + if (i22 == NAME##_NULL) return;\ + (*include)[i22]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(22, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + if (i20) (*include)[19]=true;\ + if (i21) (*include)[20]=true;\ + if (i22) (*include)[21]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(22, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + if (i20 == NAME##_NULL) return;\ + (*include)[i20]=true;\ + if (i21 == NAME##_NULL) return;\ + (*include)[i21]=true;\ + if (i22 == NAME##_NULL) return;\ + (*include)[i22]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(22, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + if (i20) (*include)[19]=true;\ + if (i21) (*include)[20]=true;\ + if (i22) (*include)[21]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(22, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + if (i20 == NAME##_NULL) return;\ + (*include)[i20]=true;\ + if (i21 == NAME##_NULL) return;\ + (*include)[i21]=true;\ + if (i22 == NAME##_NULL) return;\ + (*include)[i22]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.manip << obj.obj->I15 << obj.delem;\ + s << obj.manip << obj.obj->I16 << obj.delem;\ + s << obj.manip << obj.obj->I17 << obj.delem;\ + s << obj.manip << obj.obj->I18 << obj.delem;\ + s << obj.manip << obj.obj->I19 << obj.delem;\ + s << obj.manip << obj.obj->I20 << obj.delem;\ + s << obj.manip << obj.obj->I21 << obj.delem;\ + s << obj.manip << obj.obj->I22; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4] << obj.delem;\ + s << obj.manip << obj.obj->names[5] << obj.delem;\ + s << obj.manip << obj.obj->names[6] << obj.delem;\ + s << obj.manip << obj.obj->names[7] << obj.delem;\ + s << obj.manip << obj.obj->names[8] << obj.delem;\ + s << obj.manip << obj.obj->names[9] << obj.delem;\ + s << obj.manip << obj.obj->names[10] << obj.delem;\ + s << obj.manip << obj.obj->names[11] << obj.delem;\ + s << obj.manip << obj.obj->names[12] << obj.delem;\ + s << obj.manip << obj.obj->names[13] << obj.delem;\ + s << obj.manip << obj.obj->names[14] << obj.delem;\ + s << obj.manip << obj.obj->names[15] << obj.delem;\ + s << obj.manip << obj.obj->names[16] << obj.delem;\ + s << obj.manip << obj.obj->names[17] << obj.delem;\ + s << obj.manip << obj.obj->names[18] << obj.delem;\ + s << obj.manip << obj.obj->names[19] << obj.delem;\ + s << obj.manip << obj.obj->names[20] << obj.delem;\ + s << obj.manip << obj.obj->names[21]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15 << obj.delem;\ + s << obj.obj->names[15] << obj.comp << obj.manip << obj.obj->I16 << obj.delem;\ + s << obj.obj->names[16] << obj.comp << obj.manip << obj.obj->I17 << obj.delem;\ + s << obj.obj->names[17] << obj.comp << obj.manip << obj.obj->I18 << obj.delem;\ + s << obj.obj->names[18] << obj.comp << obj.manip << obj.obj->I19 << obj.delem;\ + s << obj.obj->names[19] << obj.comp << obj.manip << obj.obj->I20 << obj.delem;\ + s << obj.obj->names[20] << obj.comp << obj.manip << obj.obj->I21 << obj.delem;\ + s << obj.obj->names[21] << obj.comp << obj.manip << obj.obj->I22; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I15;\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I16;\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I17;\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I18;\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I19;\ + before = true; \ + } \ + if ((*obj.include)[19]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I20;\ + before = true; \ + } \ + if ((*obj.include)[20]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I21;\ + before = true; \ + } \ + if ((*obj.include)[21]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I22;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[5];\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[6];\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[7];\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[8];\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[9];\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[10];\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[11];\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[12];\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[13];\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[14];\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[15];\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[16];\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[17];\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[18];\ + before = true; \ + } \ + if ((*obj.include)[19]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[19];\ + before = true; \ + } \ + if ((*obj.include)[20]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[20];\ + before = true; \ + } \ + if ((*obj.include)[21]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[21];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15;\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[15] << obj.comp << obj.manip << obj.obj->I16;\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[16] << obj.comp << obj.manip << obj.obj->I17;\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[17] << obj.comp << obj.manip << obj.obj->I18;\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[18] << obj.comp << obj.manip << obj.obj->I19;\ + before = true; \ + } \ + if ((*obj.include)[19]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[19] << obj.comp << obj.manip << obj.obj->I20;\ + before = true; \ + } \ + if ((*obj.include)[20]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[20] << obj.comp << obj.manip << obj.obj->I21;\ + before = true; \ + } \ + if ((*obj.include)[21]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[21] << obj.comp << obj.manip << obj.obj->I22;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + s->I16 = static_cast(row.at(O16));\ + s->I17 = static_cast(row.at(O17));\ + s->I18 = static_cast(row.at(O18));\ + s->I19 = static_cast(row.at(O19));\ + s->I20 = static_cast(row.at(O20));\ + s->I21 = static_cast(row.at(O21));\ + s->I22 = static_cast(row.at(O22));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, I17, I18, I19, I20, I21, I22, 0, 0, 0 ) + +#define sql_create_basic_22(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, T22, I22) \ + sql_create_basic_c_order_22(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4, T6, I6, 5, T7, I7, 6, T8, I8, 7, T9, I9, 8, T10, I10, 9, T11, I11, 10, T12, I12, 11, T13, I13, 12, T14, I14, 13, T15, I15, 14, T16, I16, 15, T17, I17, 16, T18, I18, 17, T19, I19, 18, T20, I20, 19, T21, I21, 20, T22, I22, 21) + +#define sql_create_22(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, T22, I22) \ + sql_create_complete_22(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4, T6, I6, #I6, 5, T7, I7, #I7, 6, T8, I8, #I8, 7, T9, I9, #I9, 8, T10, I10, #I10, 9, T11, I11, #I11, 10, T12, I12, #I12, 11, T13, I13, #I13, 12, T14, I14, #I14, 13, T15, I15, #I15, 14, T16, I16, #I16, 15, T17, I17, #I17, 16, T18, I18, #I18, 17, T19, I19, #I19, 18, T20, I20, #I20, 19, T21, I21, #I21, 20, T22, I22, #I22, 21) \ + +#define sql_create_c_order_22(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15, T16, I16, O16, T17, I17, O17, T18, I18, O18, T19, I19, O19, T20, I20, O20, T21, I21, O21, T22, I22, O22) \ + sql_create_complete_22(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5, T6, I6, #I6, O6, T7, I7, #I7, O7, T8, I8, #I8, O8, T9, I9, #I9, O9, T10, I10, #I10, O10, T11, I11, #I11, O11, T12, I12, #I12, O12, T13, I13, #I13, O13, T14, I14, #I14, O14, T15, I15, #I15, O15, T16, I16, #I16, O16, T17, I17, #I17, O17, T18, I18, #I18, O18, T19, I19, #I19, O19, T20, I20, #I20, O20, T21, I21, #I21, O21, T22, I22, #I22, O22) + +#define sql_create_c_names_22(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5, T6, I6, N6, T7, I7, N7, T8, I8, N8, T9, I9, N9, T10, I10, N10, T11, I11, N11, T12, I12, N12, T13, I13, N13, T14, I14, N14, T15, I15, N15, T16, I16, N16, T17, I17, N17, T18, I18, N18, T19, I19, N19, T20, I20, N20, T21, I21, N21, T22, I22, N22) \ + sql_create_complete_22(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4, T6, I6, N6, 5, T7, I7, N7, 6, T8, I8, N8, 7, T9, I9, N9, 8, T10, I10, N10, 9, T11, I11, N11, 10, T12, I12, N12, 11, T13, I13, N13, 12, T14, I14, N14, 13, T15, I15, N15, 14, T16, I16, N16, 15, T17, I17, N17, 16, T18, I18, N18, 17, T19, I19, N19, 18, T20, I20, N20, 19, T21, I21, N21, 20, T22, I22, N22, 21) + +// --------------------------------------------------- +// End Create 22 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 23 +// --------------------------------------------------- +#define sql_create_basic_c_order_23(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15, T16, I16, O16, T17, I17, O17, T18, I18, O18, T19, I19, O19, T20, I20, O20, T21, I21, O21, T22, I22, O22, T23, I23, O23)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15;\ + T16 I16;\ + T17 I17;\ + T18 I18;\ + T19 I19;\ + T20 I20;\ + T21 I21;\ + T22 I22;\ + T23 I23; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, T22, I22, T23, I23, 0, 0, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + s->I16 = static_cast(row.at(O16));\ + s->I17 = static_cast(row.at(O17));\ + s->I18 = static_cast(row.at(O18));\ + s->I19 = static_cast(row.at(O19));\ + s->I20 = static_cast(row.at(O20));\ + s->I21 = static_cast(row.at(O21));\ + s->I22 = static_cast(row.at(O22));\ + s->I23 = static_cast(row.at(O23)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, I17, I18, I19, I20, I21, I22, I23, 0, 0 ) + +#define sql_create_complete_23(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5, T6, I6, N6, O6, T7, I7, N7, O7, T8, I8, N8, O8, T9, I9, N9, O9, T10, I10, N10, O10, T11, I11, N11, O11, T12, I12, N12, O12, T13, I13, N13, O13, T14, I14, N14, O14, T15, I15, N15, O15, T16, I16, N16, O16, T17, I17, N17, O17, T18, I18, N18, O18, T19, I19, N19, O19, T20, I20, N20, O20, T21, I21, N21, O21, T22, I22, N22, O22, T23, I23, N23, O23) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5,\ + NAME##_##I6,\ + NAME##_##I7,\ + NAME##_##I8,\ + NAME##_##I9,\ + NAME##_##I10,\ + NAME##_##I11,\ + NAME##_##I12,\ + NAME##_##I13,\ + NAME##_##I14,\ + NAME##_##I15,\ + NAME##_##I16,\ + NAME##_##I17,\ + NAME##_##I18,\ + NAME##_##I19,\ + NAME##_##I20,\ + NAME##_##I21,\ + NAME##_##I22,\ + NAME##_##I23 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15;\ + T16 I16;\ + T17 I17;\ + T18 I18;\ + T19 I19;\ + T20 I20;\ + T21 I21;\ + T22 I22;\ + T23 I23; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, T22, I22, T23, I23, 0, 0, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, T22, I22, T23, I23, 0, 0, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 ,\ + N6 ,\ + N7 ,\ + N8 ,\ + N9 ,\ + N10 ,\ + N11 ,\ + N12 ,\ + N13 ,\ + N14 ,\ + N15 ,\ + N16 ,\ + N17 ,\ + N18 ,\ + N19 ,\ + N20 ,\ + N21 ,\ + N22 ,\ + N23 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(23, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + if (i20) (*include)[19]=true;\ + if (i21) (*include)[20]=true;\ + if (i22) (*include)[21]=true;\ + if (i23) (*include)[22]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(23, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + if (i20 == NAME##_NULL) return;\ + (*include)[i20]=true;\ + if (i21 == NAME##_NULL) return;\ + (*include)[i21]=true;\ + if (i22 == NAME##_NULL) return;\ + (*include)[i22]=true;\ + if (i23 == NAME##_NULL) return;\ + (*include)[i23]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(23, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + if (i20) (*include)[19]=true;\ + if (i21) (*include)[20]=true;\ + if (i22) (*include)[21]=true;\ + if (i23) (*include)[22]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(23, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + if (i20 == NAME##_NULL) return;\ + (*include)[i20]=true;\ + if (i21 == NAME##_NULL) return;\ + (*include)[i21]=true;\ + if (i22 == NAME##_NULL) return;\ + (*include)[i22]=true;\ + if (i23 == NAME##_NULL) return;\ + (*include)[i23]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(23, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + if (i20) (*include)[19]=true;\ + if (i21) (*include)[20]=true;\ + if (i22) (*include)[21]=true;\ + if (i23) (*include)[22]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(23, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + if (i20 == NAME##_NULL) return;\ + (*include)[i20]=true;\ + if (i21 == NAME##_NULL) return;\ + (*include)[i21]=true;\ + if (i22 == NAME##_NULL) return;\ + (*include)[i22]=true;\ + if (i23 == NAME##_NULL) return;\ + (*include)[i23]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.manip << obj.obj->I15 << obj.delem;\ + s << obj.manip << obj.obj->I16 << obj.delem;\ + s << obj.manip << obj.obj->I17 << obj.delem;\ + s << obj.manip << obj.obj->I18 << obj.delem;\ + s << obj.manip << obj.obj->I19 << obj.delem;\ + s << obj.manip << obj.obj->I20 << obj.delem;\ + s << obj.manip << obj.obj->I21 << obj.delem;\ + s << obj.manip << obj.obj->I22 << obj.delem;\ + s << obj.manip << obj.obj->I23; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4] << obj.delem;\ + s << obj.manip << obj.obj->names[5] << obj.delem;\ + s << obj.manip << obj.obj->names[6] << obj.delem;\ + s << obj.manip << obj.obj->names[7] << obj.delem;\ + s << obj.manip << obj.obj->names[8] << obj.delem;\ + s << obj.manip << obj.obj->names[9] << obj.delem;\ + s << obj.manip << obj.obj->names[10] << obj.delem;\ + s << obj.manip << obj.obj->names[11] << obj.delem;\ + s << obj.manip << obj.obj->names[12] << obj.delem;\ + s << obj.manip << obj.obj->names[13] << obj.delem;\ + s << obj.manip << obj.obj->names[14] << obj.delem;\ + s << obj.manip << obj.obj->names[15] << obj.delem;\ + s << obj.manip << obj.obj->names[16] << obj.delem;\ + s << obj.manip << obj.obj->names[17] << obj.delem;\ + s << obj.manip << obj.obj->names[18] << obj.delem;\ + s << obj.manip << obj.obj->names[19] << obj.delem;\ + s << obj.manip << obj.obj->names[20] << obj.delem;\ + s << obj.manip << obj.obj->names[21] << obj.delem;\ + s << obj.manip << obj.obj->names[22]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15 << obj.delem;\ + s << obj.obj->names[15] << obj.comp << obj.manip << obj.obj->I16 << obj.delem;\ + s << obj.obj->names[16] << obj.comp << obj.manip << obj.obj->I17 << obj.delem;\ + s << obj.obj->names[17] << obj.comp << obj.manip << obj.obj->I18 << obj.delem;\ + s << obj.obj->names[18] << obj.comp << obj.manip << obj.obj->I19 << obj.delem;\ + s << obj.obj->names[19] << obj.comp << obj.manip << obj.obj->I20 << obj.delem;\ + s << obj.obj->names[20] << obj.comp << obj.manip << obj.obj->I21 << obj.delem;\ + s << obj.obj->names[21] << obj.comp << obj.manip << obj.obj->I22 << obj.delem;\ + s << obj.obj->names[22] << obj.comp << obj.manip << obj.obj->I23; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I15;\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I16;\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I17;\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I18;\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I19;\ + before = true; \ + } \ + if ((*obj.include)[19]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I20;\ + before = true; \ + } \ + if ((*obj.include)[20]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I21;\ + before = true; \ + } \ + if ((*obj.include)[21]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I22;\ + before = true; \ + } \ + if ((*obj.include)[22]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I23;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[5];\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[6];\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[7];\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[8];\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[9];\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[10];\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[11];\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[12];\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[13];\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[14];\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[15];\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[16];\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[17];\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[18];\ + before = true; \ + } \ + if ((*obj.include)[19]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[19];\ + before = true; \ + } \ + if ((*obj.include)[20]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[20];\ + before = true; \ + } \ + if ((*obj.include)[21]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[21];\ + before = true; \ + } \ + if ((*obj.include)[22]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[22];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15;\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[15] << obj.comp << obj.manip << obj.obj->I16;\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[16] << obj.comp << obj.manip << obj.obj->I17;\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[17] << obj.comp << obj.manip << obj.obj->I18;\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[18] << obj.comp << obj.manip << obj.obj->I19;\ + before = true; \ + } \ + if ((*obj.include)[19]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[19] << obj.comp << obj.manip << obj.obj->I20;\ + before = true; \ + } \ + if ((*obj.include)[20]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[20] << obj.comp << obj.manip << obj.obj->I21;\ + before = true; \ + } \ + if ((*obj.include)[21]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[21] << obj.comp << obj.manip << obj.obj->I22;\ + before = true; \ + } \ + if ((*obj.include)[22]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[22] << obj.comp << obj.manip << obj.obj->I23;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + s->I16 = static_cast(row.at(O16));\ + s->I17 = static_cast(row.at(O17));\ + s->I18 = static_cast(row.at(O18));\ + s->I19 = static_cast(row.at(O19));\ + s->I20 = static_cast(row.at(O20));\ + s->I21 = static_cast(row.at(O21));\ + s->I22 = static_cast(row.at(O22));\ + s->I23 = static_cast(row.at(O23));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, I17, I18, I19, I20, I21, I22, I23, 0, 0 ) + +#define sql_create_basic_23(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, T22, I22, T23, I23) \ + sql_create_basic_c_order_23(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4, T6, I6, 5, T7, I7, 6, T8, I8, 7, T9, I9, 8, T10, I10, 9, T11, I11, 10, T12, I12, 11, T13, I13, 12, T14, I14, 13, T15, I15, 14, T16, I16, 15, T17, I17, 16, T18, I18, 17, T19, I19, 18, T20, I20, 19, T21, I21, 20, T22, I22, 21, T23, I23, 22) + +#define sql_create_23(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, T22, I22, T23, I23) \ + sql_create_complete_23(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4, T6, I6, #I6, 5, T7, I7, #I7, 6, T8, I8, #I8, 7, T9, I9, #I9, 8, T10, I10, #I10, 9, T11, I11, #I11, 10, T12, I12, #I12, 11, T13, I13, #I13, 12, T14, I14, #I14, 13, T15, I15, #I15, 14, T16, I16, #I16, 15, T17, I17, #I17, 16, T18, I18, #I18, 17, T19, I19, #I19, 18, T20, I20, #I20, 19, T21, I21, #I21, 20, T22, I22, #I22, 21, T23, I23, #I23, 22) \ + +#define sql_create_c_order_23(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15, T16, I16, O16, T17, I17, O17, T18, I18, O18, T19, I19, O19, T20, I20, O20, T21, I21, O21, T22, I22, O22, T23, I23, O23) \ + sql_create_complete_23(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5, T6, I6, #I6, O6, T7, I7, #I7, O7, T8, I8, #I8, O8, T9, I9, #I9, O9, T10, I10, #I10, O10, T11, I11, #I11, O11, T12, I12, #I12, O12, T13, I13, #I13, O13, T14, I14, #I14, O14, T15, I15, #I15, O15, T16, I16, #I16, O16, T17, I17, #I17, O17, T18, I18, #I18, O18, T19, I19, #I19, O19, T20, I20, #I20, O20, T21, I21, #I21, O21, T22, I22, #I22, O22, T23, I23, #I23, O23) + +#define sql_create_c_names_23(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5, T6, I6, N6, T7, I7, N7, T8, I8, N8, T9, I9, N9, T10, I10, N10, T11, I11, N11, T12, I12, N12, T13, I13, N13, T14, I14, N14, T15, I15, N15, T16, I16, N16, T17, I17, N17, T18, I18, N18, T19, I19, N19, T20, I20, N20, T21, I21, N21, T22, I22, N22, T23, I23, N23) \ + sql_create_complete_23(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4, T6, I6, N6, 5, T7, I7, N7, 6, T8, I8, N8, 7, T9, I9, N9, 8, T10, I10, N10, 9, T11, I11, N11, 10, T12, I12, N12, 11, T13, I13, N13, 12, T14, I14, N14, 13, T15, I15, N15, 14, T16, I16, N16, 15, T17, I17, N17, 16, T18, I18, N18, 17, T19, I19, N19, 18, T20, I20, N20, 19, T21, I21, N21, 20, T22, I22, N22, 21, T23, I23, N23, 22) + +// --------------------------------------------------- +// End Create 23 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 24 +// --------------------------------------------------- +#define sql_create_basic_c_order_24(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15, T16, I16, O16, T17, I17, O17, T18, I18, O18, T19, I19, O19, T20, I20, O20, T21, I21, O21, T22, I22, O22, T23, I23, O23, T24, I24, O24)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15;\ + T16 I16;\ + T17 I17;\ + T18 I18;\ + T19 I19;\ + T20 I20;\ + T21 I21;\ + T22 I22;\ + T23 I23;\ + T24 I24; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, T22, I22, T23, I23, T24, I24, 0, 0)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + s->I16 = static_cast(row.at(O16));\ + s->I17 = static_cast(row.at(O17));\ + s->I18 = static_cast(row.at(O18));\ + s->I19 = static_cast(row.at(O19));\ + s->I20 = static_cast(row.at(O20));\ + s->I21 = static_cast(row.at(O21));\ + s->I22 = static_cast(row.at(O22));\ + s->I23 = static_cast(row.at(O23));\ + s->I24 = static_cast(row.at(O24)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, I17, I18, I19, I20, I21, I22, I23, I24, 0 ) + +#define sql_create_complete_24(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5, T6, I6, N6, O6, T7, I7, N7, O7, T8, I8, N8, O8, T9, I9, N9, O9, T10, I10, N10, O10, T11, I11, N11, O11, T12, I12, N12, O12, T13, I13, N13, O13, T14, I14, N14, O14, T15, I15, N15, O15, T16, I16, N16, O16, T17, I17, N17, O17, T18, I18, N18, O18, T19, I19, N19, O19, T20, I20, N20, O20, T21, I21, N21, O21, T22, I22, N22, O22, T23, I23, N23, O23, T24, I24, N24, O24) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5,\ + NAME##_##I6,\ + NAME##_##I7,\ + NAME##_##I8,\ + NAME##_##I9,\ + NAME##_##I10,\ + NAME##_##I11,\ + NAME##_##I12,\ + NAME##_##I13,\ + NAME##_##I14,\ + NAME##_##I15,\ + NAME##_##I16,\ + NAME##_##I17,\ + NAME##_##I18,\ + NAME##_##I19,\ + NAME##_##I20,\ + NAME##_##I21,\ + NAME##_##I22,\ + NAME##_##I23,\ + NAME##_##I24 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23, bool i24);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23, NAME##_enum i24); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23, bool i24); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23, NAME##_enum i24); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23, bool i24); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23, NAME##_enum i24); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15;\ + T16 I16;\ + T17 I17;\ + T18 I18;\ + T19 I19;\ + T20 I20;\ + T21 I21;\ + T22 I22;\ + T23 I23;\ + T24 I24; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, T22, I22, T23, I23, T24, I24, 0, 0)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, T22, I22, T23, I23, T24, I24, 0, 0)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false, bool i24 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL, NAME##_enum i24 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false, bool i24 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL, NAME##_enum i24 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false, bool i24 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL, NAME##_enum i24 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false, bool i24 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL, NAME##_enum i24 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false, bool i24 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL, NAME##_enum i24 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false, bool i24 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL, NAME##_enum i24 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false, bool i24 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL, NAME##_enum i24 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false, bool i24 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL, NAME##_enum i24 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false, bool i24 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL, NAME##_enum i24 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false, bool i24 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL, NAME##_enum i24 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 ,\ + N6 ,\ + N7 ,\ + N8 ,\ + N9 ,\ + N10 ,\ + N11 ,\ + N12 ,\ + N13 ,\ + N14 ,\ + N15 ,\ + N16 ,\ + N17 ,\ + N18 ,\ + N19 ,\ + N20 ,\ + N21 ,\ + N22 ,\ + N23 ,\ + N24 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23, bool i24) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(24, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + if (i20) (*include)[19]=true;\ + if (i21) (*include)[20]=true;\ + if (i22) (*include)[21]=true;\ + if (i23) (*include)[22]=true;\ + if (i24) (*include)[23]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23, NAME##_enum i24) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(24, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + if (i20 == NAME##_NULL) return;\ + (*include)[i20]=true;\ + if (i21 == NAME##_NULL) return;\ + (*include)[i21]=true;\ + if (i22 == NAME##_NULL) return;\ + (*include)[i22]=true;\ + if (i23 == NAME##_NULL) return;\ + (*include)[i23]=true;\ + if (i24 == NAME##_NULL) return;\ + (*include)[i24]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23, bool i24) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(24, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + if (i20) (*include)[19]=true;\ + if (i21) (*include)[20]=true;\ + if (i22) (*include)[21]=true;\ + if (i23) (*include)[22]=true;\ + if (i24) (*include)[23]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23, NAME##_enum i24) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(24, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + if (i20 == NAME##_NULL) return;\ + (*include)[i20]=true;\ + if (i21 == NAME##_NULL) return;\ + (*include)[i21]=true;\ + if (i22 == NAME##_NULL) return;\ + (*include)[i22]=true;\ + if (i23 == NAME##_NULL) return;\ + (*include)[i23]=true;\ + if (i24 == NAME##_NULL) return;\ + (*include)[i24]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23, bool i24) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(24, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + if (i20) (*include)[19]=true;\ + if (i21) (*include)[20]=true;\ + if (i22) (*include)[21]=true;\ + if (i23) (*include)[22]=true;\ + if (i24) (*include)[23]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23, NAME##_enum i24) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(24, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + if (i20 == NAME##_NULL) return;\ + (*include)[i20]=true;\ + if (i21 == NAME##_NULL) return;\ + (*include)[i21]=true;\ + if (i22 == NAME##_NULL) return;\ + (*include)[i22]=true;\ + if (i23 == NAME##_NULL) return;\ + (*include)[i23]=true;\ + if (i24 == NAME##_NULL) return;\ + (*include)[i24]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.manip << obj.obj->I15 << obj.delem;\ + s << obj.manip << obj.obj->I16 << obj.delem;\ + s << obj.manip << obj.obj->I17 << obj.delem;\ + s << obj.manip << obj.obj->I18 << obj.delem;\ + s << obj.manip << obj.obj->I19 << obj.delem;\ + s << obj.manip << obj.obj->I20 << obj.delem;\ + s << obj.manip << obj.obj->I21 << obj.delem;\ + s << obj.manip << obj.obj->I22 << obj.delem;\ + s << obj.manip << obj.obj->I23 << obj.delem;\ + s << obj.manip << obj.obj->I24; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4] << obj.delem;\ + s << obj.manip << obj.obj->names[5] << obj.delem;\ + s << obj.manip << obj.obj->names[6] << obj.delem;\ + s << obj.manip << obj.obj->names[7] << obj.delem;\ + s << obj.manip << obj.obj->names[8] << obj.delem;\ + s << obj.manip << obj.obj->names[9] << obj.delem;\ + s << obj.manip << obj.obj->names[10] << obj.delem;\ + s << obj.manip << obj.obj->names[11] << obj.delem;\ + s << obj.manip << obj.obj->names[12] << obj.delem;\ + s << obj.manip << obj.obj->names[13] << obj.delem;\ + s << obj.manip << obj.obj->names[14] << obj.delem;\ + s << obj.manip << obj.obj->names[15] << obj.delem;\ + s << obj.manip << obj.obj->names[16] << obj.delem;\ + s << obj.manip << obj.obj->names[17] << obj.delem;\ + s << obj.manip << obj.obj->names[18] << obj.delem;\ + s << obj.manip << obj.obj->names[19] << obj.delem;\ + s << obj.manip << obj.obj->names[20] << obj.delem;\ + s << obj.manip << obj.obj->names[21] << obj.delem;\ + s << obj.manip << obj.obj->names[22] << obj.delem;\ + s << obj.manip << obj.obj->names[23]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15 << obj.delem;\ + s << obj.obj->names[15] << obj.comp << obj.manip << obj.obj->I16 << obj.delem;\ + s << obj.obj->names[16] << obj.comp << obj.manip << obj.obj->I17 << obj.delem;\ + s << obj.obj->names[17] << obj.comp << obj.manip << obj.obj->I18 << obj.delem;\ + s << obj.obj->names[18] << obj.comp << obj.manip << obj.obj->I19 << obj.delem;\ + s << obj.obj->names[19] << obj.comp << obj.manip << obj.obj->I20 << obj.delem;\ + s << obj.obj->names[20] << obj.comp << obj.manip << obj.obj->I21 << obj.delem;\ + s << obj.obj->names[21] << obj.comp << obj.manip << obj.obj->I22 << obj.delem;\ + s << obj.obj->names[22] << obj.comp << obj.manip << obj.obj->I23 << obj.delem;\ + s << obj.obj->names[23] << obj.comp << obj.manip << obj.obj->I24; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I15;\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I16;\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I17;\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I18;\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I19;\ + before = true; \ + } \ + if ((*obj.include)[19]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I20;\ + before = true; \ + } \ + if ((*obj.include)[20]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I21;\ + before = true; \ + } \ + if ((*obj.include)[21]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I22;\ + before = true; \ + } \ + if ((*obj.include)[22]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I23;\ + before = true; \ + } \ + if ((*obj.include)[23]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I24;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[5];\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[6];\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[7];\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[8];\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[9];\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[10];\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[11];\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[12];\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[13];\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[14];\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[15];\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[16];\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[17];\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[18];\ + before = true; \ + } \ + if ((*obj.include)[19]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[19];\ + before = true; \ + } \ + if ((*obj.include)[20]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[20];\ + before = true; \ + } \ + if ((*obj.include)[21]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[21];\ + before = true; \ + } \ + if ((*obj.include)[22]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[22];\ + before = true; \ + } \ + if ((*obj.include)[23]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[23];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15;\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[15] << obj.comp << obj.manip << obj.obj->I16;\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[16] << obj.comp << obj.manip << obj.obj->I17;\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[17] << obj.comp << obj.manip << obj.obj->I18;\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[18] << obj.comp << obj.manip << obj.obj->I19;\ + before = true; \ + } \ + if ((*obj.include)[19]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[19] << obj.comp << obj.manip << obj.obj->I20;\ + before = true; \ + } \ + if ((*obj.include)[20]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[20] << obj.comp << obj.manip << obj.obj->I21;\ + before = true; \ + } \ + if ((*obj.include)[21]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[21] << obj.comp << obj.manip << obj.obj->I22;\ + before = true; \ + } \ + if ((*obj.include)[22]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[22] << obj.comp << obj.manip << obj.obj->I23;\ + before = true; \ + } \ + if ((*obj.include)[23]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[23] << obj.comp << obj.manip << obj.obj->I24;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23, bool i24) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23, bool i24) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23, bool i24) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23, NAME##_enum i24) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23, NAME##_enum i24) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23, NAME##_enum i24) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + s->I16 = static_cast(row.at(O16));\ + s->I17 = static_cast(row.at(O17));\ + s->I18 = static_cast(row.at(O18));\ + s->I19 = static_cast(row.at(O19));\ + s->I20 = static_cast(row.at(O20));\ + s->I21 = static_cast(row.at(O21));\ + s->I22 = static_cast(row.at(O22));\ + s->I23 = static_cast(row.at(O23));\ + s->I24 = static_cast(row.at(O24));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, I17, I18, I19, I20, I21, I22, I23, I24, 0 ) + +#define sql_create_basic_24(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, T22, I22, T23, I23, T24, I24) \ + sql_create_basic_c_order_24(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4, T6, I6, 5, T7, I7, 6, T8, I8, 7, T9, I9, 8, T10, I10, 9, T11, I11, 10, T12, I12, 11, T13, I13, 12, T14, I14, 13, T15, I15, 14, T16, I16, 15, T17, I17, 16, T18, I18, 17, T19, I19, 18, T20, I20, 19, T21, I21, 20, T22, I22, 21, T23, I23, 22, T24, I24, 23) + +#define sql_create_24(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, T22, I22, T23, I23, T24, I24) \ + sql_create_complete_24(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4, T6, I6, #I6, 5, T7, I7, #I7, 6, T8, I8, #I8, 7, T9, I9, #I9, 8, T10, I10, #I10, 9, T11, I11, #I11, 10, T12, I12, #I12, 11, T13, I13, #I13, 12, T14, I14, #I14, 13, T15, I15, #I15, 14, T16, I16, #I16, 15, T17, I17, #I17, 16, T18, I18, #I18, 17, T19, I19, #I19, 18, T20, I20, #I20, 19, T21, I21, #I21, 20, T22, I22, #I22, 21, T23, I23, #I23, 22, T24, I24, #I24, 23) \ + +#define sql_create_c_order_24(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15, T16, I16, O16, T17, I17, O17, T18, I18, O18, T19, I19, O19, T20, I20, O20, T21, I21, O21, T22, I22, O22, T23, I23, O23, T24, I24, O24) \ + sql_create_complete_24(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5, T6, I6, #I6, O6, T7, I7, #I7, O7, T8, I8, #I8, O8, T9, I9, #I9, O9, T10, I10, #I10, O10, T11, I11, #I11, O11, T12, I12, #I12, O12, T13, I13, #I13, O13, T14, I14, #I14, O14, T15, I15, #I15, O15, T16, I16, #I16, O16, T17, I17, #I17, O17, T18, I18, #I18, O18, T19, I19, #I19, O19, T20, I20, #I20, O20, T21, I21, #I21, O21, T22, I22, #I22, O22, T23, I23, #I23, O23, T24, I24, #I24, O24) + +#define sql_create_c_names_24(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5, T6, I6, N6, T7, I7, N7, T8, I8, N8, T9, I9, N9, T10, I10, N10, T11, I11, N11, T12, I12, N12, T13, I13, N13, T14, I14, N14, T15, I15, N15, T16, I16, N16, T17, I17, N17, T18, I18, N18, T19, I19, N19, T20, I20, N20, T21, I21, N21, T22, I22, N22, T23, I23, N23, T24, I24, N24) \ + sql_create_complete_24(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4, T6, I6, N6, 5, T7, I7, N7, 6, T8, I8, N8, 7, T9, I9, N9, 8, T10, I10, N10, 9, T11, I11, N11, 10, T12, I12, N12, 11, T13, I13, N13, 12, T14, I14, N14, 13, T15, I15, N15, 14, T16, I16, N16, 15, T17, I17, N17, 16, T18, I18, N18, 17, T19, I19, N19, 18, T20, I20, N20, 19, T21, I21, N21, 20, T22, I22, N22, 21, T23, I23, N23, 22, T24, I24, N24, 23) + +// --------------------------------------------------- +// End Create 24 +// --------------------------------------------------- + +// --------------------------------------------------- +// Begin Create 25 +// --------------------------------------------------- +#define sql_create_basic_c_order_25(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15, T16, I16, O16, T17, I17, O17, T18, I18, O18, T19, I19, O19, T20, I20, O20, T21, I21, O21, T22, I22, O22, T23, I23, O23, T24, I24, O24, T25, I25, O25)\ + struct NAME; \ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15;\ + T16 I16;\ + T17 I17;\ + T18 I18;\ + T19 I19;\ + T20 I20;\ + T21 I21;\ + T22 I22;\ + T23 I23;\ + T24 I24;\ + T25 I25; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, T22, I22, T23, I23, T24, I24, T25, I25)\ + }; \ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + s->I16 = static_cast(row.at(O16));\ + s->I17 = static_cast(row.at(O17));\ + s->I18 = static_cast(row.at(O18));\ + s->I19 = static_cast(row.at(O19));\ + s->I20 = static_cast(row.at(O20));\ + s->I21 = static_cast(row.at(O21));\ + s->I22 = static_cast(row.at(O22));\ + s->I23 = static_cast(row.at(O23));\ + s->I24 = static_cast(row.at(O24));\ + s->I25 = static_cast(row.at(O25)); \ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);} \ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, I17, I18, I19, I20, I21, I22, I23, I24, I25 ) + +#define sql_create_complete_25(NAME, CMP, CONTR, T1, I1, N1, O1, T2, I2, N2, O2, T3, I3, N3, O3, T4, I4, N4, O4, T5, I5, N5, O5, T6, I6, N6, O6, T7, I7, N7, O7, T8, I8, N8, O8, T9, I9, N9, O9, T10, I10, N10, O10, T11, I11, N11, O11, T12, I12, N12, O12, T13, I13, N13, O13, T14, I14, N14, O14, T15, I15, N15, O15, T16, I16, N16, O16, T17, I17, N17, O17, T18, I18, N18, O18, T19, I19, N19, O19, T20, I20, N20, O20, T21, I21, N21, O21, T22, I22, N22, O22, T23, I23, N23, O23, T24, I24, N24, O24, T25, I25, N25, O25) \ + struct NAME; \ + enum NAME##_enum { \ + NAME##_##I1,\ + NAME##_##I2,\ + NAME##_##I3,\ + NAME##_##I4,\ + NAME##_##I5,\ + NAME##_##I6,\ + NAME##_##I7,\ + NAME##_##I8,\ + NAME##_##I9,\ + NAME##_##I10,\ + NAME##_##I11,\ + NAME##_##I12,\ + NAME##_##I13,\ + NAME##_##I14,\ + NAME##_##I15,\ + NAME##_##I16,\ + NAME##_##I17,\ + NAME##_##I18,\ + NAME##_##I19,\ + NAME##_##I20,\ + NAME##_##I21,\ + NAME##_##I22,\ + NAME##_##I23,\ + NAME##_##I24,\ + NAME##_##I25 \ + ,NAME##_NULL \ + }; \ + template \ + class NAME##_value_list { \ + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_##field_list {\ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */\ + public: \ + const NAME *obj; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) \ + : obj(o), delem(d), manip(m) {} \ + };\ + template \ + class NAME##_equal_list { \ + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */\ + public: \ + const NAME *obj;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public: \ + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) \ + : obj(o), delem(d), comp(c), manip(m) {}\ + };\ + template \ + class NAME##_cus_value_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_value_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_value_list () {if (del_vector) delete include;} \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23, bool i24, bool i25);\ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23, NAME##_enum i24, NAME##_enum i25); \ + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i)\ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_field_list { \ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_field_list&); */\ + public:\ + const NAME *obj; \ + std::vector *include; \ + bool del_vector; \ + mysqlpp::cchar *delem;\ + Manip manip;\ + public: \ + ~NAME##_cus_field_list () {if (del_vector) delete include;} \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23, bool i24, bool i25); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23, NAME##_enum i24, NAME##_enum i25); \ + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), manip(m) {}\ + };\ + template \ + class NAME##_cus_equal_list {\ + /* friend std::ostream& operator << <> (std::ostream&, \ + const NAME##_cus_equal_list&); */\ + public:\ + const NAME *obj;\ + std::vector *include;\ + bool del_vector;\ + mysqlpp::cchar *delem;\ + mysqlpp::cchar *comp;\ + Manip manip;\ + public:\ + ~NAME##_##cus_equal_list () {if (del_vector) delete include;}\ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23, bool i24, bool i25); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23, NAME##_enum i24, NAME##_enum i25); \ + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) \ + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {}\ + };\ + template int sql_compare_##NAME (const NAME &, const NAME &);\ + struct NAME { \ + T1 I1;\ + T2 I2;\ + T3 I3;\ + T4 I4;\ + T5 I5;\ + T6 I6;\ + T7 I7;\ + T8 I8;\ + T9 I9;\ + T10 I10;\ + T11 I11;\ + T12 I12;\ + T13 I13;\ + T14 I14;\ + T15 I15;\ + T16 I16;\ + T17 I17;\ + T18 I18;\ + T19 I19;\ + T20 I20;\ + T21 I21;\ + T22 I22;\ + T23 I23;\ + T24 I24;\ + T25 I25; \ + NAME () {} \ + NAME (const mysqlpp::Row &row);\ + void set (const mysqlpp::Row &row);\ + sql_compare_define_##CMP(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, T22, I22, T23, I23, T24, I24, T25, I25)\ + sql_construct_define_##CONTR(NAME, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, T22, I22, T23, I23, T24, I24, T25, I25)\ + static const char *names[];\ + static const char *_table;\ + static const char *& table() {return _table;}\ + NAME##_value_list value_list() const {\ + return value_list(",", mysqlpp::quote);}\ + NAME##_value_list value_list(mysqlpp::cchar *d) const {\ + return value_list(d, mysqlpp::quote);}\ + template \ + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_field_list field_list() const {\ + return field_list(",", mysqlpp::do_nothing);}\ + NAME##_field_list field_list(mysqlpp::cchar *d) const {\ + return field_list(d, mysqlpp::do_nothing);}\ + template \ + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; \ + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", \ + mysqlpp::cchar *c = " = ") const{\ + return equal_list(d, c, mysqlpp::quote);}\ + template \ + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; \ + /* cus_data */\ + NAME##_cus_value_list value_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false, bool i24 = false, bool i25 = false) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25);\ + }\ + NAME##_cus_value_list value_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL, NAME##_enum i24 = NAME##_NULL, NAME##_enum i25 = NAME##_NULL) const {\ + return value_list(",", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25);\ + }\ + NAME##_cus_value_list value_list(std::vector *i) const {\ + return value_list(",", mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const {\ + return value_list(",", mysqlpp::quote, sc);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false, bool i24 = false, bool i25 = false) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL, NAME##_enum i24 = NAME##_NULL, NAME##_enum i25 = NAME##_NULL) const {\ + return value_list(d, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return value_list(d, mysqlpp::quote, i);\ + }\ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return value_list(d, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false, bool i24 = false, bool i25 = false) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL, NAME##_enum i24 = NAME##_NULL, NAME##_enum i25 = NAME##_NULL) const; \ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus field */\ + NAME##_cus_field_list field_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false, bool i24 = false, bool i25 = false) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25);\ + }\ + NAME##_cus_field_list field_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL, NAME##_enum i24 = NAME##_NULL, NAME##_enum i25 = NAME##_NULL) const {\ + return field_list(",", mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25);\ + }\ + NAME##_cus_field_list field_list(std::vector *i) const {\ + return field_list(",", mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const\ + {\ + return field_list(",", mysqlpp::do_nothing, sc);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false, bool i24 = false, bool i25 = false) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL, NAME##_enum i24 = NAME##_NULL, NAME##_enum i25 = NAME##_NULL) const {\ + return field_list(d, mysqlpp::do_nothing, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return field_list(d, mysqlpp::do_nothing, i);\ + }\ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return field_list(d, mysqlpp::do_nothing, sc);\ + }\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false, bool i24 = false, bool i25 = false) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL, NAME##_enum i24 = NAME##_NULL, NAME##_enum i25 = NAME##_NULL) const; \ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const;\ + template \ + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + /* cus equal */\ + NAME##_cus_equal_list equal_list(bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false, bool i24 = false, bool i25 = false) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25);\ + }\ + NAME##_cus_equal_list equal_list(NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL, NAME##_enum i24 = NAME##_NULL, NAME##_enum i25 = NAME##_NULL) const {\ + return equal_list(",", " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25);\ + }\ + NAME##_cus_equal_list equal_list(std::vector *i) const {\ + return equal_list(",", " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const {\ + return equal_list(",", " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false, bool i24 = false, bool i25 = false) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL, NAME##_enum i24 = NAME##_NULL, NAME##_enum i25 = NAME##_NULL) const {\ + return equal_list(d, " = ", mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + std::vector *i) const {\ + return equal_list(d, " = ", mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, \ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, " = ", mysqlpp::quote, sc);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false, bool i24 = false, bool i25 = false) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL, NAME##_enum i24 = NAME##_NULL, NAME##_enum i25 = NAME##_NULL) const {\ + return equal_list(d, c, mysqlpp::quote, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + std::vector *i) const {\ + return equal_list(d, c, mysqlpp::quote, i);\ + }\ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c,\ + mysqlpp::sql_cmp_type sc) const {\ + return equal_list(d, c, mysqlpp::quote, sc);\ + }\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + bool i1, bool i2 = false, bool i3 = false, bool i4 = false, bool i5 = false, bool i6 = false, bool i7 = false, bool i8 = false, bool i9 = false, bool i10 = false, bool i11 = false, bool i12 = false, bool i13 = false, bool i14 = false, bool i15 = false, bool i16 = false, bool i17 = false, bool i18 = false, bool i19 = false, bool i20 = false, bool i21 = false, bool i22 = false, bool i23 = false, bool i24 = false, bool i25 = false) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2 = NAME##_NULL, NAME##_enum i3 = NAME##_NULL, NAME##_enum i4 = NAME##_NULL, NAME##_enum i5 = NAME##_NULL, NAME##_enum i6 = NAME##_NULL, NAME##_enum i7 = NAME##_NULL, NAME##_enum i8 = NAME##_NULL, NAME##_enum i9 = NAME##_NULL, NAME##_enum i10 = NAME##_NULL, NAME##_enum i11 = NAME##_NULL, NAME##_enum i12 = NAME##_NULL, NAME##_enum i13 = NAME##_NULL, NAME##_enum i14 = NAME##_NULL, NAME##_enum i15 = NAME##_NULL, NAME##_enum i16 = NAME##_NULL, NAME##_enum i17 = NAME##_NULL, NAME##_enum i18 = NAME##_NULL, NAME##_enum i19 = NAME##_NULL, NAME##_enum i20 = NAME##_NULL, NAME##_enum i21 = NAME##_NULL, NAME##_enum i22 = NAME##_NULL, NAME##_enum i23 = NAME##_NULL, NAME##_enum i24 = NAME##_NULL, NAME##_enum i25 = NAME##_NULL) const; \ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + std::vector *i) const;\ + template \ + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + mysqlpp::sql_cmp_type sc) const;\ + }; \ + MYSQLPP_SSQLS_EXPAND(\ + const char *NAME::names[] = { \ + N1 ,\ + N2 ,\ + N3 ,\ + N4 ,\ + N5 ,\ + N6 ,\ + N7 ,\ + N8 ,\ + N9 ,\ + N10 ,\ + N11 ,\ + N12 ,\ + N13 ,\ + N14 ,\ + N15 ,\ + N16 ,\ + N17 ,\ + N18 ,\ + N19 ,\ + N20 ,\ + N21 ,\ + N22 ,\ + N23 ,\ + N24 ,\ + N25 \ + }; \ + const char *NAME::_table = #NAME ;\ + )\ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23, bool i24, bool i25) \ + { \ + delem = d;\ + manip = m;\ + del_vector = true;\ + obj = o; \ + include = new std::vector(25, false);\ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + if (i20) (*include)[19]=true;\ + if (i21) (*include)[20]=true;\ + if (i22) (*include)[21]=true;\ + if (i23) (*include)[22]=true;\ + if (i24) (*include)[23]=true;\ + if (i25) (*include)[24]=true;\ + } \ + template \ + NAME##_cus_value_list::NAME##_cus_value_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23, NAME##_enum i24, NAME##_enum i25) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(25, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + if (i20 == NAME##_NULL) return;\ + (*include)[i20]=true;\ + if (i21 == NAME##_NULL) return;\ + (*include)[i21]=true;\ + if (i22 == NAME##_NULL) return;\ + (*include)[i22]=true;\ + if (i23 == NAME##_NULL) return;\ + (*include)[i23]=true;\ + if (i24 == NAME##_NULL) return;\ + (*include)[i24]=true;\ + if (i25 == NAME##_NULL) return;\ + (*include)[i25]=true;\ + }\ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23, bool i24, bool i25) {\ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(25, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + if (i20) (*include)[19]=true;\ + if (i21) (*include)[20]=true;\ + if (i22) (*include)[21]=true;\ + if (i23) (*include)[22]=true;\ + if (i24) (*include)[23]=true;\ + if (i25) (*include)[24]=true;\ + } \ + template \ + NAME##_cus_field_list::NAME##_cus_field_list\ + (const NAME *o, mysqlpp::cchar *d, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23, NAME##_enum i24, NAME##_enum i25) { \ + delem = d;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(25, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + if (i20 == NAME##_NULL) return;\ + (*include)[i20]=true;\ + if (i21 == NAME##_NULL) return;\ + (*include)[i21]=true;\ + if (i22 == NAME##_NULL) return;\ + (*include)[i22]=true;\ + if (i23 == NAME##_NULL) return;\ + (*include)[i23]=true;\ + if (i24 == NAME##_NULL) return;\ + (*include)[i24]=true;\ + if (i25 == NAME##_NULL) return;\ + (*include)[i25]=true;\ + }\ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23, bool i24, bool i25) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(25, false); \ + if (i1) (*include)[0]=true;\ + if (i2) (*include)[1]=true;\ + if (i3) (*include)[2]=true;\ + if (i4) (*include)[3]=true;\ + if (i5) (*include)[4]=true;\ + if (i6) (*include)[5]=true;\ + if (i7) (*include)[6]=true;\ + if (i8) (*include)[7]=true;\ + if (i9) (*include)[8]=true;\ + if (i10) (*include)[9]=true;\ + if (i11) (*include)[10]=true;\ + if (i12) (*include)[11]=true;\ + if (i13) (*include)[12]=true;\ + if (i14) (*include)[13]=true;\ + if (i15) (*include)[14]=true;\ + if (i16) (*include)[15]=true;\ + if (i17) (*include)[16]=true;\ + if (i18) (*include)[17]=true;\ + if (i19) (*include)[18]=true;\ + if (i20) (*include)[19]=true;\ + if (i21) (*include)[20]=true;\ + if (i22) (*include)[21]=true;\ + if (i23) (*include)[22]=true;\ + if (i24) (*include)[23]=true;\ + if (i25) (*include)[24]=true;\ + } \ + template \ + NAME##_cus_equal_list::NAME##_cus_equal_list\ + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23, NAME##_enum i24, NAME##_enum i25) { \ + delem = d;\ + comp = c;\ + manip = m;\ + del_vector = true; \ + obj = o; \ + include = new std::vector(25, false); \ + if (i1 == NAME##_NULL) return;\ + (*include)[i1]=true;\ + if (i2 == NAME##_NULL) return;\ + (*include)[i2]=true;\ + if (i3 == NAME##_NULL) return;\ + (*include)[i3]=true;\ + if (i4 == NAME##_NULL) return;\ + (*include)[i4]=true;\ + if (i5 == NAME##_NULL) return;\ + (*include)[i5]=true;\ + if (i6 == NAME##_NULL) return;\ + (*include)[i6]=true;\ + if (i7 == NAME##_NULL) return;\ + (*include)[i7]=true;\ + if (i8 == NAME##_NULL) return;\ + (*include)[i8]=true;\ + if (i9 == NAME##_NULL) return;\ + (*include)[i9]=true;\ + if (i10 == NAME##_NULL) return;\ + (*include)[i10]=true;\ + if (i11 == NAME##_NULL) return;\ + (*include)[i11]=true;\ + if (i12 == NAME##_NULL) return;\ + (*include)[i12]=true;\ + if (i13 == NAME##_NULL) return;\ + (*include)[i13]=true;\ + if (i14 == NAME##_NULL) return;\ + (*include)[i14]=true;\ + if (i15 == NAME##_NULL) return;\ + (*include)[i15]=true;\ + if (i16 == NAME##_NULL) return;\ + (*include)[i16]=true;\ + if (i17 == NAME##_NULL) return;\ + (*include)[i17]=true;\ + if (i18 == NAME##_NULL) return;\ + (*include)[i18]=true;\ + if (i19 == NAME##_NULL) return;\ + (*include)[i19]=true;\ + if (i20 == NAME##_NULL) return;\ + (*include)[i20]=true;\ + if (i21 == NAME##_NULL) return;\ + (*include)[i21]=true;\ + if (i22 == NAME##_NULL) return;\ + (*include)[i22]=true;\ + if (i23 == NAME##_NULL) return;\ + (*include)[i23]=true;\ + if (i24 == NAME##_NULL) return;\ + (*include)[i24]=true;\ + if (i25 == NAME##_NULL) return;\ + (*include)[i25]=true;\ + }\ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { \ + s << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.manip << obj.obj->I15 << obj.delem;\ + s << obj.manip << obj.obj->I16 << obj.delem;\ + s << obj.manip << obj.obj->I17 << obj.delem;\ + s << obj.manip << obj.obj->I18 << obj.delem;\ + s << obj.manip << obj.obj->I19 << obj.delem;\ + s << obj.manip << obj.obj->I20 << obj.delem;\ + s << obj.manip << obj.obj->I21 << obj.delem;\ + s << obj.manip << obj.obj->I22 << obj.delem;\ + s << obj.manip << obj.obj->I23 << obj.delem;\ + s << obj.manip << obj.obj->I24 << obj.delem;\ + s << obj.manip << obj.obj->I25; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { \ + s << obj.manip << obj.obj->names[0] << obj.delem;\ + s << obj.manip << obj.obj->names[1] << obj.delem;\ + s << obj.manip << obj.obj->names[2] << obj.delem;\ + s << obj.manip << obj.obj->names[3] << obj.delem;\ + s << obj.manip << obj.obj->names[4] << obj.delem;\ + s << obj.manip << obj.obj->names[5] << obj.delem;\ + s << obj.manip << obj.obj->names[6] << obj.delem;\ + s << obj.manip << obj.obj->names[7] << obj.delem;\ + s << obj.manip << obj.obj->names[8] << obj.delem;\ + s << obj.manip << obj.obj->names[9] << obj.delem;\ + s << obj.manip << obj.obj->names[10] << obj.delem;\ + s << obj.manip << obj.obj->names[11] << obj.delem;\ + s << obj.manip << obj.obj->names[12] << obj.delem;\ + s << obj.manip << obj.obj->names[13] << obj.delem;\ + s << obj.manip << obj.obj->names[14] << obj.delem;\ + s << obj.manip << obj.obj->names[15] << obj.delem;\ + s << obj.manip << obj.obj->names[16] << obj.delem;\ + s << obj.manip << obj.obj->names[17] << obj.delem;\ + s << obj.manip << obj.obj->names[18] << obj.delem;\ + s << obj.manip << obj.obj->names[19] << obj.delem;\ + s << obj.manip << obj.obj->names[20] << obj.delem;\ + s << obj.manip << obj.obj->names[21] << obj.delem;\ + s << obj.manip << obj.obj->names[22] << obj.delem;\ + s << obj.manip << obj.obj->names[23] << obj.delem;\ + s << obj.manip << obj.obj->names[24]; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1 << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2 << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3 << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4 << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5 << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6 << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7 << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8 << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9 << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10 << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11 << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12 << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13 << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14 << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15 << obj.delem;\ + s << obj.obj->names[15] << obj.comp << obj.manip << obj.obj->I16 << obj.delem;\ + s << obj.obj->names[16] << obj.comp << obj.manip << obj.obj->I17 << obj.delem;\ + s << obj.obj->names[17] << obj.comp << obj.manip << obj.obj->I18 << obj.delem;\ + s << obj.obj->names[18] << obj.comp << obj.manip << obj.obj->I19 << obj.delem;\ + s << obj.obj->names[19] << obj.comp << obj.manip << obj.obj->I20 << obj.delem;\ + s << obj.obj->names[20] << obj.comp << obj.manip << obj.obj->I21 << obj.delem;\ + s << obj.obj->names[21] << obj.comp << obj.manip << obj.obj->I22 << obj.delem;\ + s << obj.obj->names[22] << obj.comp << obj.manip << obj.obj->I23 << obj.delem;\ + s << obj.obj->names[23] << obj.comp << obj.manip << obj.obj->I24 << obj.delem;\ + s << obj.obj->names[24] << obj.comp << obj.manip << obj.obj->I25; \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I15;\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I16;\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I17;\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I18;\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I19;\ + before = true; \ + } \ + if ((*obj.include)[19]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I20;\ + before = true; \ + } \ + if ((*obj.include)[20]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I21;\ + before = true; \ + } \ + if ((*obj.include)[21]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I22;\ + before = true; \ + } \ + if ((*obj.include)[22]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I23;\ + before = true; \ + } \ + if ((*obj.include)[23]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I24;\ + before = true; \ + } \ + if ((*obj.include)[24]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->I25;\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.manip << obj.obj->names[0];\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[1];\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[2];\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[3];\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[4];\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[5];\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[6];\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[7];\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[8];\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[9];\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[10];\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[11];\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[12];\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[13];\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[14];\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[15];\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[16];\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[17];\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[18];\ + before = true; \ + } \ + if ((*obj.include)[19]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[19];\ + before = true; \ + } \ + if ((*obj.include)[20]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[20];\ + before = true; \ + } \ + if ((*obj.include)[21]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[21];\ + before = true; \ + } \ + if ((*obj.include)[22]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[22];\ + before = true; \ + } \ + if ((*obj.include)[23]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[23];\ + before = true; \ + } \ + if ((*obj.include)[24]) { \ + if (before) s << obj.delem;\ + s << obj.manip << obj.obj->names[24];\ + } \ + return s; \ + } \ + template \ + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { \ + bool before = false; \ + if ((*obj.include)[0]) { \ + s << obj.obj->names[0] << obj.comp << obj.manip << obj.obj->I1;\ + before = true; \ + } \ + if ((*obj.include)[1]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[1] << obj.comp << obj.manip << obj.obj->I2;\ + before = true; \ + } \ + if ((*obj.include)[2]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[2] << obj.comp << obj.manip << obj.obj->I3;\ + before = true; \ + } \ + if ((*obj.include)[3]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[3] << obj.comp << obj.manip << obj.obj->I4;\ + before = true; \ + } \ + if ((*obj.include)[4]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[4] << obj.comp << obj.manip << obj.obj->I5;\ + before = true; \ + } \ + if ((*obj.include)[5]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[5] << obj.comp << obj.manip << obj.obj->I6;\ + before = true; \ + } \ + if ((*obj.include)[6]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[6] << obj.comp << obj.manip << obj.obj->I7;\ + before = true; \ + } \ + if ((*obj.include)[7]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[7] << obj.comp << obj.manip << obj.obj->I8;\ + before = true; \ + } \ + if ((*obj.include)[8]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[8] << obj.comp << obj.manip << obj.obj->I9;\ + before = true; \ + } \ + if ((*obj.include)[9]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[9] << obj.comp << obj.manip << obj.obj->I10;\ + before = true; \ + } \ + if ((*obj.include)[10]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[10] << obj.comp << obj.manip << obj.obj->I11;\ + before = true; \ + } \ + if ((*obj.include)[11]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[11] << obj.comp << obj.manip << obj.obj->I12;\ + before = true; \ + } \ + if ((*obj.include)[12]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[12] << obj.comp << obj.manip << obj.obj->I13;\ + before = true; \ + } \ + if ((*obj.include)[13]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[13] << obj.comp << obj.manip << obj.obj->I14;\ + before = true; \ + } \ + if ((*obj.include)[14]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[14] << obj.comp << obj.manip << obj.obj->I15;\ + before = true; \ + } \ + if ((*obj.include)[15]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[15] << obj.comp << obj.manip << obj.obj->I16;\ + before = true; \ + } \ + if ((*obj.include)[16]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[16] << obj.comp << obj.manip << obj.obj->I17;\ + before = true; \ + } \ + if ((*obj.include)[17]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[17] << obj.comp << obj.manip << obj.obj->I18;\ + before = true; \ + } \ + if ((*obj.include)[18]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[18] << obj.comp << obj.manip << obj.obj->I19;\ + before = true; \ + } \ + if ((*obj.include)[19]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[19] << obj.comp << obj.manip << obj.obj->I20;\ + before = true; \ + } \ + if ((*obj.include)[20]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[20] << obj.comp << obj.manip << obj.obj->I21;\ + before = true; \ + } \ + if ((*obj.include)[21]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[21] << obj.comp << obj.manip << obj.obj->I22;\ + before = true; \ + } \ + if ((*obj.include)[22]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[22] << obj.comp << obj.manip << obj.obj->I23;\ + before = true; \ + } \ + if ((*obj.include)[23]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[23] << obj.comp << obj.manip << obj.obj->I24;\ + before = true; \ + } \ + if ((*obj.include)[24]) { \ + if (before) s << obj.delem;\ + s << obj.obj->names[24] << obj.comp << obj.manip << obj.obj->I25;\ + } \ + return s; \ + } \ + template \ + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_value_list (this, d, m); \ + } \ + template \ + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { \ + return NAME##_field_list (this, d, m); \ + } \ + template \ + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { \ + return NAME##_equal_list (this, d, c, m); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23, bool i24, bool i25) const {\ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23, bool i24, bool i25) const { \ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + bool i1, bool i2, bool i3, bool i4, bool i5, bool i6, bool i7, bool i8, bool i9, bool i10, bool i11, bool i12, bool i13, bool i14, bool i15, bool i16, bool i17, bool i18, bool i19, bool i20, bool i21, bool i22, bool i23, bool i24, bool i25) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23, NAME##_enum i24, NAME##_enum i25) const { \ + return NAME##_cus_value_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25); \ + } \ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23, NAME##_enum i24, NAME##_enum i25) const {\ + return NAME##_cus_field_list (this, d, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25); \ + } \ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, \ + NAME##_enum i1, NAME##_enum i2, NAME##_enum i3, NAME##_enum i4, NAME##_enum i5, NAME##_enum i6, NAME##_enum i7, NAME##_enum i8, NAME##_enum i9, NAME##_enum i10, NAME##_enum i11, NAME##_enum i12, NAME##_enum i13, NAME##_enum i14, NAME##_enum i15, NAME##_enum i16, NAME##_enum i17, NAME##_enum i18, NAME##_enum i19, NAME##_enum i20, NAME##_enum i21, NAME##_enum i22, NAME##_enum i23, NAME##_enum i24, NAME##_enum i25) const { \ + return NAME##_cus_equal_list (this, d, c, m, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25); \ + } \ + template \ + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_value_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_field_list (this, d, m, i);\ + }\ + template \ + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m,\ + std::vector *i) const {\ + return NAME##_cus_equal_list (this, d, c, m, i);\ + }\ + template \ + inline NAME##_cus_value_list \ + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, value, NUM);\ + }\ + template \ + inline NAME##_cus_field_list \ + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_def_##CMP (NAME, field, NUM);\ + }\ + template \ + inline NAME##_cus_equal_list \ + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const {\ + sql_compare_type_defe_##CMP (NAME, equal, NUM);\ + }\ + template \ + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { \ + s->I1 = static_cast(row.at(O1));\ + s->I2 = static_cast(row.at(O2));\ + s->I3 = static_cast(row.at(O3));\ + s->I4 = static_cast(row.at(O4));\ + s->I5 = static_cast(row.at(O5));\ + s->I6 = static_cast(row.at(O6));\ + s->I7 = static_cast(row.at(O7));\ + s->I8 = static_cast(row.at(O8));\ + s->I9 = static_cast(row.at(O9));\ + s->I10 = static_cast(row.at(O10));\ + s->I11 = static_cast(row.at(O11));\ + s->I12 = static_cast(row.at(O12));\ + s->I13 = static_cast(row.at(O13));\ + s->I14 = static_cast(row.at(O14));\ + s->I15 = static_cast(row.at(O15));\ + s->I16 = static_cast(row.at(O16));\ + s->I17 = static_cast(row.at(O17));\ + s->I18 = static_cast(row.at(O18));\ + s->I19 = static_cast(row.at(O19));\ + s->I20 = static_cast(row.at(O20));\ + s->I21 = static_cast(row.at(O21));\ + s->I22 = static_cast(row.at(O22));\ + s->I23 = static_cast(row.at(O23));\ + s->I24 = static_cast(row.at(O24));\ + s->I25 = static_cast(row.at(O25));\ + } \ + inline NAME::NAME (const mysqlpp::Row &row) \ + {populate_##NAME(this, row);}\ + inline void NAME::set (const mysqlpp::Row &row)\ + {populate_##NAME(this, row);}\ + sql_COMPARE__##CMP(NAME, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11, I12, I13, I14, I15, I16, I17, I18, I19, I20, I21, I22, I23, I24, I25 ) + +#define sql_create_basic_25(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, T22, I22, T23, I23, T24, I24, T25, I25) \ + sql_create_basic_c_order_25(NAME, CMP, CONTR, T1, I1, 0, T2, I2, 1, T3, I3, 2, T4, I4, 3, T5, I5, 4, T6, I6, 5, T7, I7, 6, T8, I8, 7, T9, I9, 8, T10, I10, 9, T11, I11, 10, T12, I12, 11, T13, I13, 12, T14, I14, 13, T15, I15, 14, T16, I16, 15, T17, I17, 16, T18, I18, 17, T19, I19, 18, T20, I20, 19, T21, I21, 20, T22, I22, 21, T23, I23, 22, T24, I24, 23, T25, I25, 24) + +#define sql_create_25(NAME, CMP, CONTR, T1, I1, T2, I2, T3, I3, T4, I4, T5, I5, T6, I6, T7, I7, T8, I8, T9, I9, T10, I10, T11, I11, T12, I12, T13, I13, T14, I14, T15, I15, T16, I16, T17, I17, T18, I18, T19, I19, T20, I20, T21, I21, T22, I22, T23, I23, T24, I24, T25, I25) \ + sql_create_complete_25(NAME, CMP, CONTR, T1, I1, #I1, 0, T2, I2, #I2, 1, T3, I3, #I3, 2, T4, I4, #I4, 3, T5, I5, #I5, 4, T6, I6, #I6, 5, T7, I7, #I7, 6, T8, I8, #I8, 7, T9, I9, #I9, 8, T10, I10, #I10, 9, T11, I11, #I11, 10, T12, I12, #I12, 11, T13, I13, #I13, 12, T14, I14, #I14, 13, T15, I15, #I15, 14, T16, I16, #I16, 15, T17, I17, #I17, 16, T18, I18, #I18, 17, T19, I19, #I19, 18, T20, I20, #I20, 19, T21, I21, #I21, 20, T22, I22, #I22, 21, T23, I23, #I23, 22, T24, I24, #I24, 23, T25, I25, #I25, 24) \ + +#define sql_create_c_order_25(NAME, CMP, CONTR, T1, I1, O1, T2, I2, O2, T3, I3, O3, T4, I4, O4, T5, I5, O5, T6, I6, O6, T7, I7, O7, T8, I8, O8, T9, I9, O9, T10, I10, O10, T11, I11, O11, T12, I12, O12, T13, I13, O13, T14, I14, O14, T15, I15, O15, T16, I16, O16, T17, I17, O17, T18, I18, O18, T19, I19, O19, T20, I20, O20, T21, I21, O21, T22, I22, O22, T23, I23, O23, T24, I24, O24, T25, I25, O25) \ + sql_create_complete_25(NAME, CMP, CONTR, T1, I1, #I1, O1, T2, I2, #I2, O2, T3, I3, #I3, O3, T4, I4, #I4, O4, T5, I5, #I5, O5, T6, I6, #I6, O6, T7, I7, #I7, O7, T8, I8, #I8, O8, T9, I9, #I9, O9, T10, I10, #I10, O10, T11, I11, #I11, O11, T12, I12, #I12, O12, T13, I13, #I13, O13, T14, I14, #I14, O14, T15, I15, #I15, O15, T16, I16, #I16, O16, T17, I17, #I17, O17, T18, I18, #I18, O18, T19, I19, #I19, O19, T20, I20, #I20, O20, T21, I21, #I21, O21, T22, I22, #I22, O22, T23, I23, #I23, O23, T24, I24, #I24, O24, T25, I25, #I25, O25) + +#define sql_create_c_names_25(NAME, CMP, CONTR, T1, I1, N1, T2, I2, N2, T3, I3, N3, T4, I4, N4, T5, I5, N5, T6, I6, N6, T7, I7, N7, T8, I8, N8, T9, I9, N9, T10, I10, N10, T11, I11, N11, T12, I12, N12, T13, I13, N13, T14, I14, N14, T15, I15, N15, T16, I16, N16, T17, I17, N17, T18, I18, N18, T19, I19, N19, T20, I20, N20, T21, I21, N21, T22, I22, N22, T23, I23, N23, T24, I24, N24, T25, I25, N25) \ + sql_create_complete_25(NAME, CMP, CONTR, T1, I1, N1, 0, T2, I2, N2, 1, T3, I3, N3, 2, T4, I4, N4, 3, T5, I5, N5, 4, T6, I6, N6, 5, T7, I7, N7, 6, T8, I8, N8, 7, T9, I9, N9, 8, T10, I10, N10, 9, T11, I11, N11, 10, T12, I12, N12, 11, T13, I13, N13, 12, T14, I14, N14, 13, T15, I15, N15, 14, T16, I16, N16, 15, T17, I17, N17, 16, T18, I18, N18, 17, T19, I19, N19, 18, T20, I20, N20, 19, T21, I21, N21, 20, T22, I22, N22, 21, T23, I23, N23, 22, T24, I24, N24, 23, T25, I25, N25, 24) + +// --------------------------------------------------- +// End Create 25 +// --------------------------------------------------- + diff --git a/code/meosdb/mysql++/custom.h b/code/meosdb/mysql++/custom.h new file mode 100644 index 0000000..8adc461 --- /dev/null +++ b/code/meosdb/mysql++/custom.h @@ -0,0 +1,98 @@ + +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// This file is generated by the Perl script custom.pl. Please do +// not modify this file directly. Change the script instead. +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +#ifndef MYSQLPP_CUSTOM_H +#define MYSQLPP_CUSTOM_H + +#include "common.h" +#include "tiny_int.h" + +#include + +#if defined(_MSC_VER) && (_MSC_VER < 1400) +# error Please run the MySQL++ script lib/custom.pl with the -v compatibility flag. +#endif + +#ifdef MYSQLPP_SSQLS_NO_STATICS +# define MYSQLPP_SSQLS_EXPAND(...) +#else +# define MYSQLPP_SSQLS_EXPAND(...) __VA_ARGS__ +#endif + +namespace mysqlpp { + +enum sql_dummy_type {sql_dummy}; + +inline int sql_cmp(const std::string &a, const std::string &b) { + return a.compare(b); +} + +inline int sql_cmp(char a,char b) { + return a-b; +} + +inline int sql_cmp(unsigned char a,unsigned char b) { + return a-b; +} + +inline int sql_cmp(tiny_int a,tiny_int b) { + return a-b; +} + +inline int sql_cmp(int a,int b) { + return a-b; +} + +inline int sql_cmp(unsigned int a,unsigned int b) { + return a-b; +} + +inline int sql_cmp(short int a,short int b) { + return a-b; +} + +inline int sql_cmp(unsigned short int a,unsigned short int b) { + return a-b; +} + +inline int sql_cmp(unsigned long a,unsigned long b) { + return a-b; +} + +inline int sql_cmp(long a,long b) { + return a-b; +} + +inline int sql_cmp(double a,double b) { + if (a == b) return 0; + if (a < b) return -1; + return 1; +} + +inline int sql_cmp(float a,float b) { + if (a == b) return 0; + if (a < b) return -1; + return 1; +} + +inline int sql_cmp(longlong a,longlong b) { + if (a == b) return 0; + if (a < b) return -1; + return 1; +} + +inline int sql_cmp(ulonglong a,ulonglong b) { + if (a == b) return 0; + if (a < b) return -1; + return 1; +} + +#include "custom-macros.h" + +} // end namespace mysqlpp + +#endif + diff --git a/code/meosdb/mysql++/custom.pl b/code/meosdb/mysql++/custom.pl new file mode 100644 index 0000000..1136721 --- /dev/null +++ b/code/meosdb/mysql++/custom.pl @@ -0,0 +1,924 @@ +#!/usr/bin/perl -w + +######################################################################## +# custom.pl - Generates custom.h and custom-macros.h, as these files +# contain many near-duplicate classes, varying only in the number of +# SQL table columns they support. +# +# Copyright (c) 1998 by Kevin Atkinson, (c) 1999, 2000 and 2001 by +# MySQL AB, and (c) 2004, 2005 by Educational Technology Resources, Inc. +# Others may also hold copyrights on code in this file. See the CREDITS +# file in the top directory of the distribution for details. +# +# This file is part of MySQL++. +# +# MySQL++ is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# MySQL++ 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 Lesser General Public +# License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with MySQL++; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 +# USA +######################################################################## + + +# This is the limit on the number of SSQLS data members. Higher values +# will make custom-macros.h exponentially larger, increase compile +# times, and possibly even expose limits in your compiler. Increase it +# only if you must. +my $max_data_members = 25; + + +# No user-serviceable parts below. + +use strict; +use Getopt::Std; + +our ($opt_v); +getopts('v') or die "usage: custom.pl [-v]\n"; + +open (OUT0, ">custom.h"); +open (OUT, ">custom-macros.h"); + +print OUT0 << "---"; + +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// This file is generated by the Perl script custom.pl. Please do +// not modify this file directly. Change the script instead. +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +#ifndef MYSQLPP_CUSTOM_H +#define MYSQLPP_CUSTOM_H + +#include "common.h" +#include "tiny_int.h" + +#include +--- + +my ($suppress_statics_start, $suppress_statics_end) = ('', ''); +unless ($opt_v) { + print OUT0 << "---"; + +#if defined(_MSC_VER) && (_MSC_VER < 1400) +# error Please run the MySQL++ script lib/custom.pl with the -v compatibility flag. +#endif + +#ifdef MYSQLPP_SSQLS_NO_STATICS +# define MYSQLPP_SSQLS_EXPAND(...) +#else +# define MYSQLPP_SSQLS_EXPAND(...) __VA_ARGS__ +#endif + +--- + $suppress_statics_start = 'MYSQLPP_SSQLS_EXPAND('; + $suppress_statics_end = ')'; +} + +print OUT0 << "---"; +namespace mysqlpp { + +enum sql_dummy_type {sql_dummy}; + +inline int sql_cmp(const std::string &a, const std::string &b) { + return a.compare(b); +} +--- + +my @types = ("char", "unsigned char", "tiny_int", "int", "unsigned int", + "short int", "unsigned short int", "unsigned long", "long"); +foreach my $type (@types) { + print OUT0 << "---"; + +inline int sql_cmp($type a,$type b) { + return a-b; +} +--- +} + +@types = ("double", "float"); +foreach my $type (@types) { + print OUT0 << "---"; + +inline int sql_cmp($type a,$type b) { + if (a == b) return 0; + if (a < b) return -1; + return 1; +} +--- +} + +@types = ("longlong", "ulonglong"); +foreach my $type (@types) { + print OUT0 << "---"; + +inline int sql_cmp($type a,$type b) { + if (a == b) return 0; + if (a < b) return -1; + return 1; +} +--- +} + +print OUT0 << "---"; + +#include "custom-macros.h" + +} // end namespace mysqlpp + +#endif + +--- + +print OUT << "---"; + +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// This file is generated by the Perl script custom.pl. Please do +// not modify this file directly. Change the script instead. +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +// --------------------------------------------------- +// Begin Mandatory Compare +// --------------------------------------------------- + +#define sql_compare_define(NAME) \\ + bool operator == (const NAME &other) const \\ + {return sql_compare_##NAME(*this,other) == 0;} \\ + bool operator != (const NAME &other) const \\ + {return sql_compare_##NAME(*this,other) != 0;} \\ + bool operator > (const NAME &other) const \\ + {return sql_compare_##NAME(*this,other) > 0;} \\ + bool operator < (const NAME &other) const \\ + {return sql_compare_##NAME(*this,other) < 0;} \\ + bool operator >= (const NAME &other) const \\ + {return sql_compare_##NAME(*this,other) >= 0;} \\ + bool operator <= (const NAME &other) const \\ + {return sql_compare_##NAME(*this,other) <= 0;} \\ + int cmp (const NAME &other) const \\ + {return sql_compare_##NAME(*this,other);} \\ + int compare (const NAME &other) const \\ + {return sql_compare_##NAME(*this,other);} +--- + +my ($parm0, $parm1); + +foreach my $j (1..$max_data_members) { + $parm0 .= "T$j, C$j"; + $parm0 .= ", " unless $j == $max_data_members; + $parm1 .= "C$j"; + $parm1 .= ", " unless $j == $max_data_members; +} + +print OUT << "---"; + +#define sql_compare_define_0(NAME, $parm0) + +#define sql_construct_define_0(NAME, $parm0) + +#define sql_COMPARE__0(NAME, $parm1) + +#define sql_compare_type_def_0(NAME, WHAT, NUM) \\ + sql_compare_type_def_##NUM (NAME, WHAT, NUM) + +#define sql_compare_type_defe_0(NAME, WHAT, NUM) \\ + sql_compare_type_defe_##NUM (NAME, WHAT, NUM) + +// --------------------------------------------------- +// End Mandatory Compare +// --------------------------------------------------- +--- + + +foreach my $i (1..$max_data_members) { + my ($compr, $define, $compp, $set, $parm2); + $compr = ""; $parm2 = ""; $define = ""; + $compr = " int cmp; \\\n" unless $i == 1; + $compp = ""; + $set = ""; + foreach my $j (1..$i) { + if ($j != $i) { + $compr .= " cmp = mysqlpp::sql_cmp(x.C$j , y.C$j ); \\\n"; + $compr .= " if (cmp) return cmp; \\\n"; + } + + $compr .= " return mysqlpp::sql_cmp(x.C$j , y.C$j );" if $j == $i; + $parm2 .= "const T$j &p$j"; + $parm2 .= ", " unless $j == $i; + $define.= "C$j (p$j)"; + $define.= ", " unless $j == $i; + $set .= " C$j = p$j;\\\n"; + $compp .= "true"; + $compp .= ", " unless $j == $i; + } + print OUT << "---"; + +// --------------------------------------------------- +// Begin Compare $i +// --------------------------------------------------- + +#define sql_compare_define_$i(NAME, $parm0) \\ + NAME ($parm2) : $define {} \\ + void set ($parm2) { \\ +$set \\ + } \\ + sql_compare_define(NAME) + +#define sql_construct_define_$i(NAME, $parm0) \\ + void set ($parm2) { \\ +$set \\ + } \\ + NAME ($parm2) : $define {} + +#define sql_compare_type_def_$i(NAME, WHAT, NUM) \\ + return WHAT##_list(d, m, $compp) + +#define sql_compare_type_defe_$i(NAME, WHAT, NUM) \\ + return WHAT##_list(d, c, m, $compp) + +#define sql_COMPARE__$i(NAME, $parm1) \\ + template \\ + int sql_compare_##NAME (const NAME &x, const NAME &y) { \\ +$compr \\ + } \\ + template \\ + int compare (const NAME &x, const NAME &y) { \\ +$compr \\ + } + +// --------------------------------------------------- +// End Compare $i +// --------------------------------------------------- + +--- +} + +print OUT << "---"; +--- + + +foreach my $i (1..$max_data_members) { + my $parm_complete = ""; + my $parm_order = ""; my $parm_order2c = ""; + my $parm_simple = ""; my $parm_simple2c = ""; + my $parm_simple_b = ""; my $parm_simple2c_b = ""; + my $parm_names = ""; my $parm_names2c = ""; + my $defs = ""; my $popul = ""; my $parmc = ""; my $parmC = ""; + my $value_list = ""; my $field_list = ""; my $equal_list = ""; + my $value_list_cus = ""; my $cus_field_list = ""; my $cus_equal_list = ""; + my $create_bool = ""; my $create_list = ""; + my $cusparms1 = ""; my $cusparms2 = ""; my $cusparmsv = ""; + my $cusparms11 = ""; my $cusparms22 = ""; + my $names = "";my $enums = ""; + foreach my $j (1 .. $i) { + $parm_complete .= "T$j, I$j, N$j, O$j"; + $parm_complete .= ", " unless $j == $i; + $parm_order .= "T$j, I$j, O$j"; + $parm_order .= ", " unless $j == $i; + $parm_order2c .= "T$j, I$j, #I$j, O$j"; + $parm_order2c .= ", " unless $j == $i; + $parm_names .= "T$j, I$j, N$j"; + $parm_names .= ", " unless $j == $i; + $parm_names2c .= "T$j, I$j, N$j, ". ($j-1); + $parm_names2c .= ", " unless $j == $i; + $parm_simple .= "T$j, I$j"; + $parm_simple .= ", " unless $j == $i; + $parm_simple2c .= "T$j, I$j, #I$j, ". ($j-1); + $parm_simple2c .= ", " unless $j == $i; + $parm_simple_b .= "T$j, I$j"; + $parm_simple_b .= ", " unless $j == $i; + $parm_simple2c_b .= "T$j, I$j, ". ($j-1); + $parm_simple2c_b .= ", " unless $j == $i; + $defs .= " T$j I$j;"; + $defs .= "\n" unless $j == $i; + $popul .= " s->I$j = static_cast(row.at(O$j));"; + $popul .= "\n" unless $j == $i; + $names .= " N$j "; + $names .= ",\n" unless $j == $i; + $enums .= " NAME##_##I$j"; + $enums .= ",\n" unless $j == $i; + $field_list .= " s << obj.manip << obj.obj->names[".($j-1)."]"; + $field_list .= " << obj.delem;\n" unless $j == $i; + $value_list .= " s << obj.manip << obj.obj->I$j"; + $value_list .= " << obj.delem;\n" unless $j == $i; + $create_bool .= " if (i$j) (*include)[".($j-1)."]=true;\n"; + $create_list .= " if (i$j == NAME##_NULL) return;\n" unless $i == 1; + $create_list .= " (*include)[i$j]=true;\n"; + + $value_list_cus .= " if ((*obj.include)[".($j-1)."]) { \n"; + $value_list_cus .= " if (before) s << obj.delem;\n" unless $j == 1; + $value_list_cus .= " s << obj.manip << obj.obj->I$j;\n"; + $value_list_cus .= " before = true; \n" unless $j == $i; + $value_list_cus .= " } \n"; + + $cus_field_list .= " if ((*obj.include)[".($j-1)."]) { \n"; + $cus_field_list .= " if (before) s << obj.delem;\n" unless $j == 1; + $cus_field_list .= " s << obj.manip << obj.obj->names[".($j-1)."];\n"; + $cus_field_list .= " before = true; \n" unless $j == $i; + $cus_field_list .= " } \n"; + + $cus_equal_list .= " if ((*obj.include)[".($j-1)."]) { \n"; + $cus_equal_list .= " if (before) s << obj.delem;\n" unless $j == 1; + $cus_equal_list .= " s << obj.obj->names[".($j-1)."] << obj.comp"; + $cus_equal_list .= " << obj.manip << obj.obj->I$j;\n"; + $cus_equal_list .= " before = true; \n" unless $j == $i; + $cus_equal_list .= " } \n"; + + $equal_list .= " s << obj.obj->names[".($j-1)."] << obj.comp"; + $equal_list .= " << obj.manip << obj.obj->I$j"; + $equal_list .= " << obj.delem;\n" unless $j == $i; + $cusparms1 .= "bool i$j" if $j == 1; + $cusparms1 .= "bool i$j = false" unless $j == 1; + $cusparms1 .= ", " unless $j == $i; + $cusparms11 .= "bool i$j" ; + $cusparms11 .= ", " unless $j == $i; + $cusparms2 .= "NAME##_enum i$j" if $j == 1; + $cusparms2 .= "NAME##_enum i$j = NAME##_NULL" unless $j == 1; + $cusparms2 .= ", " unless $j == $i; + $cusparms22 .= "NAME##_enum i$j"; + $cusparms22 .= ", " unless $j == $i; + $cusparmsv .= "i$j"; + $cusparmsv .= ", " unless $j == $i; + $parmC .= "T$j, I$j"; + $parmC .= ", " unless $j == $max_data_members; + $parmc .= "I$j"; + $parmc .= ", " unless $j == $max_data_members; + } + foreach my $j ($i+1 .. $max_data_members) { + $parmC .= "0, 0"; + $parmC .= ", " unless $j == $max_data_members; + $parmc .= "0"; + $parmc .= ", " unless $j == $max_data_members; + } + + print OUT << "---"; +// --------------------------------------------------- +// Begin Create $i +// --------------------------------------------------- +--- + my $out = <<"---"; +#define sql_create_basic_c_order_$i(NAME, CMP, CONTR, $parm_order) + + struct NAME; + + template int sql_compare_##NAME (const NAME &, const NAME &); + + struct NAME { +$defs + NAME () {} + NAME (const mysqlpp::Row &row); + sql_compare_define_##CMP(NAME, $parmC) + }; + + template + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { +$popul + } + + inline NAME::NAME (const mysqlpp::Row &row) + {populate_##NAME(this, row);} + + sql_COMPARE__##CMP(NAME, $parmc ) +--- + print OUT &prepare($out); + + $out = <<"---"; +#define sql_create_complete_$i(NAME, CMP, CONTR, $parm_complete) + struct NAME; + + enum NAME##_enum { +$enums + ,NAME##_NULL + }; + + template + class NAME##_value_list { + /*friend std::ostream& operator << <> (std::ostream&, const NAME##_value_list&); */ + public: + const NAME *obj; + mysqlpp::cchar *delem; + Manip manip; + public: + NAME##_value_list (const NAME *o, mysqlpp::cchar *d, Manip m) + : obj(o), delem(d), manip(m) {} + }; + + template + class NAME##_##field_list { + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_field_list&); */ + public: + const NAME *obj; + mysqlpp::cchar *delem; + Manip manip; + public: + NAME##_field_list (const NAME *o, mysqlpp::cchar *d, Manip m) + : obj(o), delem(d), manip(m) {} + }; + + template + class NAME##_equal_list { + /* friend std::ostream& operator << <> (std::ostream&, const NAME##_equal_list&); */ + public: + const NAME *obj; + mysqlpp::cchar *delem; + mysqlpp::cchar *comp; + Manip manip; + public: + NAME##_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) + : obj(o), delem(d), comp(c), manip(m) {} + }; + + template + class NAME##_cus_value_list { + /* friend std::ostream& operator << <> (std::ostream&, + const NAME##_cus_value_list&); */ + public: + const NAME *obj; + std::vector *include; + bool del_vector; + mysqlpp::cchar *delem; + Manip manip; + public: + ~NAME##_cus_value_list () {if (del_vector) delete include;} + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, $cusparms11); + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m, $cusparms22); + NAME##_cus_value_list (const NAME *o, mysqlpp::cchar *d, Manip m ,std::vector* i) + : obj(o), include(i), del_vector(false), delem(d), manip(m) {} + }; + + template + class NAME##_cus_field_list { + /* friend std::ostream& operator << <> (std::ostream&, + const NAME##_cus_field_list&); */ + public: + const NAME *obj; + std::vector *include; + bool del_vector; + mysqlpp::cchar *delem; + Manip manip; + public: + ~NAME##_cus_field_list () {if (del_vector) delete include;} + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, $cusparms11); + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, $cusparms22); + NAME##_cus_field_list (const NAME *o, mysqlpp::cchar *d, Manip m, std::vector *i) + : obj(o), include(i), del_vector(false), delem(d), manip(m) {} + }; + + template + class NAME##_cus_equal_list { + /* friend std::ostream& operator << <> (std::ostream&, + const NAME##_cus_equal_list&); */ + public: + const NAME *obj; + std::vector *include; + bool del_vector; + mysqlpp::cchar *delem; + mysqlpp::cchar *comp; + Manip manip; + public: + ~NAME##_##cus_equal_list () {if (del_vector) delete include;} + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, $cusparms11); + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, $cusparms22); + NAME##_##cus_equal_list (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, std::vector *i) + : obj(o), include(i), del_vector(false), delem(d), comp(c), manip(m) {} + }; + + template int sql_compare_##NAME (const NAME &, const NAME &); + + struct NAME { +$defs + NAME () {} + NAME (const mysqlpp::Row &row); + void set (const mysqlpp::Row &row); + sql_compare_define_##CMP(NAME, $parmC) + sql_construct_define_##CONTR(NAME, $parmC) + static const char *names[]; + static const char *_table; + static const char *& table() {return _table;} + + NAME##_value_list value_list() const { + return value_list(",", mysqlpp::quote);} + NAME##_value_list value_list(mysqlpp::cchar *d) const { + return value_list(d, mysqlpp::quote);} + template + NAME##_value_list value_list(mysqlpp::cchar *d, Manip m) const; + + NAME##_field_list field_list() const { + return field_list(",", mysqlpp::do_nothing);} + NAME##_field_list field_list(mysqlpp::cchar *d) const { + return field_list(d, mysqlpp::do_nothing);} + template + NAME##_field_list field_list(mysqlpp::cchar *d, Manip m) const; + + NAME##_equal_list equal_list(mysqlpp::cchar *d = ",", + mysqlpp::cchar *c = " = ") const{ + return equal_list(d, c, mysqlpp::quote);} + template + NAME##_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const; + + /* cus_data */ + + NAME##_cus_value_list value_list($cusparms1) const { + return value_list(",", mysqlpp::quote, $cusparmsv); + } + NAME##_cus_value_list value_list($cusparms2) const { + return value_list(",", mysqlpp::quote, $cusparmsv); + } + NAME##_cus_value_list value_list(std::vector *i) const { + return value_list(",", mysqlpp::quote, i); + } + NAME##_cus_value_list value_list(mysqlpp::sql_cmp_type sc) const { + return value_list(",", mysqlpp::quote, sc); + } + + NAME##_cus_value_list value_list(mysqlpp::cchar *d, $cusparms1) const { + return value_list(d, mysqlpp::quote, $cusparmsv); + } + NAME##_cus_value_list value_list(mysqlpp::cchar *d, $cusparms2) const { + return value_list(d, mysqlpp::quote, $cusparmsv); + } + NAME##_cus_value_list value_list(mysqlpp::cchar *d, + std::vector *i) const { + return value_list(d, mysqlpp::quote, i); + } + NAME##_cus_value_list value_list(mysqlpp::cchar *d, + mysqlpp::sql_cmp_type sc) const { + return value_list(d, mysqlpp::quote, sc); + } + + template + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, + $cusparms1) const; + template + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, + $cusparms2) const; + template + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, + std::vector *i) const; + template + NAME##_cus_value_list value_list(mysqlpp::cchar *d, Manip m, + mysqlpp::sql_cmp_type sc) const; + /* cus field */ + + NAME##_cus_field_list field_list($cusparms1) const { + return field_list(",", mysqlpp::do_nothing, $cusparmsv); + } + NAME##_cus_field_list field_list($cusparms2) const { + return field_list(",", mysqlpp::do_nothing, $cusparmsv); + } + NAME##_cus_field_list field_list(std::vector *i) const { + return field_list(",", mysqlpp::do_nothing, i); + } + NAME##_cus_field_list field_list(mysqlpp::sql_cmp_type sc) const + { + return field_list(",", mysqlpp::do_nothing, sc); + } + + NAME##_cus_field_list field_list(mysqlpp::cchar *d, + $cusparms1) const { + return field_list(d, mysqlpp::do_nothing, $cusparmsv); + } + NAME##_cus_field_list field_list(mysqlpp::cchar *d, + $cusparms2) const { + return field_list(d, mysqlpp::do_nothing, $cusparmsv); + } + NAME##_cus_field_list field_list(mysqlpp::cchar *d, + std::vector *i) const { + return field_list(d, mysqlpp::do_nothing, i); + } + NAME##_cus_field_list field_list(mysqlpp::cchar *d, + mysqlpp::sql_cmp_type sc) const { + return field_list(d, mysqlpp::do_nothing, sc); + } + + template + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, + $cusparms1) const; + template + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, + $cusparms2) const; + template + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, + std::vector *i) const; + template + NAME##_cus_field_list field_list(mysqlpp::cchar *d, Manip m, + mysqlpp::sql_cmp_type sc) const; + + /* cus equal */ + + NAME##_cus_equal_list equal_list($cusparms1) const { + return equal_list(",", " = ", mysqlpp::quote, $cusparmsv); + } + NAME##_cus_equal_list equal_list($cusparms2) const { + return equal_list(",", " = ", mysqlpp::quote, $cusparmsv); + } + NAME##_cus_equal_list equal_list(std::vector *i) const { + return equal_list(",", " = ", mysqlpp::quote, i); + } + NAME##_cus_equal_list equal_list(mysqlpp::sql_cmp_type sc) const { + return equal_list(",", " = ", mysqlpp::quote, sc); + } + + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, $cusparms1) const { + return equal_list(d, " = ", mysqlpp::quote, $cusparmsv); + } + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, $cusparms2) const { + return equal_list(d, " = ", mysqlpp::quote, $cusparmsv); + } + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, + std::vector *i) const { + return equal_list(d, " = ", mysqlpp::quote, i); + } + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, + mysqlpp::sql_cmp_type sc) const { + return equal_list(d, " = ", mysqlpp::quote, sc); + } + + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, + $cusparms1) const { + return equal_list(d, c, mysqlpp::quote, $cusparmsv); + } + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, + $cusparms2) const { + return equal_list(d, c, mysqlpp::quote, $cusparmsv); + } + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, + std::vector *i) const { + return equal_list(d, c, mysqlpp::quote, i); + } + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, + mysqlpp::sql_cmp_type sc) const { + return equal_list(d, c, mysqlpp::quote, sc); + } + + template + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, + $cusparms1) const; + template + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, + $cusparms2) const; + template + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, + std::vector *i) const; + template + NAME##_cus_equal_list equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, + mysqlpp::sql_cmp_type sc) const; + }; + $suppress_statics_start + const char *NAME::names[] = { +$names + }; + const char *NAME::_table = #NAME ; + $suppress_statics_end + + template + NAME##_cus_value_list::NAME##_cus_value_list + (const NAME *o, mysqlpp::cchar *d, Manip m, $cusparms11) + { + delem = d; + manip = m; + del_vector = true; + obj = o; + include = new std::vector($i, false); +$create_bool + } + + template + NAME##_cus_value_list::NAME##_cus_value_list + (const NAME *o, mysqlpp::cchar *d, Manip m, $cusparms22) { + delem = d; + manip = m; + del_vector = true; + obj = o; + include = new std::vector($i, false); +$create_list + } + + template + NAME##_cus_field_list::NAME##_cus_field_list + (const NAME *o, mysqlpp::cchar *d, Manip m, $cusparms11) { + delem = d; + manip = m; + del_vector = true; + obj = o; + include = new std::vector($i, false); +$create_bool + } + + template + NAME##_cus_field_list::NAME##_cus_field_list + (const NAME *o, mysqlpp::cchar *d, Manip m, $cusparms22) { + delem = d; + manip = m; + del_vector = true; + obj = o; + include = new std::vector($i, false); +$create_list + } + + template + NAME##_cus_equal_list::NAME##_cus_equal_list + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, $cusparms11) { + delem = d; + comp = c; + manip = m; + del_vector = true; + obj = o; + include = new std::vector($i, false); +$create_bool + } + + template + NAME##_cus_equal_list::NAME##_cus_equal_list + (const NAME *o, mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, $cusparms22) { + delem = d; + comp = c; + manip = m; + del_vector = true; + obj = o; + include = new std::vector($i, false); +$create_list + } + + template + std::ostream& operator << (std::ostream& s, const NAME##_value_list& obj) { +$value_list; + return s; + } + + template + std::ostream& operator << (std::ostream& s, const NAME##_field_list& obj) { +$field_list; + return s; + } + + template + std::ostream& operator << (std::ostream& s, const NAME##_equal_list& obj) { +$equal_list; + return s; + } + + template + std::ostream& operator << (std::ostream& s, const NAME##_cus_value_list& obj) { + bool before = false; +$value_list_cus + return s; + } + + template + std::ostream& operator << (std::ostream& s, const NAME##_cus_field_list& obj) { + bool before = false; +$cus_field_list + return s; + } + + template + std::ostream& operator << (std::ostream& s, const NAME##_cus_equal_list& obj) { + bool before = false; +$cus_equal_list + return s; + } + + template + inline NAME##_value_list NAME::value_list(mysqlpp::cchar *d, Manip m) const { + return NAME##_value_list (this, d, m); + } + + template + inline NAME##_field_list NAME::field_list(mysqlpp::cchar *d, Manip m) const { + return NAME##_field_list (this, d, m); + } + + template + inline NAME##_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m) const { + return NAME##_equal_list (this, d, c, m); + } + + template + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m, + $cusparms11) const { + return NAME##_cus_value_list (this, d, m, $cusparmsv); + } + + template + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m, + $cusparms11) const { + return NAME##_cus_field_list (this, d, m, $cusparmsv); + } + + template + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, + $cusparms11) const { + return NAME##_cus_equal_list (this, d, c, m, $cusparmsv); + } + + template + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m, + $cusparms22) const { + return NAME##_cus_value_list (this, d, m, $cusparmsv); + } + + template + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m, + $cusparms22) const { + return NAME##_cus_field_list (this, d, m, $cusparmsv); + } + + template + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, + $cusparms22) const { + return NAME##_cus_equal_list (this, d, c, m, $cusparmsv); + } + + template + inline NAME##_cus_value_list NAME::value_list(mysqlpp::cchar *d, Manip m, + std::vector *i) const { + return NAME##_cus_value_list (this, d, m, i); + } + + template + inline NAME##_cus_field_list NAME::field_list(mysqlpp::cchar *d, Manip m, + std::vector *i) const { + return NAME##_cus_field_list (this, d, m, i); + } + + template + inline NAME##_cus_equal_list NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, + std::vector *i) const { + return NAME##_cus_equal_list (this, d, c, m, i); + } + + template + inline NAME##_cus_value_list + NAME::value_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const { + sql_compare_type_def_##CMP (NAME, value, NUM); + } + + template + inline NAME##_cus_field_list + NAME::field_list(mysqlpp::cchar *d, Manip m, mysqlpp::sql_cmp_type /*sc*/) const { + sql_compare_type_def_##CMP (NAME, field, NUM); + } + + template + inline NAME##_cus_equal_list + NAME::equal_list(mysqlpp::cchar *d, mysqlpp::cchar *c, Manip m, mysqlpp::sql_cmp_type /*sc*/) const { + sql_compare_type_defe_##CMP (NAME, equal, NUM); + } + + template + void populate_##NAME (NAME *s, const mysqlpp::Row &row) { +$popul + } + + inline NAME::NAME (const mysqlpp::Row &row) + {populate_##NAME(this, row);} + inline void NAME::set (const mysqlpp::Row &row) + {populate_##NAME(this, row);} + + sql_COMPARE__##CMP(NAME, $parmc ) + +--- +print OUT &prepare($out); + +# +# short cut defs +# + +print OUT << "---"; +#define sql_create_basic_$i(NAME, CMP, CONTR, $parm_simple_b) \\ + sql_create_basic_c_order_$i(NAME, CMP, CONTR, $parm_simple2c_b) + +#define sql_create_$i(NAME, CMP, CONTR, $parm_simple) \\ + sql_create_complete_$i(NAME, CMP, CONTR, $parm_simple2c) \\ + +#define sql_create_c_order_$i(NAME, CMP, CONTR, $parm_order) \\ + sql_create_complete_$i(NAME, CMP, CONTR, $parm_order2c) + +#define sql_create_c_names_$i(NAME, CMP, CONTR, $parm_names) \\ + sql_create_complete_$i(NAME, CMP, CONTR, $parm_names2c) + +// --------------------------------------------------- +// End Create $i +// --------------------------------------------------- + +--- + +} + + +sub prepare { + local $_ = $_[0]; + s/\n+$//; + s/\n[\n ]*\n/\n/g; + s/\n+/\\\n/g; + $_ .= "\n\n"; + return $_; +} + diff --git a/code/meosdb/mysql++/datetime.cpp b/code/meosdb/mysql++/datetime.cpp new file mode 100644 index 0000000..9e63b27 --- /dev/null +++ b/code/meosdb/mysql++/datetime.cpp @@ -0,0 +1,219 @@ +/*********************************************************************** + datetime.cpp - Implements date and time classes compatible with MySQL's + various date and time column types. + + Copyright (c) 1998 by Kevin Atkinson, (c) 1999, 2000 and 2001 by + MySQL AB, and (c) 2004, 2005 by Educational Technology Resources, Inc. + Others may also hold copyrights on code in this file. See the CREDITS + file in the top directory of the distribution for details. + + This file is part of MySQL++. + + MySQL++ is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + MySQL++ 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 Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with MySQL++; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 + USA +***********************************************************************/ + +#define MYSQLPP_NOT_HEADER +#include "common.h" + +#include "datetime.h" + +#include + +#include + +using namespace std; + +namespace mysqlpp { + +std::ostream& operator <<(std::ostream& os, const Date& d) +{ + char fill = os.fill('0'); + ios::fmtflags flags = os.setf(ios::right); + os << setw(4) << d.year << '-' + << setw(2) << d.month << '-' + << setw(2) << d.day; + os.flags(flags); + os.fill(fill); + return os; +} + + +std::ostream& operator <<(std::ostream& os, const Time& t) +{ + char fill = os.fill('0'); + ios::fmtflags flags = os.setf(ios::right); + os << setw(2) << t.hour << ':' + << setw(2) << t.minute << ':' + << setw(2) << t.second; + os.flags(flags); + os.fill(fill); + return os; +} + + +std::ostream& operator <<(std::ostream& os, const DateTime& dt) +{ + operator <<(os, Date(dt)); + os << ' '; + return operator <<(os, Time(dt)); +} + + +cchar* Date::convert(cchar* str) +{ + char num[5]; + + num[0] = *str++; + num[1] = *str++; + num[2] = *str++; + num[3] = *str++; + num[4] = 0; + year = short(strtol(num, 0, 10)); + if (*str == '-') str++; + + num[0] = *str++; + num[1] = *str++; + num[2] = 0; + month = short(strtol(num, 0, 10)); + if (*str == '-') str++; + + num[0] = *str++; + num[1] = *str++; + num[2] = 0; + day = short(strtol(num, 0, 10)); + + return str; +} + + +cchar* Time::convert(cchar* str) +{ + char num[5]; + + num[0] = *str++; + num[1] = *str++; + num[2] = 0; + hour = short(strtol(num,0,10)); + if (*str == ':') str++; + + num[0] = *str++; + num[1] = *str++; + num[2] = 0; + minute = short(strtol(num,0,10)); + if (*str == ':') str++; + + num[0] = *str++; + num[1] = *str++; + num[2] = 0; + second = short(strtol(num,0,10)); + + return str; +} + + +cchar* DateTime::convert(cchar* str) +{ + Date d; + str = d.convert(str); + year = d.year; + month = d.month; + day = d.day; + + if (*str == ' ') ++str; + + Time t; + str = t.convert(str); + hour = t.hour; + minute = t.minute; + second = t.second; + + return str; +} + + +short int Date::compare(const Date& other) const +{ + if (year != other.year) return year - other.year; + if (month != other.month) return month - other.month; + return day - other.day; +} + + +short int Time::compare(const Time& other) const +{ + if (hour != other.hour) return hour - other.hour; + if (minute != other.minute) return minute - other.minute; + return second - other.second; +} + + +short int DateTime::compare(const DateTime& other) const +{ + Date d(*this), od(other); + Time t(*this), ot(other); + + if (int x = d.compare(od)) { + return x; + } + else { + return t.compare(ot); + } +} + +DateTime::operator time_t() const +{ + struct tm tm; + tm.tm_sec = second; + tm.tm_min = minute; + tm.tm_hour = hour; + tm.tm_mday = day; + tm.tm_mon = month - (tiny_int)1; + tm.tm_year = year - 1900; + tm.tm_isdst = -1; + + return mktime(&tm); +}; + +DateTime::DateTime(time_t t) +{ + struct tm tm; +#if defined(_MSC_VER) && _MSC_VER >= 1400 && !defined(_STLP_VERSION) && \ + !defined(_STLP_VERSION_STR) + // Use thread-safe localtime() replacement included with VS2005 and + // up, but only when using native RTL, not STLport. + localtime_s(&tm, &t); +#elif defined(HAVE_LOCALTIME_R) + // Detected POSIX thread-safe localtime() replacement. + localtime_r(&t, &tm); +#else + // No explicitly thread-safe localtime() replacement found. This + // may still be thread-safe, as some C libraries take special steps + // within localtime() to get thread safety. For example, thread- + // local storage (TLS) in some Windows compilers. + memcpy(&tm, localtime(&t), sizeof(tm)); +#endif + + year = tm.tm_year + 1900; + month = tm.tm_mon + 1; + day = tm.tm_mday; + hour = tm.tm_hour; + minute = tm.tm_min; + second = tm.tm_sec; +} + +} // end namespace mysqlpp + + diff --git a/code/meosdb/mysql++/datetime.h b/code/meosdb/mysql++/datetime.h new file mode 100644 index 0000000..0d10efd --- /dev/null +++ b/code/meosdb/mysql++/datetime.h @@ -0,0 +1,384 @@ +/// \file datetime.h +/// \brief Declares classes to add MySQL-compatible date and time +/// types to C++'s type system. + +/*********************************************************************** + Copyright (c) 1998 by Kevin Atkinson, (c) 1999, 2000 and 2001 by + MySQL AB, and (c) 2004, 2005 by Educational Technology Resources, Inc. + Others may also hold copyrights on code in this file. See the CREDITS + file in the top directory of the distribution for details. + + This file is part of MySQL++. + + MySQL++ is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + MySQL++ 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 Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with MySQL++; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 + USA +***********************************************************************/ + +#ifndef MYSQLPP_DATETIME_H +#define MYSQLPP_DATETIME_H + +#include "common.h" + +#include "coldata.h" +#include "stream2string.h" +#include "tiny_int.h" + +#include +#include +#include + +namespace mysqlpp { + +/// \brief Base class template for MySQL++ date and time classes. +/// +/// This template primarily defines the comparison operators, which are +/// all implemented in terms of compare(). Each subclass implements that +/// as a protected method, because these operators are the only +/// supported comparison method. +/// +/// This template also defines interfaces for converting the object to +/// a string form, which a subclass must define. +template struct DTbase +{ + /// \brief Destroy object + virtual ~DTbase() { } + + /// \brief Return a copy of the item in C++ string form + operator std::string() const + { + return stream2string(*this); + } + + /// \brief Compare this object to another of the same type + /// + /// Returns < 0 if this object is "before" the other, 0 of they are + /// equal, and > 0 if this object is "after" the other. + MYSQLPP_EXPORT virtual short compare(const T& other) const = 0; + + /// \brief Returns true if "other" is equal to this object + bool operator ==(const T& other) const + { + return !compare(other); + } + + /// \brief Returns true if "other" is not equal to this object + bool operator !=(const T& other) const + { + return compare(other); + } + + /// \brief Returns true if "other" is less than this object + bool operator <(const T& other) const + { + return compare(other) < 0; + } + + /// \brief Returns true if "other" is less than or equal to this object + bool operator <=(const T& other) const + { + return compare(other) <= 0; + } + + /// \brief Returns true if "other" is greater than this object + bool operator >(const T& other) const + { + return compare(other) > 0; + } + + /// \brief Returns true if "other" is greater than or equal to this object + bool operator >=(const T& other) const + { + return compare(other) >= 0; + } +}; + + +/// \brief C++ form of MySQL's DATETIME type. +/// +/// Objects of this class can be inserted into streams, and +/// initialized from MySQL DATETIME strings. +struct DateTime : public DTbase +{ + /// \brief the year + /// + /// No surprises; the year 2005 is stored as the integer 2005. + short int year; + + /// \brief the month, 1-12 + tiny_int month; + + /// \brief the day, 1-31 + tiny_int day; + + /// \brief hour, 0-23 + tiny_int hour; + + /// \brief minute, 0-59 + tiny_int minute; + + /// \brief second, 0-59 + tiny_int second; + + /// \brief Default constructor + DateTime() : + DTbase(), + year(0), + month(0), + day(0), + hour(0), + minute(0), + second(0) + { + } + + /// \brief Initialize object as a copy of another Date + DateTime(const DateTime& other) : + DTbase(), + year(other.year), + month(other.month), + day(other.day), + hour(other.hour), + minute(other.minute), + second(other.second) + { + } + + /// \brief Initialize object from a MySQL date-and-time string + /// + /// String must be in the HH:MM:SS format. It doesn't have to be + /// zero-padded. + DateTime(cchar* str) { convert(str); } + + /// \brief Initialize object from a MySQL date-and-time string + /// + /// \sa DateTime(cchar*) + DateTime(const ColData& str) + { + convert(str.c_str()); + } + + /// \brief Initialize object from a MySQL date-and-time string + /// + /// \sa DateTime(cchar*) + DateTime(const std::string& str) + { + convert(str.c_str()); + } + + /// \brief Initialize object from a time_t + DateTime(time_t t); + + /// \brief Compare this datetime to another. + /// + /// Returns < 0 if this datetime is before the other, 0 of they are + /// equal, and > 0 if this datetime is after the other. + /// + /// This method is protected because it is merely the engine used + /// by the various operators in DTbase. + MYSQLPP_EXPORT short compare(const DateTime& other) const; + + /// \brief Parse a MySQL date and time string into this object. + MYSQLPP_EXPORT cchar* convert(cchar*); + + /// Convert to time_t + operator time_t() const; +}; + + +/// \brief Inserts a DateTime object into a C++ stream in a +/// MySQL-compatible format. +/// +/// The date and time are inserted into the stream, in that order, +/// with a space between them. +/// +/// \param os stream to insert date and time into +/// \param dt date/time object to insert into stream +MYSQLPP_EXPORT std::ostream& operator <<(std::ostream& os, + const DateTime& dt); + + +/// \brief C++ form of MySQL's DATE type. +/// +/// Objects of this class can be inserted into streams, and +/// initialized from MySQL DATE strings. +struct Date : public DTbase +{ + /// \brief the year + /// + /// No surprises; the year 2005 is stored as the integer 2005. + short int year; + + /// \brief the month, 1-12 + tiny_int month; + + /// \brief the day, 1-31 + tiny_int day; + + /// \brief Default constructor + Date() : year(0), month(0), day(0) { } + + /// \brief Initialize object + Date(short int y, tiny_int m, tiny_int d) : + DTbase(), + year(y), + month(m), + day(d) + { + } + + /// \brief Initialize object as a copy of another Date + Date(const Date& other) : + DTbase(), + year(other.year), + month(other.month), + day(other.day) + { + } + + /// \brief Initialize object from date part of date/time object + Date(const DateTime& other) : + DTbase(), + year(other.year), + month(other.month), + day(other.day) + { + } + + /// \brief Initialize object from a MySQL date string + /// + /// String must be in the YYYY-MM-DD format. It doesn't have to be + /// zero-padded. + Date(cchar* str) { convert(str); } + + /// \brief Initialize object from a MySQL date string + /// + /// \sa Date(cchar*) + Date(const ColData& str) { convert(str.c_str()); } + + /// \brief Initialize object from a MySQL date string + /// + /// \sa Date(cchar*) + Date(const std::string& str) + { + convert(str.c_str()); + } + + /// \brief Compare this date to another. + /// + /// Returns < 0 if this date is before the other, 0 of they are + /// equal, and > 0 if this date is after the other. + MYSQLPP_EXPORT short int compare(const Date& other) const; + + /// \brief Parse a MySQL date string into this object. + MYSQLPP_EXPORT cchar* convert(cchar*); +}; + +/// \brief Inserts a Date object into a C++ stream +/// +/// The format is YYYY-MM-DD, zero-padded. +/// +/// \param os stream to insert date into +/// \param d date to insert into stream +MYSQLPP_EXPORT std::ostream& operator <<(std::ostream& os, + const Date& d); + + +/// \brief C++ form of MySQL's TIME type. +/// +/// Objects of this class can be inserted into streams, and +/// initialized from MySQL TIME strings. +struct Time : public DTbase