/Classes/GnosusXmpp/Models/MessageModel.m

https://github.com/troystribling/streethak · Objective C · 551 lines · 426 code · 60 blank · 65 comment · 55 complexity · da41bfeabe1dd2e2501b09af23ffc595 MD5 · raw file

  1. //
  2. // MessageModel.m
  3. // webgnosus
  4. //
  5. // Created by Troy Stribling on 2/24/09.
  6. // Copyright 2009 Plan-B Research. All rights reserved.
  7. //
  8. //-----------------------------------------------------------------------------------------------------------------------------------
  9. #import "MessageModel.h"
  10. #import "AccountModel.h"
  11. #import "ContactModel.h"
  12. #import "SubscriptionModel.h"
  13. #import "RosterItemModel.h"
  14. #import "UserModel.h"
  15. #import "WebgnosusDbi.h"
  16. #import "XMPPxData.h"
  17. #import "XMPPEntry.h"
  18. #import "XMPPGeoLoc.h"
  19. #import "XMPPClient.h"
  20. #import "XMPPMessage.h"
  21. #import "XMPPIQ.h"
  22. #import "XMPPJID.h"
  23. #import "XMPPPubSubEvent.h"
  24. #import "XMPPPubSubItem.h"
  25. #import "XMPPPubSubItems.h"
  26. #import "XMPPPubSub.h"
  27. #import "XMPPCommand.h"
  28. #import "XMPPMessageDelegate.h"
  29. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  30. @interface MessageModel (PrivateAPI)
  31. + (void)insert:(XMPPClient*)client pubSubItems:(XMPPPubSubItems*)items fromJID:(XMPPJID*)fromJID withReadFlag:(BOOL)readFlag;
  32. - (void)setAttributesWithStatement:(sqlite3_stmt*)statement;
  33. - (NSString*)sqlEscapeText;
  34. @end
  35. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  36. @implementation MessageModel
  37. //-----------------------------------------------------------------------------------------------------------------------------------
  38. @synthesize pk;
  39. @synthesize accountPk;
  40. @synthesize textType;
  41. @synthesize messageRead;
  42. @synthesize messageText;
  43. @synthesize createdAt;
  44. @synthesize toJid;
  45. @synthesize fromJid;
  46. @synthesize node;
  47. @synthesize itemId;
  48. //===================================================================================================================================
  49. #pragma mark MessageModel
  50. //-----------------------------------------------------------------------------------------------------------------------------------
  51. + (NSInteger)count {
  52. return [[WebgnosusDbi instance] selectIntExpression:@"SELECT COUNT(pk) FROM messages"];
  53. }
  54. //-----------------------------------------------------------------------------------------------------------------------------------
  55. + (NSInteger)countByAccount:(AccountModel*)requestAccount {
  56. NSString* selectStatement = [NSString stringWithFormat:@"SELECT COUNT(pk) FROM messages WHERE accountPk = %d", requestAccount.pk];
  57. return [[WebgnosusDbi instance] selectIntExpression:selectStatement];
  58. }
  59. //-----------------------------------------------------------------------------------------------------------------------------------
  60. + (NSInteger)countMessagesByJid:(NSString*)requestJID andAccount:(AccountModel*)requestAccount {
  61. NSString* selectStatement = [NSString stringWithFormat:@"SELECT COUNT(pk) FROM messages WHERE (toJid LIKE '%@%%' OR fromJid LIKE '%@%%') AND textType = %d AND accountPk = %d",
  62. requestJID, requestJID, MessageTextTypeBody, requestAccount.pk];
  63. return [[WebgnosusDbi instance] selectIntExpression:selectStatement];
  64. }
  65. //-----------------------------------------------------------------------------------------------------------------------------------
  66. + (NSInteger)countCommandsByJid:(NSString*)requestJID andAccount:(AccountModel*)requestAccount {
  67. NSString* selectStatement = [NSString stringWithFormat:@"SELECT COUNT(pk) FROM messages WHERE (toJid LIKE '%@%%' OR fromJid LIKE '%@%%') AND (textType = %d OR textType = %d) AND accountPk = %d",
  68. requestJID, requestJID, MessageTextTypeCommandText, MessageTextTypeCommandXData, requestAccount.pk];
  69. return [[WebgnosusDbi instance] selectIntExpression:selectStatement];
  70. }
  71. //-----------------------------------------------------------------------------------------------------------------------------------
  72. + (NSInteger)countSubscribedEventsByNode:(NSString*)requestNode andAccount:(AccountModel*)requestAccount {
  73. NSString* selectStatement = [NSString stringWithFormat:@"SELECT COUNT(pk) FROM messages WHERE (textType = %d OR textType = %d OR textType = %d) AND node = '%@' AND itemId <> '-1' AND accountPk = %d",
  74. MessageTextTypeEventText, MessageTextTypeEventEntry, MessageTextTypeEventxData, requestNode, requestAccount.pk];
  75. return [[WebgnosusDbi instance] selectIntExpression:selectStatement];
  76. }
  77. //-----------------------------------------------------------------------------------------------------------------------------------
  78. + (NSInteger)countPublishedEventsByNode:(NSString*)requestNode andAccount:(AccountModel*)requestAccount {
  79. NSString* selectStatement = [NSString stringWithFormat:@"SELECT COUNT(pk) FROM messages WHERE (textType = %d OR textType = %d OR textType = %d) AND node = '%@' AND itemId = '-1' AND accountPk = %d",
  80. MessageTextTypeEventText, MessageTextTypeEventEntry, MessageTextTypeEventxData, requestNode, requestAccount.pk];
  81. return [[WebgnosusDbi instance] selectIntExpression:selectStatement];
  82. }
  83. //-----------------------------------------------------------------------------------------------------------------------------------
  84. + (NSInteger)countEventsByNode:(NSString*)requestNode andAccount:(AccountModel*)requestAccount {
  85. NSString* selectStatement = [NSString stringWithFormat:@"SELECT COUNT(pk) FROM messages WHERE (textType = %d OR textType = %d OR textType = %d) AND node = '%@' AND accountPk = %d",
  86. MessageTextTypeEventText, MessageTextTypeEventEntry, MessageTextTypeEventxData, requestNode, requestAccount.pk];
  87. return [[WebgnosusDbi instance] selectIntExpression:selectStatement];
  88. }
  89. //-----------------------------------------------------------------------------------------------------------------------------------
  90. + (NSInteger)countEventsLikeNode:(NSString*)requestNode andAccount:(AccountModel*)requestAccount {
  91. NSString* selectStatement = [NSString stringWithFormat:@"SELECT COUNT(pk) FROM messages WHERE (textType = %d OR textType = %d OR textType = %d) AND node LIKE '%%%@' AND accountPk = %d",
  92. MessageTextTypeEventText, MessageTextTypeEventEntry, MessageTextTypeEventxData, requestNode, requestAccount.pk];
  93. return [[WebgnosusDbi instance] selectIntExpression:selectStatement];
  94. }
  95. //-----------------------------------------------------------------------------------------------------------------------------------
  96. + (NSInteger)countUnreadMessagesByFromJid:(NSString*)requestFromJid andAccount:(AccountModel*)requestAccount {
  97. NSString* selectStatement = [NSString stringWithFormat:@"SELECT COUNT(pk) FROM messages WHERE fromJid LIKE '%@%%' AND (textType = 0 OR textType = 1 OR textType = 2) AND messageRead = 0 AND accountPk = %d", requestFromJid, requestAccount.pk];
  98. return [[WebgnosusDbi instance] selectIntExpression:selectStatement];
  99. }
  100. //-----------------------------------------------------------------------------------------------------------------------------------
  101. + (NSInteger)countUnreadEventsByNode:(NSString*)requestNode andAccount:(AccountModel*)requestAccount {
  102. NSString* selectStatement = [NSString stringWithFormat:@"SELECT COUNT(pk) FROM messages WHERE node = '%@' AND (textType = 3 OR textType = 4 OR textType = 5) AND messageRead = 0 AND accountPk = %d", requestNode, requestAccount.pk];
  103. return [[WebgnosusDbi instance] selectIntExpression:selectStatement];
  104. }
  105. //-----------------------------------------------------------------------------------------------------------------------------------
  106. + (NSInteger)countUnreadMessagesByAccount:(AccountModel*)requestAccount {
  107. NSString* selectStatement = [NSString stringWithFormat:@"SELECT COUNT(pk) FROM messages WHERE (textType = 0 OR textType = 1 OR textType = 2) AND messageRead = 0 AND accountPk = %d", requestAccount.pk];
  108. return [[WebgnosusDbi instance] selectIntExpression:selectStatement];
  109. }
  110. //-----------------------------------------------------------------------------------------------------------------------------------
  111. + (NSInteger)countUnreadEventsByAccount:(AccountModel*)requestAccount {
  112. NSString* selectStatement = [NSString stringWithFormat:@"SELECT COUNT(pk) FROM messages WHERE (textType = 3 OR textType = 4 OR textType = 5) AND messageRead = 0 AND accountPk = %d", requestAccount.pk];
  113. return [[WebgnosusDbi instance] selectIntExpression:selectStatement];
  114. }
  115. //-----------------------------------------------------------------------------------------------------------------------------------
  116. + (NSInteger)greatestPkForAccount:(AccountModel*)requestAccount {
  117. NSString* selectStatement = [NSString stringWithFormat:@"SELECT MAX(pk) FROM messages WHERE accountPk = %d", requestAccount.pk];
  118. return [[WebgnosusDbi instance] selectIntExpression:selectStatement];
  119. }
  120. //-----------------------------------------------------------------------------------------------------------------------------------
  121. + (void)drop {
  122. [[WebgnosusDbi instance] updateWithStatement:@"DROP TABLE messages"];
  123. }
  124. //-----------------------------------------------------------------------------------------------------------------------------------
  125. + (void)create {
  126. [[WebgnosusDbi instance] updateWithStatement:@"CREATE TABLE messages (pk integer primary key, messageText text, createdAt date, toJid text, fromJid text, textType integer, node text, itemId text, messageRead integer, accountPk integer, FOREIGN KEY (accountPk) REFERENCES accounts(pk))"];
  127. }
  128. //-----------------------------------------------------------------------------------------------------------------------------------
  129. + (NSMutableArray*)findAll {
  130. NSMutableArray* output = [NSMutableArray arrayWithCapacity:10];
  131. [[WebgnosusDbi instance] selectAllForModel:[MessageModel class] withStatement:@"SELECT * FROM messages ORDER BY createdAt DESC" andOutputTo:output];
  132. return output;
  133. }
  134. //-----------------------------------------------------------------------------------------------------------------------------------
  135. + (NSMutableArray*)findAllByAccount:(AccountModel*)requestAccount withPkGreaterThan:(NSInteger)requestPk andLimit:(NSInteger)requestLimit {
  136. NSMutableArray* output = [NSMutableArray arrayWithCapacity:10];
  137. NSString* selectStatement = [NSString stringWithFormat:@"SELECT * FROM messages WHERE accountPk = %d AND pk < %d ORDER BY pk DESC LIMIT %d", requestAccount.pk, requestPk, requestLimit];
  138. [[WebgnosusDbi instance] selectAllForModel:[MessageModel class] withStatement:selectStatement andOutputTo:output];
  139. return output;
  140. }
  141. //-----------------------------------------------------------------------------------------------------------------------------------
  142. + (NSMutableArray*)findAllMessagesByJid:(NSString*)requestJID forAccount:(AccountModel*)requestAccount withPkGreaterThan:(NSInteger)requestPk andLimit:(NSInteger)requestLimit {
  143. NSMutableArray* output = [NSMutableArray arrayWithCapacity:10];
  144. NSString* selectStatement = [NSString stringWithFormat:@"SELECT * FROM messages WHERE (toJid LIKE '%@%%' OR fromJid LIKE '%@%%') AND pk < %d AND textType = %d AND accountPk = %d ORDER BY pk DESC LIMIT %d",
  145. requestJID, requestJID, requestPk, MessageTextTypeBody, requestAccount.pk, requestLimit];
  146. [[WebgnosusDbi instance] selectAllForModel:[MessageModel class] withStatement:selectStatement andOutputTo:output];
  147. return output;
  148. }
  149. //-----------------------------------------------------------------------------------------------------------------------------------
  150. + (NSMutableArray*)findAllCommandsByJid:(NSString*)requestJID forAccount:(AccountModel*)requestAccount withPkGreaterThan:(NSInteger)requestPk andLimit:(NSInteger)requestLimit {
  151. NSMutableArray* output = [NSMutableArray arrayWithCapacity:10];
  152. NSString* selectStatement = [NSString stringWithFormat:@"SELECT * FROM messages WHERE (toJid LIKE '%@%%' OR fromJid LIKE '%@%%') AND pk < %d AND (textType = %d OR textType = %d) AND accountPk = %d ORDER BY pk DESC LIMIT %d",
  153. requestJID, requestJID, requestPk, MessageTextTypeCommandText, MessageTextTypeCommandXData, requestAccount.pk, requestLimit];
  154. [[WebgnosusDbi instance] selectAllForModel:[MessageModel class] withStatement:selectStatement andOutputTo:output];
  155. return output;
  156. }
  157. //-----------------------------------------------------------------------------------------------------------------------------------
  158. + (NSMutableArray*)findAllSubscribedEventsByNode:(NSString*)requestNode forAccount:(AccountModel*)requestAccount withPkGreaterThan:(NSInteger)requestPk andLimit:(NSInteger)requestLimit {
  159. NSMutableArray* output = [NSMutableArray arrayWithCapacity:10];
  160. NSString* selectStatement = [NSString stringWithFormat:@"SELECT * FROM messages WHERE (textType = %d OR textType = %d OR textType = %d) AND pk < %d AND node = '%@' AND itemId <> '-1' AND accountPk = %d ORDER BY pk DESC LIMIT %d",
  161. MessageTextTypeEventText, MessageTextTypeEventEntry, MessageTextTypeEventxData, requestPk, requestNode, requestAccount.pk, requestLimit];
  162. [[WebgnosusDbi instance] selectAllForModel:[MessageModel class] withStatement:selectStatement andOutputTo:output];
  163. return output;
  164. }
  165. //-----------------------------------------------------------------------------------------------------------------------------------
  166. + (NSMutableArray*)findAllPublishedEventsByNode:(NSString*)requestNode forAccount:(AccountModel*)requestAccount withPkGreaterThan:(NSInteger)requestPk andLimit:(NSInteger)requestLimit {
  167. NSMutableArray* output = [NSMutableArray arrayWithCapacity:10];
  168. NSString* selectStatement = [NSString stringWithFormat:@"SELECT * FROM messages WHERE (textType = %d OR textType = %d OR textType = %d OR textType = %d) AND pk < %d AND node = '%@' AND itemId = '-1' AND accountPk = %d ORDER BY pk DESC LIMIT %d",
  169. MessageTextTypeEventText, MessageTextTypeEventEntry, MessageTextTypeEventxData, MessageTextTypeGeoLocData, requestPk, requestNode, requestAccount.pk, requestLimit];
  170. [[WebgnosusDbi instance] selectAllForModel:[MessageModel class] withStatement:selectStatement andOutputTo:output];
  171. return output;
  172. }
  173. //-----------------------------------------------------------------------------------------------------------------------------------
  174. + (NSMutableArray*)findAllEventsByNode:(NSString*)requestNode forAccount:(AccountModel*)requestAccount withPkGreaterThan:(NSInteger)requestPk andLimit:(NSInteger)requestLimit {
  175. NSMutableArray* output = [NSMutableArray arrayWithCapacity:10];
  176. NSString* selectStatement = [NSString stringWithFormat:@"SELECT * FROM messages WHERE (textType = %d OR textType = %d OR textType = %d OR textType = %d) AND pk < %d AND node = '%@' AND accountPk = %d ORDER BY pk DESC LIMIT %d",
  177. MessageTextTypeEventText, MessageTextTypeEventEntry, MessageTextTypeEventxData, MessageTextTypeGeoLocData, requestPk, requestNode, requestAccount.pk, requestLimit];
  178. [[WebgnosusDbi instance] selectAllForModel:[MessageModel class] withStatement:selectStatement andOutputTo:output];
  179. return output;
  180. }
  181. //-----------------------------------------------------------------------------------------------------------------------------------
  182. + (NSMutableArray*)findAllEventsLikeNode:(NSString*)requestNode forAccount:(AccountModel*)requestAccount withPkGreaterThan:(NSInteger)requestPk andLimit:(NSInteger)requestLimit {
  183. NSMutableArray* output = [NSMutableArray arrayWithCapacity:10];
  184. NSString* selectStatement = [NSString stringWithFormat:@"SELECT * FROM messages WHERE (textType = %d OR textType = %d OR textType = %d OR textType = %d) AND pk < %d AND node LIKE '%@' AND accountPk = %d ORDER BY pk DESC LIMIT %d",
  185. MessageTextTypeEventText, MessageTextTypeEventEntry, MessageTextTypeEventxData, MessageTextTypeGeoLocData, requestPk, requestNode, requestAccount.pk, requestLimit];
  186. [[WebgnosusDbi instance] selectAllForModel:[MessageModel class] withStatement:selectStatement andOutputTo:output];
  187. return output;
  188. }
  189. //-----------------------------------------------------------------------------------------------------------------------------------
  190. + (NSMutableArray*)findAllByJid:(NSString*)requestJID andAccount:(AccountModel*)requestAccount withLimit:(NSInteger)requestLimit {
  191. NSMutableArray* output = [NSMutableArray arrayWithCapacity:10];
  192. NSString* selectStatement = [NSString stringWithFormat:@"SELECT * FROM messages WHERE (toJid LIKE '%@%%' OR fromJid LIKE '%@%%') AND accountPk = %d ORDER BY createdAt DESC LIMIT %d",
  193. requestJID, requestJID, requestAccount.pk, requestLimit];
  194. [[WebgnosusDbi instance] selectAllForModel:[MessageModel class] withStatement:selectStatement andOutputTo:output];
  195. return output;
  196. }
  197. //-----------------------------------------------------------------------------------------------------------------------------------
  198. + (MessageModel*)findByPk:(NSInteger)requestPk {
  199. NSString* selectStatement = [NSString stringWithFormat:@"SELECT * FROM messages WHERE pk = %d", requestPk];
  200. MessageModel* model = [[[MessageModel alloc] init] autorelease];
  201. [[WebgnosusDbi instance] selectForModel:[MessageModel class] withStatement:selectStatement andOutputTo:model];
  202. if (model.pk == 0) {
  203. model = nil;
  204. }
  205. return model;
  206. }
  207. //-----------------------------------------------------------------------------------------------------------------------------------
  208. + (MessageModel*)findLatestGeoLocMessage {
  209. NSString* selectStatement = @"SELECT * FROM messages WHERE pk = (SELECT MAX(pk) FROM messages WHERE node = '/home/test.gnos.us/troy/geoloc')";
  210. MessageModel* model = [[[MessageModel alloc] init] autorelease];
  211. [[WebgnosusDbi instance] selectForModel:[MessageModel class] withStatement:selectStatement andOutputTo:model];
  212. if (model.pk == 0) {
  213. model = nil;
  214. }
  215. return model;
  216. }
  217. //-----------------------------------------------------------------------------------------------------------------------------------
  218. + (MessageModel*)findEventByNode:(NSString*)requestNode andItemId:(NSString*)requestItemId andAccount:(AccountModel*)requestAccount {
  219. NSString* selectStatement = [NSString stringWithFormat:@"SELECT * FROM messages WHERE node = '%@' AND itemId = '%@' AND accountPk = %d", requestNode, requestItemId, requestAccount.pk];
  220. MessageModel* model = [[[MessageModel alloc] init] autorelease];
  221. [[WebgnosusDbi instance] selectForModel:[MessageModel class] withStatement:selectStatement andOutputTo:model];
  222. if (model.pk == 0) {
  223. model = nil;
  224. }
  225. return model;
  226. }
  227. //-----------------------------------------------------------------------------------------------------------------------------------
  228. + (void)markReadByFromJid:(NSString*)requestFromJid textType:(MessageTextType)requestTextType andAccount:(AccountModel*)requestAccount {
  229. NSString* updateStatement = [NSString stringWithFormat:@"UPDATE messages SET messageRead = 1 WHERE fromJid = '%@' AND textType = %d AND accountPk = %d", requestFromJid, requestTextType, requestAccount.pk];
  230. [[WebgnosusDbi instance] updateWithStatement:updateStatement];
  231. }
  232. //-----------------------------------------------------------------------------------------------------------------------------------
  233. + (void)destroyAllByAccount:(AccountModel*)requestAccount {
  234. NSString* deleteStatement = [NSString stringWithFormat:@"DELETE FROM messages WHERE accountPk = %d", requestAccount.pk];
  235. [[WebgnosusDbi instance] updateWithStatement:deleteStatement];
  236. }
  237. //-----------------------------------------------------------------------------------------------------------------------------------
  238. + (void)insert:(XMPPClient*)client message:(XMPPMessage*)message {
  239. if ([message hasBody]) {
  240. AccountModel* account = [XMPPMessageDelegate accountForXMPPClient:client];
  241. if (account) {
  242. MessageModel* messageModel = [[MessageModel alloc] init];
  243. messageModel.fromJid = [[message fromJID] full];
  244. messageModel.accountPk = account.pk;
  245. messageModel.messageText = [message body];
  246. messageModel.toJid = [account fullJID];
  247. messageModel.createdAt = [[NSDate alloc] initWithTimeIntervalSinceNow:0];
  248. messageModel.textType = MessageTextTypeBody;
  249. messageModel.node = @"";
  250. messageModel.itemId = @"-1";
  251. messageModel.messageRead = NO;
  252. [messageModel insert];
  253. [messageModel release];
  254. }
  255. }
  256. }
  257. //-----------------------------------------------------------------------------------------------------------------------------------
  258. + (void)insertEvent:(XMPPClient*)client forMessage:(XMPPMessage*)message {
  259. XMPPPubSubEvent* event = [message event];
  260. [self insert:client pubSubItems:[event items] fromJID:[message fromJID] withReadFlag:NO];
  261. }
  262. //-----------------------------------------------------------------------------------------------------------------------------------
  263. + (void)insertPubSubItems:(XMPPClient*)client forIq:(XMPPIQ*)iq {
  264. XMPPPubSub* pubsub = [iq pubsub];
  265. [self insert:client pubSubItems:[pubsub items] fromJID:[iq fromJID] withReadFlag:YES];
  266. }
  267. //-----------------------------------------------------------------------------------------------------------------------------------
  268. + (void)insert:(XMPPClient*)client commandResult:(XMPPIQ*)iq {
  269. XMPPCommand* command = [iq command];
  270. if (command) {
  271. AccountModel* account = [XMPPMessageDelegate accountForXMPPClient:client];
  272. if (account) {
  273. MessageModel* messageModel = [[MessageModel alloc] init];
  274. messageModel.fromJid = [[iq fromJID] full];
  275. messageModel.accountPk = account.pk;
  276. messageModel.toJid = [account fullJID];
  277. messageModel.createdAt = [NSDate date];
  278. messageModel.textType = MessageTextTypeCommandXData;
  279. messageModel.node = [command node];
  280. messageModel.itemId = @"-1";
  281. messageModel.messageRead = NO;
  282. XMPPxData* cmdData = [command data];
  283. if (cmdData) {
  284. messageModel.messageText = [cmdData XMLString];
  285. } else {
  286. messageModel.messageText = [command status];
  287. }
  288. [messageModel insert];
  289. [messageModel release];
  290. }
  291. }
  292. }
  293. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  294. //-----------------------------------------------------------------------------------------------------------------------------------
  295. - (AccountModel*)account {
  296. AccountModel* model = nil;
  297. if (self.accountPk) {
  298. model = [AccountModel findByPk:self.accountPk];
  299. }
  300. return model;
  301. }
  302. //-----------------------------------------------------------------------------------------------------------------------------------
  303. - (NSString*)createdAtAsString {
  304. NSDateFormatter *df = [[NSDateFormatter alloc] init];
  305. [df setDateFormat:@"yyyy-MM-dd hh:mm:ss zzz"];
  306. NSString* dateString = [df stringFromDate:self.createdAt];
  307. [df release];
  308. return dateString;
  309. }
  310. //-----------------------------------------------------------------------------------------------------------------------------------
  311. - (void)insert {
  312. NSString* insertStatement;
  313. if (self.node && self.itemId) {
  314. insertStatement = [NSString stringWithFormat:@"INSERT INTO messages (messageText, createdAt, toJid, fromJid, textType, node, itemId, messageRead, accountPk) values ('%@', '%@', '%@', '%@', %d, '%@', '%@', %d, %d)",
  315. [self sqlEscapeText], [self createdAtAsString], self.toJid, self.fromJid, self.textType, self.node, self.itemId, [self messageReadAsInteger], self.accountPk];
  316. } else if (self.node) {
  317. insertStatement = [NSString stringWithFormat:@"INSERT INTO messages (messageText, createdAt, toJid, fromJid, textType, node, messageRead, accountPk) values ('%@', '%@', '%@', '%@', %d, '%@', %d, %d)",
  318. [self sqlEscapeText], [self createdAtAsString], self.toJid, self.fromJid, self.textType, self.node, [self messageReadAsInteger], self.accountPk];
  319. } else if (self.itemId) {
  320. insertStatement = [NSString stringWithFormat:@"INSERT INTO messages (messageText, createdAt, toJid, fromJid, textType, itemId, messageRead, accountPk) values ('%@', '%@', '%@', '%@', %d, '%@', %d, %d)",
  321. [self sqlEscapeText], [self createdAtAsString], self.toJid, self.fromJid, self.textType, self.itemId, [self messageReadAsInteger], self.accountPk];
  322. } else {
  323. insertStatement = [NSString stringWithFormat:@"INSERT INTO messages (messageText, createdAt, toJid, fromJid, textType, messageRead, accountPk) values ('%@', '%@', '%@', '%@', %d, %d, %d)",
  324. [self sqlEscapeText], [self createdAtAsString], self.toJid, self.fromJid, self.textType, [self messageReadAsInteger], self.accountPk];
  325. }
  326. [[WebgnosusDbi instance] updateWithStatement:insertStatement];
  327. }
  328. //-----------------------------------------------------------------------------------------------------------------------------------
  329. - (void)update {
  330. NSString* updateStatement;
  331. if (self.node && self.itemId) {
  332. updateStatement = [NSString stringWithFormat:@"UPDATE messages SET messageText = '%@', createdAt = '%@', toJid = '%@', fromJid = '%@', textType = %d, node = '%@', itemId = '%@', messageRead = '%d', accountPk = %d WHERE pk = %d",
  333. [self sqlEscapeText], [self createdAtAsString], self.toJid, self.fromJid, self.textType, self.node, self.itemId, [self messageReadAsInteger], self.accountPk, self.pk];
  334. } else if (self.node) {
  335. updateStatement = [NSString stringWithFormat:@"UPDATE messages SET messageText = '%@', createdAt = '%@', toJid = '%@', fromJid = '%@', textType = %d, node = '%@', messageRead = '%d', accountPk = %d WHERE pk = %d",
  336. [self sqlEscapeText], [self createdAtAsString], self.toJid, self.fromJid, self.textType, self.node, [self messageReadAsInteger], self.accountPk, self.pk];
  337. } else if (self.itemId) {
  338. updateStatement = [NSString stringWithFormat:@"UPDATE messages SET messageText = '%@', createdAt = '%@', toJid = '%@', fromJid = '%@', textType = %d, itemId = '%@', messageRead = '%d', accountPk = %d WHERE pk = %d",
  339. [self sqlEscapeText], [self createdAtAsString], self.toJid, self.fromJid, self.textType, self.itemId, [self messageReadAsInteger], self.accountPk, self.pk];
  340. } else {
  341. updateStatement = [NSString stringWithFormat:@"UPDATE messages SET messageText = '%@', createdAt = '%@', toJid = '%@', fromJid = '%@', textType = %d, messageRead = '%d', accountPk = %d WHERE pk = %d",
  342. [self sqlEscapeText], [self createdAtAsString], self.toJid, self.fromJid, self.textType, [self messageReadAsInteger], self.accountPk, self.pk];
  343. }
  344. [[WebgnosusDbi instance] updateWithStatement:updateStatement];
  345. }
  346. //-----------------------------------------------------------------------------------------------------------------------------------
  347. - (void)destroy {
  348. NSString* insertStatement = [NSString stringWithFormat:@"DELETE FROM messages WHERE pk = %d", self.pk];
  349. [[WebgnosusDbi instance] updateWithStatement:insertStatement];
  350. }
  351. //-----------------------------------------------------------------------------------------------------------------------------------
  352. - (NSInteger)messageReadAsInteger {
  353. return self.messageRead == YES ? 1 : 0;
  354. }
  355. //-----------------------------------------------------------------------------------------------------------------------------------
  356. - (void)setMessageReadAsInteger:(NSInteger)value {
  357. if (value == 1) {
  358. self.messageRead = YES;
  359. } else {
  360. self.messageRead = NO;
  361. };
  362. }
  363. //-----------------------------------------------------------------------------------------------------------------------------------
  364. - (XMPPxData*)parseXDataMessage {
  365. XMPPxData* data = nil;
  366. NSXMLDocument* xmlDoc = [[[NSXMLDocument alloc] initWithXMLString:self.messageText options:0 error:nil] autorelease];
  367. NSXMLElement* dataElement = [xmlDoc rootElement];
  368. if ([[dataElement xmlns] isEqualToString:@"jabber:x:data"]) {
  369. data = [XMPPxData createFromElement:dataElement];
  370. }
  371. return data;
  372. }
  373. //-----------------------------------------------------------------------------------------------------------------------------------
  374. - (XMPPGeoLoc*)parseGeoLocMessage {
  375. XMPPGeoLoc* data = nil;
  376. NSXMLDocument* xmlDoc = [[[NSXMLDocument alloc] initWithXMLString:self.messageText options:0 error:nil] autorelease];
  377. NSXMLElement* dataElement = [xmlDoc rootElement];
  378. if ([[dataElement xmlns] isEqualToString:@"http://jabber.org/protocol/geoloc"]) {
  379. data = [XMPPGeoLoc createFromElement:dataElement];
  380. }
  381. return data;
  382. }
  383. //-----------------------------------------------------------------------------------------------------------------------------------
  384. - (XMPPEntry*)parseEntryMessage {
  385. XMPPEntry* entry = nil;
  386. NSXMLDocument* xmlDoc = [[[NSXMLDocument alloc] initWithXMLString:self.messageText options:0 error:nil] autorelease];
  387. NSXMLElement* entryElement = [xmlDoc rootElement];
  388. if ([[entryElement xmlns] isEqualToString:@"http://www.w3.org/2005/Atom"]) {
  389. entry = [XMPPEntry createFromElement:entryElement];
  390. }
  391. return entry;
  392. }
  393. //===================================================================================================================================
  394. #pragma mark MessageModel PrivateApi
  395. //-----------------------------------------------------------------------------------------------------------------------------------
  396. - (void)setAttributesWithStatement:(sqlite3_stmt*)statement {
  397. self.pk = (int)sqlite3_column_int(statement, 0);
  398. char* messageTextVal = (char*)sqlite3_column_text(statement, 1);
  399. if (messageTextVal != nil) {
  400. self.messageText = [NSString stringWithCString:messageTextVal encoding:NSUTF8StringEncoding];
  401. }
  402. char* createdAtVal = (char*)sqlite3_column_text(statement, 2);
  403. if (createdAtVal != nil) {
  404. NSDateFormatter *df = [[NSDateFormatter alloc] init];
  405. [df setDateFormat:@"yyyy-MM-dd hh:mm:ss zzz"];
  406. self.createdAt = [df dateFromString:[NSString stringWithCString:createdAtVal encoding:NSUTF8StringEncoding]];
  407. [df release];
  408. }
  409. char* toJidVal = (char*)sqlite3_column_text(statement, 3);
  410. if (toJidVal != nil) {
  411. self.toJid = [NSString stringWithCString:toJidVal encoding:NSUTF8StringEncoding];
  412. }
  413. char* fromJidVal = (char*)sqlite3_column_text(statement, 4);
  414. if (fromJidVal != nil) {
  415. self.fromJid = [NSString stringWithCString:fromJidVal encoding:NSUTF8StringEncoding];
  416. }
  417. self.textType = (int)sqlite3_column_int(statement, 5);
  418. char* nodeVal = (char*)sqlite3_column_text(statement, 6);
  419. if (nodeVal != nil) {
  420. self.node = [NSString stringWithCString:nodeVal encoding:NSUTF8StringEncoding];
  421. }
  422. char* itemIdVal = (char*)sqlite3_column_text(statement, 7);
  423. if (itemIdVal != nil) {
  424. self.itemId = [NSString stringWithCString:itemIdVal encoding:NSUTF8StringEncoding];
  425. }
  426. [self setMessageReadAsInteger:(int)sqlite3_column_int(statement, 8)];
  427. self.accountPk = (int)sqlite3_column_int(statement, 9);
  428. }
  429. //-----------------------------------------------------------------------------------------------------------------------------------
  430. + (void)insert:(XMPPClient*)client pubSubItems:(XMPPPubSubItems*)items fromJID:(XMPPJID*)fromJID withReadFlag:(BOOL)readFlag {
  431. AccountModel* account = [XMPPMessageDelegate accountForXMPPClient:client];
  432. if (account) {
  433. NSArray* itemsArray = [items toArray];
  434. NSString* itemsNode = [items node];
  435. for (int i = 0; i < [itemsArray count]; i++) {
  436. XMPPPubSubItem* item = [XMPPPubSubItem createFromElement:[itemsArray objectAtIndex:i]];
  437. if (![MessageModel findEventByNode:itemsNode andItemId:[item itemId] andAccount:account]) {
  438. MessageModel* messageModel = [[MessageModel alloc] init];
  439. messageModel.fromJid = [fromJID full];
  440. messageModel.accountPk = account.pk;
  441. messageModel.toJid = [account fullJID];
  442. messageModel.createdAt = [[NSDate alloc] initWithTimeIntervalSinceNow:0];
  443. messageModel.node = itemsNode;
  444. messageModel.itemId = [item itemId];
  445. messageModel.messageRead = readFlag;
  446. XMPPxData* data;
  447. XMPPEntry* entry;
  448. XMPPGeoLoc* geoLoc;
  449. if (data = [item data]) {
  450. messageModel.textType = MessageTextTypeEventxData;
  451. messageModel.messageText = [data XMLString];
  452. } else if (entry = [item entry]) {
  453. messageModel.textType = MessageTextTypeEventEntry;
  454. messageModel.messageText = [entry XMLString];
  455. } else if (geoLoc = [item geoLoc]) {
  456. messageModel.textType = MessageTextTypeGeoLocData;
  457. messageModel.messageText = [geoLoc XMLString];
  458. } else {
  459. messageModel.textType = MessageTextTypeEventText;
  460. messageModel.messageText = [[[item children] objectAtIndex:0] XMLString];
  461. }
  462. [messageModel insert];
  463. [messageModel release];
  464. }
  465. }
  466. }
  467. }
  468. //-----------------------------------------------------------------------------------------------------------------------------------
  469. - (NSString*)sqlEscapeText {
  470. return [self.messageText stringByReplacingOccurrencesOfString:@"'" withString:@"''"];
  471. }
  472. //===================================================================================================================================
  473. #pragma mark WebgnosusDbiDelegate
  474. //-----------------------------------------------------------------------------------------------------------------------------------
  475. + (void)collectAllFromResult:(sqlite3_stmt*)result andOutputTo:(NSMutableArray*)output {
  476. MessageModel* model = [[MessageModel alloc] init];
  477. [model setAttributesWithStatement:result];
  478. [output addObject:model];
  479. [model release];
  480. }
  481. //-----------------------------------------------------------------------------------------------------------------------------------
  482. + (void)collectFromResult:(sqlite3_stmt*)result andOutputTo:(id)output {
  483. [output setAttributesWithStatement:result];
  484. }
  485. //===================================================================================================================================
  486. #pragma mark NSObject
  487. //-----------------------------------------------------------------------------------------------------------------------------------
  488. - (void)dealloc {
  489. [super dealloc];
  490. }
  491. @end