summaryrefslogtreecommitdiff
path: root/mg_order.h
blob: d46f244b298385b2d2a495f6c319d1f37ed1f652 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#ifndef _MG_SQL_H
#define _MG_SQL_H
#include <stdlib.h>
#include <mysql/mysql.h>
#include <typeinfo>
#include <string>
#include <assert.h>
#include <list>
#include <vector>
#include <iostream>
#include <istream>
#include <sstream>
#include <ostream>

using namespace std;

typedef list<string> strlist;

strlist& operator+=(strlist&a, strlist b);

static const string EMPTY = "XNICHTGESETZTX";

//! \brief adds string n to string s, using string sep to separate them
string& addsep (string & s, string sep, string n);

enum mgKeyTypes {
	keyGenre1 = 1,
	keyGenre2,
	keyArtist,
	keyTitle,
	keyTrack,
	keyDecade,
	keyCollection,
	keyCollectionItem,
	keyAlbum,
	keyLanguage,
	keyRating,
	keyYear,
};
const mgKeyTypes mgKeyTypesHigh = keyYear;

class mgParts;

class mgReference {
	public:
		mgReference(string t1,string f1,string t2,string f2);
                string t1() const { return m_t1; }
                string t2() const { return m_t2; }
                string f1() const { return m_f1; }
                string f2() const { return m_f2; }
	private:
		string m_t1;
		string m_t2;
		string m_f1;
		string m_f2;
};

class mgReferences : public vector<mgReference> {
public:
	// \todo memory leak for vector ref?
	mgReferences();
	mgParts Connect(string c1, string c2) const;
private:
	bool Equal(unsigned int i,string table1, string table2) const;
	mgParts FindConnectionBetween(string table1, string table2) const;
	mgParts ConnectToTracks(string table) const;
};

class mgKey {
	public:
		mgKey();
		virtual ~mgKey();
		virtual mgParts Parts(bool orderby=false) const = 0;
		virtual string id() const = 0;
		virtual string value () const = 0;
		//!\brief translate field into user friendly string
		virtual void set(string value, string id) = 0;
		virtual mgKeyTypes Type() const = 0;
		virtual string map_idfield() const { return ""; }
		virtual string map_valuefield() const { return ""; }
		virtual string map_valuetable() const { return ""; }
		void setdb(MYSQL *db) { m_db = db; }
	protected:
		MYSQL *m_db;
};


mgKey*
ktGenerate(const mgKeyTypes kt,MYSQL *db);

const char * const
ktName(const mgKeyTypes kt);

typedef vector<mgKey*> keyvector;

class mgParts {
public:
	mgParts();
	~mgParts();
	strlist fields;
	strlist tables;
	strlist clauses;
	strlist orders;
	mgParts& operator+=(mgParts a);
	void Prepare();
	string sql_count();
	string sql_select(bool distinct=true);
	string sql_delete_from_collection(string pid);
	string sql_update(strlist new_values);
	bool empty() const { return tables.size()==0;}
private:
	bool UsesTracks();
	mgReferences ref;
};

string
sql_string (MYSQL *db, const string s);

MYSQL_RES * exec_sql (MYSQL *db,string query);

//! \brief converts long to string
string itos (int i);

//! \brief convert long to string
string ltos (long l);


const unsigned int MaxKeys = 20;

class mgOrder {
public:
	mgOrder();
	void setDB(MYSQL *db);
	mgParts Parts(unsigned int level,bool orderby=true) const;
	string Name;
	const mgOrder& operator=(const mgOrder& from);
	mgOrder& operator+=(mgKey* k);
	mgKey*& operator[](unsigned int idx);
	unsigned int size() const { return Keys.size(); }
	void truncate(unsigned int i);
	bool empty() const { return Keys.empty(); }
	void clear() { Keys.clear();}
	void clean();
	mgKey* Key(unsigned int idx) const;
	mgKey* find(const mgKeyTypes kt) ;
	mgKeyTypes getKeyType(unsigned int idx) const;
	string getKeyValue(unsigned int idx) const;
	string getKeyId(unsigned int idx) const;
private:
	MYSQL *m_db;
	keyvector Keys;
};

#endif               // _MG_SQL_H