23 # NB This class assumes that a MySQLi connection has already been opened to the appropriate schema 30 ### ToolConsumer methods 43 if (!is_null($consumer->getRecordId())) {
44 $sql = sprintf(
'SELECT consumer_pk, name, consumer_key256, consumer_key, secret, lti_version, ' .
45 'signature_method, consumer_name, consumer_version, consumer_guid, ' .
46 'profile, tool_proxy, settings, protected, enabled, ' .
47 'enable_from, enable_until, last_access, created, updated ' .
48 "FROM {$this->dbTableNamePrefix}" . static::CONSUMER_TABLE_NAME .
' ' .
49 "WHERE consumer_pk = %d", $consumer->getRecordId());
51 $key256 = static::getConsumerKey($consumer->getKey());
52 $sql = sprintf(
'SELECT consumer_pk, name, consumer_key256, consumer_key, secret, lti_version, ' .
53 'signature_method, consumer_name, consumer_version, consumer_guid, ' .
54 'profile, tool_proxy, settings, protected, enabled, ' .
55 'enable_from, enable_until, last_access, created, updated ' .
56 "FROM {$this->dbTableNamePrefix}" . static::CONSUMER_TABLE_NAME .
' ' .
57 "WHERE consumer_key256 = %s", $this->
escape($key256));
59 $rsConsumer = pg_query($this->db, $sql);
61 while ($row = pg_fetch_object($rsConsumer)) {
62 if (empty($key256) || empty($row->consumer_key) || ($consumer->getKey() === $row->consumer_key)) {
63 $consumer->setRecordId(intval($row->consumer_pk));
64 $consumer->name = $row->name;
65 $consumer->setkey(empty($row->consumer_key) ? $row->consumer_key256 : $row->consumer_key);
66 $consumer->secret = $row->secret;
67 $consumer->ltiVersion = $row->lti_version;
68 $consumer->signatureMethod = $row->signature_method;
69 $consumer->consumerName = $row->consumer_name;
70 $consumer->consumerVersion = $row->consumer_version;
71 $consumer->consumerGuid = $row->consumer_guid;
72 $consumer->profile = json_decode($row->profile);
73 $consumer->toolProxy = $row->tool_proxy;
74 $settings = json_decode($row->settings, TRUE);
75 if (!is_array($settings)) {
76 $settings = @unserialize($row->settings);
78 if (!is_array($settings)) {
81 $consumer->setSettings($settings);
82 $consumer->protected = $row->protected;
83 $consumer->enabled = $row->enabled;
84 $consumer->enableFrom =
null;
85 if (!is_null($row->enable_from)) {
86 $consumer->enableFrom = strtotime($row->enable_from);
88 $consumer->enableUntil =
null;
89 if (!is_null($row->enable_until)) {
90 $consumer->enableUntil = strtotime($row->enable_until);
92 $consumer->lastAccess =
null;
93 if (!is_null($row->last_access)) {
94 $consumer->lastAccess = strtotime($row->last_access);
96 $consumer->created = strtotime($row->created);
97 $consumer->updated = strtotime($row->updated);
102 pg_free_result($rsConsumer);
117 $id = $consumer->getRecordId();
118 $key = $consumer->getKey();
119 $key256 = static::getConsumerKey($key);
120 if ($key === $key256) {
123 $protected = ($consumer->protected) ?
'true' :
'false';
124 $enabled = ($consumer->enabled) ?
'true' :
'false';
125 $profile = (!empty($consumer->profile)) ? json_encode($consumer->profile) :
null;
126 $settingsValue = json_encode($consumer->getSettings());
128 $now = date(
"{$this->dateFormat} {$this->timeFormat}", $time);
130 if (!is_null($consumer->enableFrom)) {
131 $from = date(
"{$this->dateFormat} {$this->timeFormat}", $consumer->enableFrom);
134 if (!is_null($consumer->enableUntil)) {
135 $until = date(
"{$this->dateFormat} {$this->timeFormat}", $consumer->enableUntil);
138 if (!is_null($consumer->lastAccess)) {
139 $last = date($this->dateFormat, $consumer->lastAccess);
142 $sql = sprintf(
"INSERT INTO {$this->dbTableNamePrefix}" . static::CONSUMER_TABLE_NAME .
' (consumer_key256, consumer_key, name, ' .
143 'secret, lti_version, signature_method, consumer_name, consumer_version, consumer_guid, profile, ' .
144 'tool_proxy, settings, protected, enabled, ' .
145 'enable_from, enable_until, last_access, created, updated) ' .
146 'VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)', $this->
escape($key256),
147 $this->
escape($key), $this->
escape($consumer->name), $this->escape($consumer->secret),
148 $this->
escape($consumer->ltiVersion), $this->
escape($consumer->signatureMethod),
149 $this->
escape($consumer->consumerName), $this->
escape($consumer->consumerVersion),
150 $this->
escape($consumer->consumerGuid), $this->
escape($profile), $this->
escape($consumer->toolProxy),
151 $this->
escape($settingsValue), $protected, $enabled, $this->
escape($from), $this->
escape($until),
154 $sql = sprintf(
"UPDATE {$this->dbTableNamePrefix}" . static::CONSUMER_TABLE_NAME .
' SET ' .
155 'consumer_key256 = %s, consumer_key = %s, ' .
156 'name = %s, secret= %s, lti_version = %s, signature_method = %s, consumer_name = %s, consumer_version = %s, consumer_guid = %s, ' .
157 'profile = %s, tool_proxy = %s, settings = %s, ' .
158 'protected = %s, enabled = %s, enable_from = %s, enable_until = %s, last_access = %s, updated = %s ' .
159 'WHERE consumer_pk = %d', $this->
escape($key256), $this->
escape($key), $this->
escape($consumer->name),
160 $this->escape($consumer->secret), $this->
escape($consumer->ltiVersion), $this->
escape($consumer->signatureMethod),
161 $this->
escape($consumer->consumerName), $this->
escape($consumer->consumerVersion),
162 $this->
escape($consumer->consumerGuid), $this->
escape($profile), $this->
escape($consumer->toolProxy),
163 $this->
escape($settingsValue), $protected, $enabled, $this->
escape($from), $this->
escape($until),
164 $this->
escape($last), $this->
escape($now), $consumer->getRecordId());
166 $ok = pg_query($this->db, $sql);
169 $consumer->setRecordId($this->insert_id());
170 $consumer->created = $time;
172 $consumer->updated = $time;
188 $sql = sprintf(
"DELETE FROM {$this->dbTableNamePrefix}" . static::NONCE_TABLE_NAME .
' WHERE consumer_pk = %d',
189 $consumer->getRecordId());
190 pg_query($this->db, $sql);
193 $sql = sprintf(
"DELETE FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_SHARE_KEY_TABLE_NAME .
' ' .
194 "WHERE resource_link_pk IN (SELECT resource_link_pk FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' ' .
195 'WHERE consumer_pk = %d)', $consumer->getRecordId());
196 pg_query($this->db, $sql);
199 $sql = sprintf(
"DELETE FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_SHARE_KEY_TABLE_NAME .
' ' .
200 "WHERE resource_link_pk IN (SELECT resource_link_pk FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' rl ' .
201 "INNER JOIN {$this->dbTableNamePrefix}" . static::CONTEXT_TABLE_NAME .
' c ON rl.context_pk = c.context_pk WHERE c.consumer_pk = %d)',
202 $consumer->getRecordId());
203 pg_query($this->db, $sql);
206 $sql = sprintf(
"DELETE FROM {$this->dbTableNamePrefix}" . static::USER_RESULT_TABLE_NAME .
' ' .
207 "WHERE resource_link_pk IN (SELECT resource_link_pk FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' ' .
208 'WHERE consumer_pk = %d)', $consumer->getRecordId());
209 pg_query($this->db, $sql);
212 $sql = sprintf(
"DELETE FROM {$this->dbTableNamePrefix}" . static::USER_RESULT_TABLE_NAME .
' ' .
213 "WHERE resource_link_pk IN (SELECT resource_link_pk FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' rl ' .
214 "INNER JOIN {$this->dbTableNamePrefix}" . static::CONTEXT_TABLE_NAME .
' c ON rl.context_pk = c.context_pk WHERE c.consumer_pk = %d)',
215 $consumer->getRecordId());
216 pg_query($this->db, $sql);
219 $sql = sprintf(
"UPDATE {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' ' .
220 'SET primary_resource_link_pk = NULL, share_approved = NULL ' .
221 'WHERE primary_resource_link_pk IN ' .
222 "(SELECT resource_link_pk FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' ' .
223 'WHERE consumer_pk = %d)', $consumer->getRecordId());
224 $ok = pg_query($this->db, $sql);
227 $sql = sprintf(
"UPDATE {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' ' .
228 'SET primary_resource_link_pk = NULL, share_approved = NULL ' .
229 'WHERE primary_resource_link_pk IN ' .
230 "(SELECT rl.resource_link_pk FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' rl ' .
231 "INNER JOIN {$this->dbTableNamePrefix}" . static::CONTEXT_TABLE_NAME .
' c ON rl.context_pk = c.context_pk ' .
232 'WHERE c.consumer_pk = %d)', $consumer->getRecordId());
233 $ok = pg_query($this->db, $sql);
236 $sql = sprintf(
"DELETE FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' ' .
237 'WHERE consumer_pk = %d', $consumer->getRecordId());
238 pg_query($this->db, $sql);
241 $sql = sprintf(
"DELETE FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' ' .
242 'WHERE context_pk IN (' .
243 "SELECT context_pk FROM {$this->dbTableNamePrefix}" . static::CONTEXT_TABLE_NAME .
' ' .
'WHERE consumer_pk = %d)',
244 $consumer->getRecordId());
245 pg_query($this->db, $sql);
248 $sql = sprintf(
"DELETE FROM {$this->dbTableNamePrefix}" . static::CONTEXT_TABLE_NAME .
' ' .
249 'WHERE consumer_pk = %d', $consumer->getRecordId());
250 pg_query($this->db, $sql);
253 $sql = sprintf(
"DELETE FROM {$this->dbTableNamePrefix}" . static::CONSUMER_TABLE_NAME .
' ' .
254 'WHERE consumer_pk = %d', $consumer->getRecordId());
255 $ok = pg_query($this->db, $sql);
258 $consumer->initialize();
271 $consumers = array();
273 $sql =
'SELECT consumer_pk, consumer_key256, consumer_key, name, secret, lti_version, ' .
274 'signature_method, consumer_name, consumer_version, consumer_guid, ' .
275 'profile, tool_proxy, settings, ' .
276 'protected, enabled, enable_from, enable_until, last_access, created, updated ' .
277 "FROM {$this->dbTableNamePrefix}" . static::CONSUMER_TABLE_NAME .
' ' .
279 $rsConsumers = pg_query($this->db, $sql);
281 while ($row = pg_fetch_object($rsConsumers)) {
282 $key = empty($row->consumer_key) ? $row->consumer_key256 : $row->consumer_key;
284 $consumer->setRecordId(intval($row->consumer_pk));
285 $consumer->name = $row->name;
286 $consumer->secret = $row->secret;
287 $consumer->ltiVersion = $row->lti_version;
288 $consumer->signatureMethod = $row->signature_method;
289 $consumer->consumerName = $row->consumer_name;
290 $consumer->consumerVersion = $row->consumer_version;
291 $consumer->consumerGuid = $row->consumer_guid;
292 $consumer->profile = json_decode($row->profile);
293 $consumer->toolProxy = $row->tool_proxy;
294 $settings = json_decode($row->settings, TRUE);
295 if (!is_array($settings)) {
296 $settings = @unserialize($row->settings);
298 if (!is_array($settings)) {
301 $consumer->setSettings($settings);
302 $consumer->protected = (intval($row->protected) === 1);
303 $consumer->enabled = (intval($row->enabled) === 1);
304 $consumer->enableFrom =
null;
305 if (!is_null($row->enable_from)) {
306 $consumer->enableFrom = strtotime($row->enable_from);
308 $consumer->enableUntil =
null;
309 if (!is_null($row->enable_until)) {
310 $consumer->enableUntil = strtotime($row->enable_until);
312 $consumer->lastAccess =
null;
313 if (!is_null($row->last_access)) {
314 $consumer->lastAccess = strtotime($row->last_access);
316 $consumer->created = strtotime($row->created);
317 $consumer->updated = strtotime($row->updated);
318 $consumers[] = $consumer;
320 pg_free_result($rsConsumers);
340 if (!is_null($context->getRecordId())) {
341 $sql = sprintf(
'SELECT context_pk, consumer_pk, title, lti_context_id, type, settings, created, updated ' .
342 "FROM {$this->dbTableNamePrefix}" . static::CONTEXT_TABLE_NAME .
' ' .
343 'WHERE (context_pk = %d)', $context->getRecordId());
345 $sql = sprintf(
'SELECT context_pk, consumer_pk, title, lti_context_id, type, settings, created, updated ' .
346 "FROM {$this->dbTableNamePrefix}" . static::CONTEXT_TABLE_NAME .
' ' .
347 'WHERE (consumer_pk = %d) AND (lti_context_id = %s)', $context->getConsumer()->getRecordId(),
348 $this->
escape($context->ltiContextId));
350 $rs_context = pg_query($this->db, $sql);
352 $row = pg_fetch_object($rs_context);
354 $context->setRecordId(intval($row->context_pk));
355 $context->setConsumerId(intval($row->consumer_pk));
356 $context->title = $row->title;
357 $context->ltiContextId = $row->lti_context_id;
358 $context->type = $row->type;
359 $settings = json_decode($row->settings, TRUE);
360 if (!is_array($settings)) {
361 $settings = @unserialize($row->settings);
363 if (!is_array($settings)) {
366 $context->setSettings($settings);
367 $context->created = strtotime($row->created);
368 $context->updated = strtotime($row->updated);
386 $now = date(
"{$this->dateFormat} {$this->timeFormat}", $time);
387 $settingsValue = json_encode($context->getSettings());
388 $id = $context->getRecordId();
389 $consumer_pk = $context->getConsumer()->getRecordId();
391 $sql = sprintf(
"INSERT INTO {$this->dbTableNamePrefix}" . static::CONTEXT_TABLE_NAME .
' (consumer_pk, title, ' .
392 'lti_context_id, type, settings, created, updated) ' .
393 'VALUES (%d, %s, %s, %s, %s, %s, %s)', $consumer_pk, $this->
escape($context->title),
394 $this->escape($context->ltiContextId), $this->
escape($context->type), $this->
escape($settingsValue),
397 $sql = sprintf(
"UPDATE {$this->dbTableNamePrefix}" . static::CONTEXT_TABLE_NAME .
' SET ' .
398 'title = %s, lti_context_id = %s, type = %s, settings = %s, ' .
400 'WHERE (consumer_pk = %d) AND (context_pk = %d)', $this->
escape($context->title),
401 $this->escape($context->ltiContextId), $this->
escape($context->type), $this->
escape($settingsValue),
402 $this->
escape($now), $consumer_pk, $id);
404 $ok = pg_query($this->db, $sql);
407 $context->setRecordId($this->insert_id());
408 $context->created = $time;
410 $context->updated = $time;
426 $sql = sprintf(
"DELETE FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_SHARE_KEY_TABLE_NAME .
' ' .
427 "WHERE resource_link_pk IN (SELECT resource_link_pk FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' ' .
428 'WHERE context_pk = %d)', $context->getRecordId());
429 pg_query($this->db, $sql);
432 $sql = sprintf(
"DELETE FROM {$this->dbTableNamePrefix}" . static::USER_RESULT_TABLE_NAME .
' ' .
433 "WHERE resource_link_pk IN (SELECT resource_link_pk FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' ' .
434 'WHERE context_pk = %d)', $context->getRecordId());
435 pg_query($this->db, $sql);
438 $sql = sprintf(
"UPDATE {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' ' .
439 'SET primary_resource_link_pk = null, share_approved = null ' .
440 'WHERE primary_resource_link_pk IN ' .
441 "(SELECT resource_link_pk FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' WHERE context_pk = %d)',
442 $context->getRecordId());
443 $ok = pg_query($this->db, $sql);
446 $sql = sprintf(
"DELETE FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' ' .
447 'WHERE context_pk = %d', $context->getRecordId());
448 pg_query($this->db, $sql);
451 $sql = sprintf(
"DELETE FROM {$this->dbTableNamePrefix}" . static::CONTEXT_TABLE_NAME .
' ',
'WHERE context_pk = %d',
452 $context->getRecordId());
453 $ok = pg_query($this->db, $sql);
455 $context->initialize();
462 ### ResourceLink methods 475 if (!is_null($resourceLink->getRecordId())) {
476 $sql = sprintf(
'SELECT resource_link_pk, context_pk, consumer_pk, title, lti_resource_link_id, settings, primary_resource_link_pk, share_approved, created, updated ' .
477 "FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' ' .
478 'WHERE (resource_link_pk = %d)', $resourceLink->getRecordId());
479 } elseif (!is_null($resourceLink->getContext())) {
480 $sql = sprintf(
'SELECT resource_link_pk, context_pk, consumer_pk, title, lti_resource_link_id, settings, primary_resource_link_pk, share_approved, created, updated ' .
481 "FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' ' .
482 'WHERE (context_pk = %d) AND (lti_resource_link_id = %s)', $resourceLink->getContext()->getRecordId(),
483 $this->
escape($resourceLink->getId()));
485 $sql = sprintf(
'SELECT r.resource_link_pk, r.context_pk, r.consumer_pk, r.title, r.lti_resource_link_id, r.settings, r.primary_resource_link_pk, r.share_approved, r.created, r.updated ' .
486 "FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' r LEFT OUTER JOIN ' .
487 $this->dbTableNamePrefix . static::CONTEXT_TABLE_NAME .
' c ON r.context_pk = c.context_pk ' .
488 ' WHERE ((r.consumer_pk = %d) OR (c.consumer_pk = %d)) AND (lti_resource_link_id = %s)',
489 $resourceLink->getConsumer()->getRecordId(), $resourceLink->getConsumer()->getRecordId(),
490 $this->
escape($resourceLink->getId()));
492 $rsContext = pg_query($this->db, $sql);
494 $row = pg_fetch_object($rsContext);
496 $resourceLink->setRecordId(intval($row->resource_link_pk));
497 if (!is_null($row->context_pk)) {
498 $resourceLink->setContextId(intval($row->context_pk));
500 $resourceLink->setContextId(
null);
502 if (!is_null($row->consumer_pk)) {
503 $resourceLink->setConsumerId(intval($row->consumer_pk));
505 $resourceLink->setConsumerId(
null);
507 $resourceLink->title = $row->title;
508 $resourceLink->ltiResourceLinkId = $row->lti_resource_link_id;
509 $settings = json_decode($row->settings, TRUE);
510 if (!is_array($settings)) {
511 $settings = @unserialize($row->settings);
513 if (!is_array($settings)) {
516 $resourceLink->setSettings($settings);
517 if (!is_null($row->primary_resource_link_pk)) {
518 $resourceLink->primaryResourceLinkId = intval($row->primary_resource_link_pk);
520 $resourceLink->primaryResourceLinkId =
null;
522 $resourceLink->shareApproved = (is_null($row->share_approved)) ?
null : (intval($row->share_approved) === 1);
523 $resourceLink->created = strtotime($row->created);
524 $resourceLink->updated = strtotime($row->updated);
541 if (is_null($resourceLink->shareApproved)) {
543 } elseif ($resourceLink->shareApproved) {
548 if (empty($resourceLink->primaryResourceLinkId)) {
549 $primaryResourceLinkId =
'NULL';
551 $primaryResourceLinkId = strval($resourceLink->primaryResourceLinkId);
554 $now = date(
"{$this->dateFormat} {$this->timeFormat}", $time);
555 $settingsValue = json_encode($resourceLink->getSettings());
556 if (!is_null($resourceLink->getContext())) {
557 $consumerId =
'NULL';
558 $contextId = strval($resourceLink->getContext()->getRecordId());
559 } elseif (!is_null($resourceLink->getContextId())) {
560 $consumerId =
'NULL';
561 $contextId = strval($resourceLink->getContextId());
563 $consumerId = strval($resourceLink->getConsumer()->getRecordId());
566 $id = $resourceLink->getRecordId();
568 $sql = sprintf(
"INSERT INTO {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' (consumer_pk, context_pk, ' .
569 'title, lti_resource_link_id, settings, primary_resource_link_pk, share_approved, created, updated) ' .
570 'VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)', $consumerId, $contextId, $this->
escape($resourceLink->title),
571 $this->escape($resourceLink->getId()), $this->
escape($settingsValue), $primaryResourceLinkId, $approved,
573 } elseif ($contextId !==
'NULL') {
574 $sql = sprintf(
"UPDATE {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' SET ' .
575 'consumer_pk = %s, title = %s, lti_resource_link_id = %s, settings = %s, ' .
576 'primary_resource_link_pk = %s, share_approved = %s, updated = %s ' .
577 'WHERE (context_pk = %s) AND (resource_link_pk = %d)', $consumerId, $this->
escape($resourceLink->title),
578 $this->escape($resourceLink->getId()), $this->
escape($settingsValue), $primaryResourceLinkId, $approved,
579 $this->
escape($now), $contextId, $id);
581 $sql = sprintf(
"UPDATE {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' SET ' .
582 'context_pk = %s, title = %s, lti_resource_link_id = %s, settings = %s, ' .
583 'primary_resource_link_pk = %s, share_approved = %s, updated = %s ' .
584 'WHERE (consumer_pk = %s) AND (resource_link_pk = %d)', $contextId, $this->
escape($resourceLink->title),
585 $this->escape($resourceLink->getId()), $this->
escape($settingsValue), $primaryResourceLinkId, $approved,
586 $this->
escape($now), $consumerId, $id);
588 $ok = pg_query($this->db, $sql);
591 $resourceLink->setRecordId($this->insert_id());
592 $resourceLink->created = $time;
594 $resourceLink->updated = $time;
610 $sql = sprintf(
"DELETE FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_SHARE_KEY_TABLE_NAME .
' ' .
611 'WHERE (resource_link_pk = %d)', $resourceLink->getRecordId());
612 $ok = pg_query($this->db, $sql);
616 $sql = sprintf(
"DELETE FROM {$this->dbTableNamePrefix}" . static::USER_RESULT_TABLE_NAME .
' ' .
617 'WHERE (resource_link_pk = %d)', $resourceLink->getRecordId());
618 $ok = pg_query($this->db, $sql);
623 $sql = sprintf(
"UPDATE {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' ' .
624 'SET primary_resource_link_pk = NULL ' .
625 'WHERE (primary_resource_link_pk = %d)', $resourceLink->getRecordId());
626 $ok = pg_query($this->db, $sql);
631 $sql = sprintf(
"DELETE FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' ' .
632 'WHERE (resource_link_pk = %s)', $resourceLink->getRecordId());
633 $ok = pg_query($this->db, $sql);
637 $resourceLink->initialize();
657 $userResults = array();
660 $sql = sprintf(
'SELECT u.user_result_pk, u.lti_result_sourcedid, u.lti_user_id, u.created, u.updated ' .
661 "FROM {$this->dbTableNamePrefix}" . static::USER_RESULT_TABLE_NAME .
' AS u ' .
662 "INNER JOIN {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' AS rl ' .
663 'ON u.resource_link_pk = rl.resource_link_pk ' .
664 "WHERE (rl.resource_link_pk = %d) AND (rl.primary_resource_link_pk IS NULL)", $resourceLink->getRecordId());
666 $sql = sprintf(
'SELECT u.user_result_pk, u.lti_result_sourcedid, u.lti_user_id, u.created, u.updated ' .
667 "FROM {$this->dbTableNamePrefix}" . static::USER_RESULT_TABLE_NAME .
' AS u ' .
668 "INNER JOIN {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' AS rl ' .
669 'ON u.resource_link_pk = rl.resource_link_pk ' .
670 'WHERE ((rl.resource_link_pk = %d) AND (rl.primary_resource_link_pk IS NULL)) OR ' .
671 '((rl.primary_resource_link_pk = %d) AND share_approved)', $resourceLink->getRecordId(),
672 $resourceLink->getRecordId());
674 $rsUser = pg_query($this->db, $sql);
676 while ($row = pg_fetch_object($rsUser)) {
678 if (is_null($idScope)) {
679 $userResults[] = $userresult;
681 $userResults[$userresult->getId($idScope)] = $userresult;
700 $sql = sprintf(
'SELECT c.consumer_name, r.resource_link_pk, r.title, r.share_approved ' .
701 "FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' AS r ' .
702 "INNER JOIN {$this->dbTableNamePrefix}" . static::CONSUMER_TABLE_NAME .
' AS c ON r.consumer_pk = c.consumer_pk ' .
703 'WHERE (r.primary_resource_link_pk = %d) ' .
705 'SELECT c2.consumer_name, r2.resource_link_pk, r2.title, r2.share_approved ' .
706 "FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_TABLE_NAME .
' AS r2 ' .
707 "INNER JOIN {$this->dbTableNamePrefix}" . static::CONTEXT_TABLE_NAME .
' AS x ON r2.context_pk = x.context_pk ' .
708 "INNER JOIN {$this->dbTableNamePrefix}" . static::CONSUMER_TABLE_NAME .
' AS c2 ON x.consumer_pk = c2.consumer_pk ' .
709 'WHERE (r2.primary_resource_link_pk = %d) ' .
710 'ORDER BY consumer_name, title', $resourceLink->getRecordId(), $resourceLink->getRecordId());
711 $rsShare = pg_query($this->db, $sql);
713 while ($row = pg_fetch_object($rsShare)) {
715 $share->resourceLinkId = intval($row->resource_link_pk);
716 $share->approved = (intval($row->share_approved) === 1);
725 ### ConsumerNonce methods 740 $now = date(
"{$this->dateFormat} {$this->timeFormat}", time());
741 $sql =
"DELETE FROM {$this->dbTableNamePrefix}" . static::NONCE_TABLE_NAME .
" WHERE expires <= '{$now}'";
742 pg_query($this->db, $sql);
745 $sql = sprintf(
"SELECT value AS T FROM {$this->dbTableNamePrefix}" . static::NONCE_TABLE_NAME .
' WHERE (consumer_pk = %d) AND (value = %s)',
746 $nonce->getConsumer()->getRecordId(), $this->
escape($nonce->getValue()));
747 $rs_nonce = pg_query($this->db, $sql);
749 if (pg_fetch_object($rs_nonce)) {
766 $expires = date(
"{$this->dateFormat} {$this->timeFormat}", $nonce->expires);
767 $sql = sprintf(
"INSERT INTO {$this->dbTableNamePrefix}" . static::NONCE_TABLE_NAME .
" (consumer_pk, value, expires) VALUES (%d, %s, %s)",
768 $nonce->getConsumer()->getRecordId(), $this->
escape($nonce->getValue()), $this->
escape($expires));
769 $ok = pg_query($this->db, $sql);
775 ### ResourceLinkShareKey methods 790 $now = date(
"{$this->dateFormat} {$this->timeFormat}", time());
791 $sql =
"DELETE FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_SHARE_KEY_TABLE_NAME .
" WHERE expires <= '{$now}'";
792 pg_query($this->db, $sql);
795 $id = pg_escape_string($this->db, $shareKey->getId());
796 $sql =
'SELECT resource_link_pk, auto_approve, expires ' .
797 "FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_SHARE_KEY_TABLE_NAME .
' ' .
798 "WHERE share_key_id = '{$id}'";
799 $rsShareKey = pg_query($this->db, $sql);
801 $row = pg_fetch_object($rsShareKey);
802 if ($row && (intval($row->resource_link_pk) === $shareKey->resourceLinkId)) {
803 $shareKey->autoApprove = (intval($row->auto_approve) === 1);
804 $shareKey->expires = strtotime($row->expires);
821 if ($shareKey->autoApprove) {
826 $expires = date(
"{$this->dateFormat} {$this->timeFormat}", $shareKey->expires);
827 $sql = sprintf(
"INSERT INTO {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_SHARE_KEY_TABLE_NAME .
' ' .
828 '(share_key_id, resource_link_pk, auto_approve, expires) ' .
829 "VALUES (%s, %d, {$approve}, '{$expires}')", $this->
escape($shareKey->getId()), $shareKey->resourceLinkId);
830 $ok = pg_query($this->db, $sql);
844 $sql =
"DELETE FROM {$this->dbTableNamePrefix}" . static::RESOURCE_LINK_SHARE_KEY_TABLE_NAME .
" WHERE share_key_id = '{$shareKey->getId()}'";
846 $ok = pg_query($this->db, $sql);
849 $shareKey->initialize();
856 ### UserResult methods 869 if (!is_null($userresult->getRecordId())) {
870 $sql = sprintf(
'SELECT user_result_pk, resource_link_pk, lti_user_id, lti_result_sourcedid, created, updated ' .
871 "FROM {$this->dbTableNamePrefix}" . static::USER_RESULT_TABLE_NAME .
' ' .
872 'WHERE (user_result_pk = %d)', $userresult->getRecordId());
874 $sql = sprintf(
'SELECT user_result_pk, resource_link_pk, lti_user_id, lti_result_sourcedid, created, updated ' .
875 "FROM {$this->dbTableNamePrefix}" . static::USER_RESULT_TABLE_NAME .
' ' .
876 'WHERE (resource_link_pk = %d) AND (lti_user_id = %s)', $userresult->getResourceLink()->getRecordId(),
879 $rsUser = pg_query($this->db, $sql);
881 $row = pg_fetch_object($rsUser);
883 $userresult->setRecordId(intval($row->user_result_pk));
884 $userresult->setResourceLinkId(intval($row->resource_link_pk));
885 $userresult->ltiUserId = $row->lti_user_id;
886 $userresult->ltiResultSourcedId = $row->lti_result_sourcedid;
887 $userresult->created = strtotime($row->created);
888 $userresult->updated = strtotime($row->updated);
906 $now = date(
"{$this->dateFormat} {$this->timeFormat}", $time);
907 if (is_null($userresult->created)) {
908 $sql = sprintf(
"INSERT INTO {$this->dbTableNamePrefix}" . static::USER_RESULT_TABLE_NAME .
' (resource_link_pk, ' .
909 'lti_user_id, lti_result_sourcedid, created, updated) ' .
910 'VALUES (%d, %s, %s, %s, %s)', $userresult->getResourceLink()->getRecordId(),
912 $this->
escape($userresult->ltiResultSourcedId), $this->
escape($now), $this->
escape($now));
914 $sql = sprintf(
"UPDATE {$this->dbTableNamePrefix}" . static::USER_RESULT_TABLE_NAME .
' ' .
915 'SET lti_result_sourcedid = %s, updated = %s ' .
916 'WHERE (user_result_pk = %d)', $this->
escape($userresult->ltiResultSourcedId), $this->escape($now),
917 $userresult->getRecordId());
919 $ok = pg_query($this->db, $sql);
921 if (is_null($userresult->created)) {
922 $userresult->setRecordId($this->insert_id());
923 $userresult->created = $time;
925 $userresult->updated = $time;
940 $sql = sprintf(
"DELETE FROM {$this->dbTableNamePrefix}" . static::USER_RESULT_TABLE_NAME .
' ' .
941 'WHERE (user_result_pk = %d)', $userresult->getRecordId());
942 $ok = pg_query($this->db, $sql);
945 $userresult->initialize();
951 private function insert_id()
953 $rsId = pg_query(
'SELECT lastval();');
954 $row = pg_fetch_row($rsId);
955 return intval($row[0]);
969 public function escape($value, $addQuotes =
true)
971 if (is_null($value)) {
974 $value = pg_escape_string($this->db, $value);
976 $value =
"'{$value}'";
static fromResourceLink($resourceLink, $ltiUserId)
Class constructor from resource link.
getSharesResourceLink($resourceLink)
Get array of shares defined for this resource link.
Class to provide a connection to a persistent store for LTI objects.
deleteUserResult($userresult)
Delete user object.
saveResourceLinkShareKey($shareKey)
Save resource link share key object.
saveContext($context)
Save context object.
loadToolConsumer($consumer)
Load tool consumer object.
Class to represent a tool consumer context.
loadContext($context)
Load context object.
saveToolConsumer($consumer)
Save tool consumer object.
saveConsumerNonce($nonce)
Save nonce object.
Class to represent a tool consumer nonce.
Class to represent a tool consumer resource link share.
deleteResourceLinkShareKey($shareKey)
Delete resource link share key object.
loadResourceLinkShareKey($shareKey)
Load resource link share key object.
deleteResourceLink($resourceLink)
Delete resource link object.
Class to represent an LTI Data Connector for PostgreSQL.
loadUserResult($userresult)
Load user object.
Class to represent a tool consumer user.
getToolConsumers()
Load all tool consumers from the database.
saveUserResult($userresult)
Save user object.
loadResourceLink($resourceLink)
Load resource link object.
loadConsumerNonce($nonce)
Load nonce object.
Class to represent a tool consumer resource link share key.
escape($value, $addQuotes=true)
Escape a string for use in a database query.
Class to represent a tool consumer resource link.
saveResourceLink($resourceLink)
Save resource link object.
deleteContext($context)
Delete context object.
getUserResultSourcedIDsResourceLink($resourceLink, $localOnly, $idScope)
Get array of user objects.
deleteToolConsumer($consumer)
Delete tool consumer object.