/Classes/GnosusXmpp/Models/ServiceItemModel.m

https://github.com/troystribling/streethak · Objective C · 304 lines · 228 code · 35 blank · 41 comment · 48 complexity · 8af615ae828ab14a5c8dc6f85113cd69 MD5 · raw file

  1. //
  2. // ServiceItemModel.m
  3. // webgnosus
  4. //
  5. // Created by Troy Stribling on 8/5/09.
  6. // Copyright 2009 Plan-B Research. All rights reserved.
  7. //
  8. //-----------------------------------------------------------------------------------------------------------------------------------
  9. #import "ServiceItemModel.h"
  10. #import "UserModel.h"
  11. #import "WebgnosusDbi.h"
  12. #import "XMPPJID.h"
  13. #import "XMPPDiscoItem.h"
  14. #import "NSObjectWebgnosus.h"
  15. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  16. @interface ServiceItemModel (PrivateAPI)
  17. @end
  18. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  19. @implementation ServiceItemModel
  20. //-----------------------------------------------------------------------------------------------------------------------------------
  21. @synthesize pk;
  22. @synthesize parentNode;
  23. @synthesize service;
  24. @synthesize node;
  25. @synthesize jid;
  26. @synthesize itemName;
  27. //===================================================================================================================================
  28. #pragma mark ServiceItemModel
  29. //-----------------------------------------------------------------------------------------------------------------------------------
  30. + (NSInteger)count {
  31. return [[WebgnosusDbi instance] selectIntExpression:@"SELECT COUNT(pk) FROM serviceItems"];
  32. }
  33. //-----------------------------------------------------------------------------------------------------------------------------------
  34. + (NSInteger)countByService:(NSString*)requestService andParentNode:(NSString*)requestNode {
  35. NSString* selectStatement;
  36. if (requestNode) {
  37. selectStatement = [NSString stringWithFormat:@"SELECT COUNT(pk) FROM serviceItems WHERE parentNode = '%@' AND service LIKE '%@%%'", requestNode, requestService];
  38. } else {
  39. selectStatement = [NSString stringWithFormat:@"SELECT COUNT(pk) FROM serviceItems WHERE parentNode IS NULL AND service LIKE '%@%%'", requestService];
  40. }
  41. return [[WebgnosusDbi instance] selectIntExpression:selectStatement];
  42. }
  43. //-----------------------------------------------------------------------------------------------------------------------------------
  44. + (void)drop {
  45. [[WebgnosusDbi instance] updateWithStatement:@"DROP TABLE serviceItems"];
  46. }
  47. //-----------------------------------------------------------------------------------------------------------------------------------
  48. + (void)create {
  49. [[WebgnosusDbi instance] updateWithStatement:@"CREATE TABLE serviceItems (pk integer primary key, parentNode text, service text, node text, jid text, itemName text)"];
  50. }
  51. //-----------------------------------------------------------------------------------------------------------------------------------
  52. + (NSMutableArray*)findAll {
  53. NSMutableArray* output = [NSMutableArray arrayWithCapacity:10];
  54. [[WebgnosusDbi instance] selectAllForModel:[ServiceItemModel class] withStatement:@"SELECT * FROM serviceItems" andOutputTo:output];
  55. return output;
  56. }
  57. //-----------------------------------------------------------------------------------------------------------------------------------
  58. + (NSMutableArray*)findAllByParentNode:(NSString*)requestNode {
  59. NSString* selectStatement = [NSString stringWithFormat:@"SELECT * FROM serviceItems WHERE parentNode = '%@'", requestNode];
  60. NSMutableArray* output = [NSMutableArray arrayWithCapacity:10];
  61. [[WebgnosusDbi instance] selectAllForModel:[ServiceItemModel class] withStatement:selectStatement andOutputTo:output];
  62. return output;
  63. }
  64. //-----------------------------------------------------------------------------------------------------------------------------------
  65. + (NSMutableArray*)findAllByService:(NSString*)requestService andParentNode:(NSString*)requestNode {
  66. NSString* selectStatement;
  67. if (requestNode) {
  68. selectStatement = [NSString stringWithFormat:@"SELECT DISTINCT * FROM serviceItems WHERE parentNode = '%@' AND service LIKE '%@%%'", requestNode, requestService];
  69. } else {
  70. selectStatement = [NSString stringWithFormat:@"SELECT DISTINCT * FROM serviceItems WHERE parentNode IS NULL AND service LIKE '%@%%'", requestService];
  71. }
  72. NSMutableArray* output = [NSMutableArray arrayWithCapacity:10];
  73. [[WebgnosusDbi instance] selectAllForModel:[ServiceItemModel class] withStatement:selectStatement andOutputTo:output];
  74. return output;
  75. }
  76. //-----------------------------------------------------------------------------------------------------------------------------------
  77. + (NSMutableArray*)findAllByService:(NSString*)requestService parentNode:(NSString*)requestParentNode andNode:(NSString*)requestNode {
  78. NSString* selectStatement = [NSString stringWithFormat:@"SELECT DISTINCT * FROM serviceItems WHERE parentNode = '%@' AND node = '%@' AND service LIKE '%@%%'",
  79. requestParentNode, requestNode, requestService];
  80. NSMutableArray* output = [NSMutableArray arrayWithCapacity:10];
  81. [[WebgnosusDbi instance] selectAllForModel:[ServiceItemModel class] withStatement:selectStatement andOutputTo:output];
  82. return output;
  83. }
  84. //-----------------------------------------------------------------------------------------------------------------------------------
  85. + (ServiceItemModel*)findByJID:(NSString*)requestJID {
  86. NSString* selectStatement = [NSString stringWithFormat:@"SELECT * FROM serviceItems WHERE jid = '%@' LIMIT 1", requestJID];
  87. ServiceItemModel* model = [[[ServiceItemModel alloc] init] autorelease];
  88. [[WebgnosusDbi instance] selectForModel:[ServiceItemModel class] withStatement:selectStatement andOutputTo:model];
  89. if (model.pk == 0) {
  90. model = nil;
  91. }
  92. return model;
  93. }
  94. //-----------------------------------------------------------------------------------------------------------------------------------
  95. + (ServiceItemModel*)findByNode:(NSString*)requestNode {
  96. NSString* selectStatement = [NSString stringWithFormat:@"SELECT * FROM serviceItems WHERE node ='%@' LIMIT 1", requestNode];
  97. ServiceItemModel* model = [[[ServiceItemModel alloc] init] autorelease];
  98. [[WebgnosusDbi instance] selectForModel:[ServiceItemModel class] withStatement:selectStatement andOutputTo:model];
  99. if (model.pk == 0) {
  100. model = nil;
  101. }
  102. return model;
  103. }
  104. //-----------------------------------------------------------------------------------------------------------------------------------
  105. + (ServiceItemModel*)findByService:(NSString*)requestService andNode:(NSString*)requestNode {
  106. NSString* selectStatement = [NSString stringWithFormat:@"SELECT * FROM serviceItems WHERE node ='%@' AND service = '%@' LIMIT 1", requestNode, requestService];
  107. ServiceItemModel* model = [[[ServiceItemModel alloc] init] autorelease];
  108. [[WebgnosusDbi instance] selectForModel:[ServiceItemModel class] withStatement:selectStatement andOutputTo:model];
  109. if (model.pk == 0) {
  110. model = nil;
  111. }
  112. return model;
  113. }
  114. //-----------------------------------------------------------------------------------------------------------------------------------
  115. + (ServiceItemModel*)findByService:(NSString*)requestService {
  116. NSString* selectStatement = [NSString stringWithFormat:@"SELECT * FROM serviceItems WHERE node IS NULL AND service = '%@' LIMIT 1", requestService];
  117. ServiceItemModel* model = [[[ServiceItemModel alloc] init] autorelease];
  118. [[WebgnosusDbi instance] selectForModel:[ServiceItemModel class] withStatement:selectStatement andOutputTo:model];
  119. if (model.pk == 0) {
  120. model = nil;
  121. }
  122. return model;
  123. }
  124. //-----------------------------------------------------------------------------------------------------------------------------------
  125. + (ServiceItemModel*)findByJID:(NSString*)requestJID andNode:(NSString*)requestNode {
  126. NSString* selectStatement;
  127. if (requestNode) {
  128. selectStatement = [NSString stringWithFormat:@"SELECT * FROM serviceItems WHERE jid = '%@' AND node ='%@'", requestJID, requestNode];
  129. } else {
  130. selectStatement = [NSString stringWithFormat:@"SELECT * FROM serviceItems WHERE jid = '%@'", requestJID];
  131. }
  132. ServiceItemModel* model = [[[ServiceItemModel alloc] init] autorelease];
  133. [[WebgnosusDbi instance] selectForModel:[ServiceItemModel class] withStatement:selectStatement andOutputTo:model];
  134. if (model.pk == 0) {
  135. model = nil;
  136. }
  137. return model;
  138. }
  139. //-----------------------------------------------------------------------------------------------------------------------------------
  140. + (void)destroyAll {
  141. [[WebgnosusDbi instance] updateWithStatement:@"DELETE FROM serviceItems"];
  142. }
  143. //-----------------------------------------------------------------------------------------------------------------------------------
  144. + (void)insert:(XMPPDiscoItem*)item forService:(XMPPJID*)serviceJID andParentNode:(NSString*)parent {
  145. NSString* itemNode = [item node];
  146. if (!itemNode) {
  147. itemNode = [item iname];
  148. }
  149. ServiceItemModel* model = [ServiceItemModel findByJID:[[item JID] full] andNode:itemNode];
  150. if (!model) {
  151. ServiceItemModel* serviceItem = [[ServiceItemModel alloc] init];
  152. if (parent) {
  153. if (![parent isEqualToString:@""]) {
  154. serviceItem.parentNode = parent;
  155. }
  156. }
  157. if ([item iname]) {
  158. serviceItem.itemName = [item iname];
  159. } else {
  160. serviceItem.itemName = itemNode;
  161. }
  162. if ([item JID]) {
  163. serviceItem.jid = [[item JID] full];
  164. }
  165. serviceItem.node = itemNode;
  166. serviceItem.service = [serviceJID full];
  167. [serviceItem insert];
  168. [serviceItem release];
  169. } else {
  170. [model update];
  171. }
  172. }
  173. //-----------------------------------------------------------------------------------------------------------------------------------
  174. + (void)destroyAllByService:(NSString*)requestService {
  175. NSString* deleteStatement = [NSString stringWithFormat:@"DELETE FROM serviceItems WHERE service LIKE '%%%@'", requestService];
  176. [[WebgnosusDbi instance] updateWithStatement:deleteStatement];
  177. }
  178. //-----------------------------------------------------------------------------------------------------------------------------------
  179. + (void)destroyAllByService:(NSString*)requestService andParentNode:(NSString*)requestNode {
  180. NSString* deleteStatement = [NSString stringWithFormat:@"DELETE FROM serviceItems WHERE service LIKE '%%%@' AND parentNode = '%@'", requestService, requestNode];
  181. [[WebgnosusDbi instance] updateWithStatement:deleteStatement];
  182. }
  183. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  184. //-----------------------------------------------------------------------------------------------------------------------------------
  185. - (void)insert {
  186. NSString* insertStatement;
  187. if (self.parentNode && self.node && self.itemName) {
  188. insertStatement = [NSString stringWithFormat:@"INSERT INTO serviceItems (parentNode, service, node, jid, itemName) values ('%@', '%@', '%@', '%@', '%@')",
  189. self.parentNode, self.service, self.node, self.jid, self.itemName];
  190. } else if (self.node && self.itemName) {
  191. insertStatement = [NSString stringWithFormat:@"INSERT INTO serviceItems (service, node, jid, itemName) values ('%@', '%@', '%@', '%@')",
  192. self.service, self.node, self.jid, self.itemName];
  193. } else {
  194. insertStatement = [[NSString alloc] initWithFormat:@"INSERT INTO serviceItems (service, jid) values ('%@', '%@')", self.service, self.jid];
  195. }
  196. [[WebgnosusDbi instance] updateWithStatement:insertStatement];
  197. }
  198. //-----------------------------------------------------------------------------------------------------------------------------------
  199. - (void)destroy {
  200. NSString* destroyStatement = [NSString stringWithFormat:@"DELETE FROM serviceItems WHERE pk = %d", self.pk];
  201. [[WebgnosusDbi instance] updateWithStatement:destroyStatement];
  202. }
  203. //-----------------------------------------------------------------------------------------------------------------------------------
  204. - (void)load {
  205. NSString* selectStatement = [NSString stringWithFormat:@"SELECT * FROM serviceItems WHERE parentNode = '%@' AND service = '%@' AND node = '%@' AND jid = '%@'",
  206. self.parentNode, self.service, self.node, self.jid];
  207. [[WebgnosusDbi instance] selectForModel:[ServiceItemModel class] withStatement:selectStatement andOutputTo:self];
  208. }
  209. //-----------------------------------------------------------------------------------------------------------------------------------
  210. - (void)update {
  211. NSString* updateStatement;
  212. if (self.parentNode && self.node && self.itemName) {
  213. updateStatement = [NSString stringWithFormat:@"UPDATE serviceItems SET parentNode = '%@', service = '%@', node = '%@', jid = '%@', itemName = '%@' WHERE pk = %d",
  214. self.parentNode, self.service, self.node, self.jid, self.itemName, self.pk];
  215. } else if (self.node && self.itemName) {
  216. updateStatement = [NSString stringWithFormat:@"UPDATE serviceItems SET service = '%@', node = '%@', jid = '%@', itemName = '%@' WHERE pk = %d",
  217. self.service, self.node, self.jid, self.itemName, self.pk];
  218. } else {
  219. updateStatement = [NSString stringWithFormat:@"UPDATE serviceItems SET service = '%@', jid = '%@' WHERE pk = %d",
  220. self.service, self.jid, self.pk];
  221. }
  222. [[WebgnosusDbi instance] updateWithStatement:updateStatement];
  223. }
  224. //===================================================================================================================================
  225. #pragma mark ServiceItemModel PrivateAPI
  226. //===================================================================================================================================
  227. #pragma mark WebgnosusDbiDelegate
  228. //-----------------------------------------------------------------------------------------------------------------------------------
  229. - (void)setAttributesWithStatement:(sqlite3_stmt*)statement {
  230. self.pk = (int)sqlite3_column_int(statement, 0);
  231. char* parentNodeVal = (char*)sqlite3_column_text(statement, 1);
  232. if (parentNodeVal != nil) {
  233. self.parentNode = [[NSString alloc] initWithUTF8String:parentNodeVal];
  234. }
  235. char* serviceVal = (char*)sqlite3_column_text(statement, 2);
  236. if (serviceVal != nil) {
  237. self.service = [[NSString alloc] initWithUTF8String:serviceVal];
  238. }
  239. char* nodeVal = (char*)sqlite3_column_text(statement, 3);
  240. if (nodeVal != nil) {
  241. self.node = [[NSString alloc] initWithUTF8String:nodeVal];
  242. }
  243. char* jidVal = (char*)sqlite3_column_text(statement, 4);
  244. if (jidVal != nil) {
  245. self.jid = [[NSString alloc] initWithUTF8String:jidVal];
  246. }
  247. char* inameVal = (char*)sqlite3_column_text(statement, 5);
  248. if (inameVal != nil) {
  249. self.itemName = [[NSString alloc] initWithUTF8String:inameVal];
  250. }
  251. }
  252. //-----------------------------------------------------------------------------------------------------------------------------------
  253. + (void)collectAllFromResult:(sqlite3_stmt*)result andOutputTo:(NSMutableArray*)output {
  254. ServiceItemModel* model = [[ServiceItemModel alloc] init];
  255. [model setAttributesWithStatement:result];
  256. [output addObject:model];
  257. [model release];
  258. }
  259. //-----------------------------------------------------------------------------------------------------------------------------------
  260. + (void)collectFromResult:(sqlite3_stmt*)result andOutputTo:(id)output {
  261. [output setAttributesWithStatement:result];
  262. }
  263. //===================================================================================================================================
  264. #pragma mark NSObject
  265. //-----------------------------------------------------------------------------------------------------------------------------------
  266. - (void)dealloc {
  267. [super dealloc];
  268. }
  269. @end