00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00031
00032 #ifndef __SQL_STORAGE_H__
00033 #define __SQL_STORAGE_H__
00034
00035 #include "zmmf/zmmf.h"
00036 #include "cds_objects.h"
00037 #include "dictionary.h"
00038 #include "storage.h"
00039 #include "hash.h"
00040 #include "sync.h"
00041 #include "storage_cache.h"
00042
00043 #define QTB table_quote_begin
00044 #define QTE table_quote_end
00045
00046 #define CDS_OBJECT_TABLE "mt_cds_object"
00047 #define CDS_ACTIVE_ITEM_TABLE "mt_cds_active_item"
00048 #define INTERNAL_SETTINGS_TABLE "mt_internal_setting"
00049 #define AUTOSCAN_TABLE "mt_autoscan"
00050
00051 class SQLResult;
00052
00053 class SQLRow : public zmm::Object
00054 {
00055 public:
00056 SQLRow(zmm::Ref<SQLResult> sqlResult) { this->sqlResult = sqlResult; }
00057
00058 zmm::String col(int index) { return col_c_str(index); }
00059 virtual char* col_c_str(int index) = 0;
00060 protected:
00061 zmm::Ref<SQLResult> sqlResult;
00062 };
00063
00064 class SQLResult : public zmm::Object
00065 {
00066 public:
00067
00068
00069 virtual zmm::Ref<SQLRow> nextRow() = 0;
00070 virtual unsigned long long getNumRows() = 0;
00071 };
00072
00073 class SQLStorage : protected Storage
00074 {
00075 public:
00076
00077 virtual zmm::String quote(zmm::String str) = 0;
00078 virtual zmm::String quote(int val) = 0;
00079 virtual zmm::String quote(unsigned int val) = 0;
00080 virtual zmm::String quote(long val) = 0;
00081 virtual zmm::String quote(unsigned long val) = 0;
00082 virtual zmm::String quote(bool val) = 0;
00083 virtual zmm::String quote(char val) = 0;
00084 virtual zmm::Ref<SQLResult> select(const char *query, int length) = 0;
00085 virtual int exec(const char *query, int length, bool getLastInsertId = false) = 0;
00086
00087 void dbReady();
00088
00089
00090 zmm::Ref<SQLResult> select(zmm::Ref<zmm::StringBuffer> buf)
00091 { return select(buf->c_str(), buf->length()); }
00092 int exec(zmm::Ref<zmm::StringBuffer> buf, bool getLastInsertId = false)
00093 { return exec(buf->c_str(), buf->length(), getLastInsertId); }
00094
00095 virtual void addObject(zmm::Ref<CdsObject> object, int *changedContainer);
00096 virtual void updateObject(zmm::Ref<CdsObject> object, int *changedContainer);
00097
00098 virtual zmm::Ref<CdsObject> loadObject(int objectID);
00099 virtual int getChildCount(int contId, bool containers, bool items, bool hideFsRoot);
00100
00101
00102
00103 virtual zmm::Ref<DBRHash<int> > getObjects(int parentID, bool withoutContainer);
00104
00105 virtual zmm::Ref<ChangedContainers> removeObject(int objectID, bool all);
00106 virtual zmm::Ref<ChangedContainers> removeObjects(zmm::Ref<DBRHash<int> > list, bool all = false);
00107
00108 virtual zmm::Ref<CdsObject> loadObjectByServiceID(zmm::String serviceID);
00109 virtual zmm::Ref<zmm::IntArray> getServiceObjectIDs(char servicePrefix);
00110
00111
00112 virtual int getTotalFiles();
00113
00114 virtual zmm::Ref<zmm::Array<CdsObject> > browse(zmm::Ref<BrowseParam> param);
00115 virtual zmm::Ref<zmm::Array<zmm::StringBase> > getMimeTypes();
00116
00117
00118 virtual zmm::Ref<CdsObject> findObjectByPath(zmm::String fullpath);
00119 virtual int findObjectIDByPath(zmm::String fullpath);
00120 virtual zmm::String incrementUpdateIDs(int *ids, int size);
00121
00122 virtual zmm::String buildContainerPath(int parentID, zmm::String title);
00123 virtual void addContainerChain(zmm::String path, zmm::String lastClass,
00124 int lastRefID, int *containerID, int *updateID);
00125 virtual zmm::String getInternalSetting(zmm::String key);
00126 virtual void storeInternalSetting(zmm::String key, zmm::String value) = 0;
00127
00128 virtual void updateAutoscanPersistentList(scan_mode_t scanmode, zmm::Ref<AutoscanList> list);
00129 virtual zmm::Ref<AutoscanList> getAutoscanList(scan_mode_t scanmode);
00130 virtual void addAutoscanDirectory(zmm::Ref<AutoscanDirectory> adir);
00131 virtual void updateAutoscanDirectory(zmm::Ref<AutoscanDirectory> adir);
00132 virtual void removeAutoscanDirectoryByObjectID(int objectID);
00133 virtual void removeAutoscanDirectory(int autoscanID);
00134 virtual int getAutoscanDirectoryType(int objectId);
00135 virtual int isAutoscanDirectoryRecursive(int objectId);
00136 virtual void autoscanUpdateLM(zmm::Ref<AutoscanDirectory> adir);
00137 virtual zmm::Ref<AutoscanDirectory> getAutoscanDirectory(int objectID);
00138 virtual int isAutoscanChild(int objectID);
00139 virtual void checkOverlappingAutoscans(zmm::Ref<AutoscanDirectory> adir);
00140
00141 virtual zmm::Ref<zmm::IntArray> getPathIDs(int objectID);
00142
00143 virtual void shutdown();
00144 virtual void shutdownDriver() = 0;
00145
00146 virtual int ensurePathExistence(zmm::String path, int *changedContainer);
00147
00148 virtual zmm::String getFsRootName();
00149
00150 virtual void clearFlagInDB(int flag);
00151
00152 protected:
00153 SQLStorage();
00154
00155 virtual void init();
00156
00157 char table_quote_begin;
00158 char table_quote_end;
00159
00160 private:
00161
00162 class ChangedContainersStr : public Object
00163 {
00164 public:
00165 ChangedContainersStr()
00166 {
00167 upnp = zmm::Ref<zmm::StringBuffer>(new zmm::StringBuffer());
00168 ui = zmm::Ref<zmm::StringBuffer>(new zmm::StringBuffer());
00169 }
00170 zmm::Ref<zmm::StringBuffer> upnp;
00171 zmm::Ref<zmm::StringBuffer> ui;
00172 };
00173
00174 zmm::String sql_query;
00175
00176
00177 zmm::String getRealLocation(int parentID, zmm::String location);
00178
00179 zmm::Ref<CdsObject> createObjectFromRow(zmm::Ref<SQLRow> row);
00180
00181
00182 zmm::Ref<CdsObject> _findObjectByPath(zmm::String fullpath);
00183
00184 int _ensurePathExistence(zmm::String path, int *changedContainer);
00185
00186
00187 class AddUpdateTable : public Object
00188 {
00189 public:
00190 AddUpdateTable(zmm::String table, zmm::Ref<Dictionary> dict)
00191 {
00192 this->table = table;
00193 this->dict = dict;
00194 }
00195 zmm::String getTable() { return table; }
00196 zmm::Ref<Dictionary> getDict() { return dict; }
00197 protected:
00198 zmm::String table;
00199 zmm::Ref<Dictionary> dict;
00200 };
00201 zmm::Ref<zmm::Array<AddUpdateTable> > _addUpdateObject(zmm::Ref<CdsObject> obj, bool isUpdate, int *changedContainer);
00202
00203
00204 void _removeObjects(zmm::Ref<zmm::StringBuffer> objectIDs, int offset);
00205 zmm::Ref<ChangedContainersStr> _recursiveRemove(zmm::Ref<zmm::StringBuffer> items, zmm::Ref<zmm::StringBuffer> containers, bool all);
00206
00207 virtual zmm::Ref<ChangedContainers> _purgeEmptyContainers(zmm::Ref<ChangedContainersStr> changedContainersStr);
00208
00209
00210 int _getAutoscanObjectID(int autoscanID);
00211 void _autoscanChangePersistentFlag(int objectID, bool persistent);
00212 zmm::Ref<AutoscanDirectory> _fillAutoscanDirectory(zmm::Ref<SQLRow> row);
00213 int _getAutoscanDirectoryInfo(int objectID, zmm::String field);
00214 zmm::Ref<zmm::IntArray> _checkOverlappingAutoscans(zmm::Ref<AutoscanDirectory> adir);
00215
00216
00217 zmm::String addLocationPrefix(char prefix, zmm::String path);
00218 zmm::String stripLocationPrefix(char* prefix, zmm::String path);
00219 zmm::String stripLocationPrefix(zmm::String path);
00220
00221 zmm::Ref<CdsObject> checkRefID(zmm::Ref<CdsObject> obj);
00222 int createContainer(int parentID, zmm::String name, zmm::String path, bool isVirtual, zmm::String upnpClass, int refID);
00223
00224 zmm::String mapBool(bool val) { return quote((val ? 1 : 0)); }
00225 bool remapBool(zmm::String field) { return (string_ok(field) && field == "1"); }
00226
00227 void setFsRootName(zmm::String rootName = nil);
00228
00229 zmm::String fsRootName;
00230
00231 int lastID;
00232
00233 int getNextID();
00234 void loadLastID();
00235 zmm::Ref<Mutex> nextIDMutex;
00236
00237 zmm::Ref<StorageCache> cache;
00238 inline bool cacheOn() { return cache != nil; }
00239 void addObjectToCache(zmm::Ref<CdsObject> object, bool dontLock = false);
00240
00241 inline bool doInsertBuffering() { return insertBufferOn; }
00242 void addToInsertBuffer(zmm::Ref<zmm::StringBuffer> query);
00243 void flushInsertBuffer(bool dontLock = false);
00244
00245
00246 virtual void _addToInsertBuffer(zmm::Ref<zmm::StringBuffer> query) = 0;
00247 virtual void _flushInsertBuffer() = 0;
00248
00249 bool insertBufferOn;
00250 bool insertBufferEmpty;
00251 int insertBufferStatementCount;
00252 int insertBufferByteCount;
00253 zmm::Ref<Mutex> insertBufferMutex;
00254 };
00255
00256 #endif // __SQL_STORAGE_H__