summaryrefslogtreecommitdiff
path: root/mg_order.c
diff options
context:
space:
mode:
Diffstat (limited to 'mg_order.c')
-rw-r--r--mg_order.c117
1 files changed, 89 insertions, 28 deletions
diff --git a/mg_order.c b/mg_order.c
index 88615a8..525469c 100644
--- a/mg_order.c
+++ b/mg_order.c
@@ -4,7 +4,7 @@
#include <stdio.h>
#include <assert.h>
-const char * EMPTY = "XNICHTGESETZTX";
+mgSelItem zeroitem;
bool iskeyGenre(mgKeyTypes kt)
{
@@ -100,26 +100,81 @@ ltos (long l)
return s.str ();
}
+mgSelItem::mgSelItem()
+{
+ m_valid=false;
+ m_count=0;
+}
+
+mgSelItem::mgSelItem(string v,string i,unsigned int c)
+{
+ set(v,i,c);
+}
+
+void
+mgSelItem::set(string v,string i,unsigned int c)
+{
+ m_valid=true;
+ m_value=v;
+ m_id=i;
+ m_count=c;
+}
+
+void
+mgSelItem::operator=(const mgSelItem& from)
+{
+ m_valid=from.m_valid;
+ m_value=from.m_value;
+ m_id=from.m_id;
+ m_count=from.m_count;
+}
+
+void
+mgSelItem::operator=(const mgSelItem* from)
+{
+ m_valid=from->m_valid;
+ m_value=from->m_value;
+ m_id=from->m_id;
+ m_count=from->m_count;
+}
+
+bool
+mgSelItem::operator==(const mgSelItem& other) const
+{
+ return m_value == other.m_value
+ && m_id == other.m_id;
+}
+
class mgKeyNormal : public mgKey {
public:
mgKeyNormal(const mgKeyNormal& k);
- mgKeyNormal(const mgKeyTypes kt, string table, string field);
+ mgKeyNormal(const mgKeyTypes kt, string table, string field);
virtual mgParts Parts(mgmySql &db,bool orderby=false) const;
string value() const;
string id() const;
- void set(string value,string id);
+ bool valid() const;
+ void set(mgSelItem& item);
+ mgSelItem& get();
mgKeyTypes Type() const { return m_kt; }
virtual string expr() const { return m_table + "." + m_field; }
virtual string table() const { return m_table; }
protected:
string IdClause(mgmySql &db,string what,string::size_type start=0,string::size_type len=string::npos) const;
void AddIdClause(mgmySql &db,mgParts &result,string what) const;
- string m_id;
+ mgSelItem m_item;
string m_field;
private:
mgKeyTypes m_kt;
string m_table;
- string m_value;
+};
+
+class mgKeyABC : public mgKeyNormal {
+ public:
+ mgKeyABC(const mgKeyNormal& k) : mgKeyNormal(k) {}
+ mgKeyABC(const mgKeyTypes kt, string table, string field) : mgKeyNormal(kt,table,field) {}
+ virtual string expr() const { return "substring("+mgKeyNormal::expr()+",1,1)"; }
+ protected:
+ //void AddIdClause(mgmySql &db,mgParts &result,string what) const;
};
class mgKeyDate : public mgKeyNormal {
@@ -246,7 +301,7 @@ mgKeyGenres::GenreClauses(mgmySql &db,bool orderby) const
g2.push_back("substring(tracks.genre2,1,"+ltos(genrelevel())+")=genre.id");
}
- if (id() != EMPTY)
+ if (valid())
{
unsigned int len=genrelevel();
if (len==4) len=0;
@@ -317,13 +372,19 @@ class mgKeyDecade : public mgKeyNormal {
string
mgKeyNormal::id() const
{
- return m_id;
+ return m_item.id();
+}
+
+bool
+mgKeyNormal::valid() const
+{
+ return m_item.valid();
}
string
mgKeyNormal::value() const
{
- return m_value;
+ return m_item.value();
}
@@ -332,7 +393,7 @@ mgKeyNormal::mgKeyNormal(const mgKeyNormal& k)
m_kt = k.m_kt;
m_table = k.m_table;
m_field = k.m_field;
- m_id = k.m_id;
+ m_item = k.m_item;
}
mgKeyNormal::mgKeyNormal(const mgKeyTypes kt, string table, string field)
@@ -340,14 +401,18 @@ mgKeyNormal::mgKeyNormal(const mgKeyTypes kt, string table, string field)
m_kt = kt;
m_table = table;
m_field = field;
- m_id = EMPTY;
}
void
-mgKeyNormal::set(string value, string id)
+mgKeyNormal::set(mgSelItem& item)
{
- m_value = value;
- m_id = id;
+ m_item=item;
+}
+
+mgSelItem&
+mgKeyNormal::get()
+{
+ return m_item;
}
mgParts::mgParts()
@@ -393,7 +458,7 @@ mgKeyNormal::IdClause(mgmySql &db,string what,string::size_type start,string::si
void
mgKeyNormal::AddIdClause(mgmySql &db,mgParts &result,string what) const
{
- if (id() != EMPTY)
+ if (valid())
result.clauses.push_back(IdClause(db,what));
}
@@ -406,7 +471,7 @@ mgKeyTrack::Parts(mgmySql &db,bool orderby) const
if (orderby)
{
// if you change tracks.title, please also
- // change mgContentItem::getKeyValue()
+ // change mgContentItem::getKeyItem()
result.fields.push_back("tracks.title");
result.orders.push_back("tracks.tracknb");
}
@@ -656,7 +721,7 @@ mgOrder::InitFrom(const mgOrder &from)
for (unsigned int i = 0; i < from.size();i++)
{
mgKey *k = ktGenerate(from.getKeyType(i));
- k->set(from.getKeyValue(i),from.getKeyId(i));
+ k->set(from.getKeyItem(i));
Keys.push_back(k);
}
m_orderByCount=from.m_orderByCount;
@@ -737,18 +802,11 @@ mgOrder::getKeyType(unsigned int idx) const
return Keys[idx]->Type();
}
-string
-mgOrder::getKeyValue(unsigned int idx) const
-{
- assert(idx<Keys.size());
- return Keys[idx]->value();
-}
-
-string
-mgOrder::getKeyId(unsigned int idx) const
+mgSelItem&
+mgOrder::getKeyItem(unsigned int idx) const
{
assert(idx<Keys.size());
- return Keys[idx]->id();
+ return Keys[idx]->get();
}
void
@@ -861,8 +919,7 @@ mgOrder::Parts(mgmySql &db,unsigned int level,bool orderby) const
if (kn)
{
mgKeyTypes knt = kn->Type();
- if (iskeyGenre(knt)
- && knt>kt && kn->id()!=EMPTY)
+ if (iskeyGenre(knt) && knt>kt && !kn->id().empty())
goto next;
}
}
@@ -962,7 +1019,9 @@ ktGenerate(const mgKeyTypes kt)
case keyFolder3:result = new mgKeyFolder3;break;
case keyFolder4:result = new mgKeyFolder4;break;
case keyArtist: result = new mgKeyNormal(kt,"tracks","artist");break;
+ case keyArtistABC: result = new mgKeyABC(kt,"tracks","artist");break;
case keyTitle: result = new mgKeyNormal(kt,"tracks","title");break;
+ case keyTitleABC: result = new mgKeyABC(kt,"tracks","title");break;
case keyTrack: result = new mgKeyTrack;break;
case keyDecade: result = new mgKeyDecade;break;
case keyAlbum: result = new mgKeyAlbum;break;
@@ -992,7 +1051,9 @@ ktName(const mgKeyTypes kt)
case keyFolder3: result = "Folder3";break;
case keyFolder4: result = "Folder4";break;
case keyArtist: result = "Artist";break;
+ case keyArtistABC: result = "ArtistABC";break;
case keyTitle: result = "Title";break;
+ case keyTitleABC: result = "TitleABC";break;
case keyTrack: result = "Track";break;
case keyDecade: result = "Decade";break;
case keyAlbum: result = "Album";break;