All pastes #487919 Raw Edit

Mad Conf api :)

public cpp v1 · immutable
·published 2007-05-14 18:54 UTC
rendered paste body
#ifndef __MADCONF_H__#define __MADCONF_H__#include <qstring.h>#include <qcstring.h>#include "MadSQLite.h"/*tables:Key:id, pid, typeid, name, dataiddata:id, datadata possibilities:id, typeid, datatype ids: val, val list, mult choice|single val, mult choice|mult val*/extern const char sql_create_key_table[];extern const char sql_create_data_table[];extern const char sql_create_data_opt_table[];enum {	MCKT_VALUE = 1,	MCKT_VALUE_LIST,	MCKT_MCAV, // mult choice, any value (like for an editable combo box, like a union of a VALUE_LIST and MCMV :))	MCKT_MCSV, // mult choice, single value	MCKT_MCMV, // mult choice, mult value};class MadConf;// Got an idea from The_Vulture on #C++@freenode// methods returning an object byvalue, change to return error, and take object by reference.class MadConfKeyValue {	friend class MadConfKey;			public:		MadConfKeyValue() : conf(0), id(0) { }		MadConfKeyValue(MadConf *cnf, int i, const char *c) : conf(cnf), id(i), value(c) { }		int getInt() { return value.toInt(); }		bool getBool() { return (bool)value.toInt(); }		const char *getText() { return (const char *)value; }		double getDouble() { return value.toDouble(); }		bool set(int);		bool set(bool);		bool set(const char *);		bool set(double);		void erase();		operator bool() { return valid(); }		bool operator!() { return !valid(); }		bool valid() { return (bool)((conf != 0) ? true : false); }			private:		MadConf *conf;		int id;		QString value;};class MadConfKeyOpt {	friend class MadConfKey;			public:		MadConfKeyOpt() : conf(0), id(0) { }		MadConfKeyOpt(MadConf *cnf, int i, const char *c) : conf(cnf), id(i), value(c) { }		int getInt() { return value.toInt(); }		bool getBool() { return (bool)value.toInt(); }		const char *getText() { return (const char *)value; }		double getDouble() { return value.toDouble(); }		bool set(int);		bool set(bool);		bool set(const char *);		bool set(double);		void erase();				operator bool() { return valid(); }		bool operator!() { return !valid(); }		bool valid() { return (bool)((conf != 0) ? true : false); }			private:		MadConf *conf;		int id;		QString value;};class MadConfKey {	friend class MadConf;		public:		MadConfKey() : key(0), id(-1), type(0), conf(0), value_result(0), child_result(0), opt_result(0) { }		MadConfKey(MadConf *, int, int, const char *);		~MadConfKey();		operator bool() { return valid(); }		bool operator!() { return !valid(); }				MadConfKey(const MadConfKey& ck)		{			id   = ck.id;			key  = ck.key;			type = ck.type;			conf = ck.conf;						value_result = child_result = opt_result = 0;						printf("Key copy constructor: %s(%i)\n", (const char *)key, id);		}				MadConfKey &operator=(const MadConfKey &ck)		{			id   = ck.id;			key  = ck.key;			type = ck.type;			conf = ck.conf;						if(value_result)				delete value_result;						if(child_result)				delete child_result;						if(opt_result)				delete opt_result;									value_result = child_result = opt_result = 0;						printf("Key copy assign: %s(%i)\n", (const char *)key, id);						return *this;		}				bool valid() { return (bool)((conf != 0) ? true : false); }		int getId() { return id; }		QString name();		bool setName(const char *);		int getType() { return type; }		bool setType(int t);					int getValueCount() { return ValueCount; }		// maybe do something funky here with references?		bool beginValue();		bool value(MadConfKeyValue &);		bool step(MadConfKeyValue &);		bool addValue(MadConfKeyValue &, const char *);		bool beginOpt();		bool step(MadConfKeyOpt &);		bool addOpt(MadConfKeyOpt &, const char *);				// Funky, calling setValue() will invalidate any MadConfKeyValues that are allocated...		int getChildCount() { return ChildCount; }		bool child(MadConfKey &, const char *); // obviously messes up the first/next stuff		bool beginChild();		bool step(MadConfKey &);		bool newChild(MadConfKey &, const char *keyname, int type = MCKT_VALUE);	//	MadConfKey *getParent();		bool erase();		inline bool setAutoCommit(bool ac) { AutoCommitSet = true; bool old = AutoCommit; AutoCommit = ac; return old; }		inline bool isAutoCommitEnabled() { return (AutoCommitSet && AutoCommit) || (!AutoCommitSet && AUTO_COMMIT); }		static bool AUTO_COMMIT;		bool isType(int t) { return t == type; }		void fin() {			if(value_result)				delete value_result;						if(child_result)				delete child_result;						if(opt_result)				delete opt_result;						value_result = child_result = opt_result = 0;		}	private:		int ChildCount;		int ValueCount;		bool AutoCommitSet, AutoCommit;		QString key;		int id;		int type;		MadConf *conf;		MadSQLiteResult *value_result, *child_result, *opt_result;		bool insert_key();		bool delete_key(int kid);};class MadConf {	friend class MadConfKey;	friend class MadConfKeyValue;	friend class MadConfKeyOpt;	public:		MadConf(const char *);		~MadConf();		bool beginKey();		bool step(MadConfKey &);		bool key(MadConfKey &, const char *key);		bool key(MadConfKey &, int id);		bool newKey(MadConfKey &, const char *key, int type = MCKT_VALUE);		MadSQLite *getDB() { return db; }	private:		MadSQLite *db;		MadSQLiteResult *result;		bool initDB();};#if 0MadConfKey *key = conf->newKey("foo"); // default type is single choice, single valuekey->setVaue("foo");MadConfKey *child = key->addChild("lala", MCKT_MCSV); // Multiple Choice, Single Valuechild->addChoice("foo");child->addChoice("bar");child->addChoice("baz");child->addChoice("frob");child->setValue("foob"); // failsMadConfKey *child2 = key->addChild("meep", MCKT_MCMV); // Multiple Choice, Multiple Valuechild->addChoice("foo");child->addChoice("bar");child->addChoice("baz");child->addChoice("frob");child->setValue("foo"); // clears all values, and sets this,child->addValue("bar"); // adds bar, so now child2 == foo, barfor(val = child->firstValue(); val; val = child->nextValue()) {	printf("value: %s\n", val->getText());}for(ckey = key->fisrtChild(); ckey; ckey = key->nextChild()) {	printf("child: %s\n", ckey->name());}#endif#endif /* __MADCONF_H__ */