4if($updater->CanUpdateDatabase())
19 const OPTION_ID =
'~LearnInstall201203ConvertDB::_IsAlreadyConverted';
30 public static function run()
37 if ( !
$DB->TableExists(
'b_learn_lesson') )
42 if ( ! self::IsNewRightsModelInitialized($step, $msg) )
46 if ( ! self::IsNewRightsModelInitialized($step, $msg) )
48 $errorMessage .=
'FAILED on step ' . $step .
'; msg = ' . $msg .
'.';
61 catch (CLearnInstall201203ConvertDBException $e)
65 .
"; with message: " . $e->getMessage();
67 catch (CLearnInstall201203ConvertDBTimeOut $e)
79 $errorMessage .=
"Cautch general exception at line: " . $e->getLine()
80 .
"; with message: " . $e->getMessage();
91 $DB->StartTransaction();
103 protected static function Commit()
118 $arTasksOperations =
array(
119 'learning_lesson_access_denied' =>
array(),
120 'learning_lesson_access_read' =>
array(
123 'learning_lesson_access_manage_basic' =>
array(
129 'learning_lesson_access_linkage_as_child' =>
array(
131 'lesson_link_to_parents',
132 'lesson_unlink_from_parents'
134 'learning_lesson_access_linkage_as_parent' =>
array(
136 'lesson_link_descendants',
137 'lesson_unlink_descendants'
139 'learning_lesson_access_linkage_any' =>
array(
141 'lesson_link_to_parents',
142 'lesson_unlink_from_parents',
143 'lesson_link_descendants',
144 'lesson_unlink_descendants'
146 'learning_lesson_access_manage_as_child' =>
array(
151 'lesson_link_to_parents',
152 'lesson_unlink_from_parents'
154 'learning_lesson_access_manage_as_parent' =>
array(
159 'lesson_link_descendants',
160 'lesson_unlink_descendants'
162 'learning_lesson_access_manage_dual' =>
array(
167 'lesson_link_to_parents',
168 'lesson_unlink_from_parents',
169 'lesson_link_descendants',
170 'lesson_unlink_descendants'
172 'learning_lesson_access_manage_full' =>
array(
177 'lesson_link_to_parents',
178 'lesson_unlink_from_parents',
179 'lesson_link_descendants',
180 'lesson_unlink_descendants',
181 'lesson_manage_rights'
185 return ($arTasksOperations);
191 $arAllOperations =
array(
196 'lesson_link_to_parents',
197 'lesson_unlink_from_parents',
198 'lesson_link_descendants',
199 'lesson_unlink_descendants',
200 'lesson_manage_rights'
203 return ($arAllOperations);
216 $rc =
$DB->Query (
"SELECT ID, NAME, BINDING FROM b_operation WHERE MODULE_ID = 'learning'",
true);
219 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
221 $arOperationsInDB =
array();
222 while ($arOperation = $rc->Fetch())
224 if (mb_substr($arOperation[
'NAME'], 0, 7) ===
'lesson_')
229 if ($arOperation[
'BINDING'] !== $binding)
230 throw new Exception();
232 $arOperationsInDB[$arOperation[
'NAME']] = $arOperation[
'ID'];
235 if (
count($arOperationsInDB) !==
count($arAllOperations))
236 throw new Exception();
238 foreach ($arAllOperations as $operationName)
240 if ( ! isset($arOperationsInDB[$operationName]) )
241 throw new Exception();
244 return ($arOperationsInDB);
252 $rc =
$DB->Query (
"SELECT ID, NAME, BINDING FROM b_task WHERE MODULE_ID = 'learning'",
true);
255 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
257 $arTasksInDB =
array();
258 while ($arTask = $rc->Fetch())
260 if (mb_substr($arTask[
'NAME'], 0, 16) ===
'learning_lesson_')
265 if ($arTask[
'BINDING'] !== $binding)
266 throw new Exception();
268 $arTasksInDB[$arTask[
'NAME']] = $arTask[
'ID'];
271 if (
count($arTasksInDB) !==
count($arTasksOperations))
273 throw new Exception(
'count($arTasksInDB) = '
274 .
count($arTasksInDB)
275 .
'; count($arTasksOperations) = '
276 .
count($arTasksOperations));
279 foreach (array_keys($arTasksOperations) as $taskName)
281 if ( ! isset($arTasksInDB[$taskName]) )
282 throw new Exception();
285 return ($arTasksInDB);
293 foreach ($arTasksInDB as $taskName => $taskId)
295 if ( ! isset($arTasksOperations[$taskName]) )
296 throw new Exception();
298 $arCurTaskOperations = $arTasksOperations[$taskName];
299 $arCurTaskOperationsIDs =
array();
300 foreach ($arCurTaskOperations as $operationName)
302 if ( ! isset($arOperationsInDB[$operationName]) )
303 throw new Exception();
305 $operationId = $arOperationsInDB[$operationName];
307 $arCurTaskOperationsIDs[$operationId] =
'operation';
311 $rc =
$DB->Query (
"SELECT OPERATION_ID FROM b_task_operation WHERE TASK_ID = " . ($taskId + 0),
true);
314 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
318 while ($arRelation = $rc->Fetch())
320 if ( ! isset($arCurTaskOperationsIDs[$arRelation[
'OPERATION_ID']]) )
321 throw new Exception();
323 unset ($arCurTaskOperationsIDs[$arRelation[
'OPERATION_ID']]);
326 if (
count($arCurTaskOperationsIDs) > 0)
327 throw new Exception();
350 $step = $e->getLine();
351 $msg = $e->getMessage();
363 $arOperationsInDB =
array();
365 foreach ($arAllOperations as $operationName)
367 if (mb_substr($operationName, 0, 7) ===
'lesson_')
373 'NAME' =>
"'" .
$DB->ForSql($operationName) .
"'",
374 'MODULE_ID' =>
"'learning'",
375 'DESCRIPTION' =>
'NULL',
376 'BINDING' =>
"'" . $binding .
"'"
389 throw new Exception();
391 $arOperationsInDB[$operationName] = $id;
394 return ($arOperationsInDB);
402 $arOld2NewRightsMatrix =
array(
403 'D' =>
'learning_lesson_access_read',
404 'W' =>
'learning_lesson_access_manage_full'
409 $arDefaultRights =
array (
410 'learning_lesson_access_read' =>
array(),
411 'learning_lesson_access_manage_dual' =>
array(
'CR'),
412 'learning_lesson_access_manage_full' =>
array(
'G1')
416 while(
$zr = $rc->Fetch())
418 $group_id =
$zr[
'ID'];
422 $use_default_level =
"N",
423 $max_right_for_super_admin =
"N",
426 if (isset($arOld2NewRightsMatrix[$oldSymbol]))
428 $newSymbol = $arOld2NewRightsMatrix[$oldSymbol];
429 if (isset($arDefaultRights[$newSymbol]))
430 $arDefaultRights[$newSymbol][] =
'G' . $group_id;
436 foreach ($arTasksOperations as $taskName => $arOperationsForTask)
438 if (mb_substr($taskName, 0, 16) ===
'learning_lesson_')
444 'NAME' =>
"'" .
$DB->ForSql($taskName) .
"'",
446 'MODULE_ID' =>
"'learning'",
448 'DESCRIPTION' =>
'NULL',
449 'BINDING' =>
"'" . $binding .
"'"
452 $taskId =
$DB->Insert(
461 if ($taskId ===
false)
462 throw new Exception();
465 foreach ($arOperationsForTask as $operationName)
467 if ( ! isset($arOperationsInDB[$operationName]) )
468 throw new Exception();
470 $operationId = (int) $arOperationsInDB[$operationName];
473 "INSERT INTO b_task_operation (TASK_ID, OPERATION_ID)
474 VALUES (" . (
int) $taskId .
", " . (
int) $operationId .
")",
true);
477 throw new Exception();
481 if ( array_key_exists($taskName, $arDefaultRights) )
483 $arDefaultRights[$taskName] = array_unique($arDefaultRights[$taskName]);
484 foreach ($arDefaultRights[$taskName] as $subject_id)
487 "INSERT INTO b_learn_rights_all (SUBJECT_ID, TASK_ID)
488 VALUES ('" .
$DB->ForSQL($subject_id) .
"', " . (
int) $taskId .
")",
492 throw new Exception();
504 "DELETE FROM b_task_operation
505 WHERE TASK_ID IN (SELECT ID FROM b_task WHERE MODULE_ID = 'learning')
506 OR OPERATION_ID IN (SELECT ID FROM b_operation WHERE MODULE_ID = 'learning')",
508 "DELETE FROM b_operation
509 WHERE MODULE_ID = 'learning'",
512 WHERE MODULE_ID = 'learning'"
519 throw new Exception (
'EA_SQLERROR in query #' .
$key);
531 if ( !
$DB->TableExists(
'b_learn_rights_all') )
544 if ( !
$DB->TableExists(
'b_learn_rights_all') )
547 $sql_tbl_b_learn_rights_all =
"
548 CREATE TABLE b_learn_rights_all (
549 SUBJECT_ID VARCHAR( 100 ) NOT NULL ,
550 TASK_ID INT NOT NULL ,
551 PRIMARY KEY ( SUBJECT_ID )
554 $rc =
$DB->Query($sql_tbl_b_learn_rights_all);
556 throw new CLearnInstall201203ConvertDBException(__LINE__ .
'/tbl: sql_tbl_b_learn_rights_all');
569 if (self::_IsAlreadyConverted() ===
true)
575 throw new CLearnInstall201203ConvertDBException(
'SetOptionString() failed!');
622 throw new CLearnInstall201203ConvertDBException(
'SetOptionString() failed!');
630 $arTaskIdByOldSymbol =
array();
632 'R' =>
'learning_lesson_access_read',
633 'W' =>
'learning_lesson_access_manage_basic',
634 'X' =>
'learning_lesson_access_manage_full');
636 foreach (
$arTasks as $oldSymbol => $taskName)
641 WHERE NAME = '" . $taskName .
"'",
645 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
649 if ( ! isset($row[
'ID']) )
650 throw new CLearnInstall201203ConvertDBException(
'EA_LOGIC');
652 $arTaskIdByOldSymbol[$oldSymbol] = (int) $row[
'ID'];
658 "SELECT TLL.ID, TLCP.PERMISSION, TLCP.USER_GROUP_ID
659 FROM b_learn_lesson TLL
660 INNER JOIN b_learn_course_permission TLCP
661 ON TLL.COURSE_ID = TLCP.COURSE_ID
662 WHERE TLL.COURSE_ID > 0
663 AND TLCP.PERMISSION != 'D'
667 SELECT TLL.ID, TLCP.PERMISSION, TLCP.USER_GROUP_ID
668 FROM b_learn_lesson TLL
669 INNER JOIN b_learn_course_permission TLCP
670 ON TLL.WAS_COURSE_ID = TLCP.COURSE_ID
671 WHERE TLL.COURSE_ID = 0
672 AND TLL.WAS_COURSE_ID > 0
673 AND TLCP.PERMISSION != 'D'
679 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
681 while ($row =
$res->Fetch())
683 $lessonId = $row[
'ID'];
684 $permission = $row[
'PERMISSION'];
685 $user_group_id = $row[
'USER_GROUP_ID'];
687 $group =
'G' . $user_group_id;
690 if ( ! in_array($permission,
array(
'R',
'W',
'X'),
true) )
693 $task_id = $arTaskIdByOldSymbol[$permission];
696 "DELETE FROM b_learn_rights
697 WHERE LESSON_ID = " . (
int) $lessonId .
"
698 AND SUBJECT_ID = '" .
$DB->ForSql($group) .
"'",
701 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
705 "INSERT INTO b_learn_rights (LESSON_ID, SUBJECT_ID, TASK_ID)
706 VALUES (" . (
int) $lessonId .
", '" .
$DB->ForSql($group) .
"', '" . $task_id .
"')",
true);
709 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
715 protected static function AddPath()
720 "SELECT DISTINCT SITE_ID
721 FROM b_learn_site_path
725 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
727 $arSitesIds =
array();
728 while ($row =
$res->Fetch())
729 $arSitesIds[] = $row[
'SITE_ID'];
734 "DELETE FROM b_learn_site_path
735 WHERE SITE_ID = '" .
$DB->ForSql(
$siteId) .
"'
736 AND TYPE = 'U'",
true);
739 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
743 FROM b_learn_site_path TSP
744 WHERE TYPE = 'C' AND SITE_ID = '" .
$DB->ForSql(
$siteId) .
"'",
748 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
750 $row =
$res->Fetch();
751 if (isset($row[
'PATH']))
753 $path = str_replace(
'COURSE_ID=#COURSE_ID#',
'LESSON_PATH=#LESSON_PATH#', $row[
'PATH']);
757 $path =
'/services/learning/course.php?LESSON_PATH=#LESSON_PATH#';
762 'SITE_ID' =>
"'" .
$DB->ForSql(
$siteId) .
"'",
763 'PATH' =>
"'" .
$DB->ForSql(
$path) .
"'",
781 "SELECT ID, COURSE_ID, CHAPTER_ID, ACTIVE, SORT, WAS_CHAPTER_ID,
782 WAS_PARENT_CHAPTER_ID, WAS_PARENT_COURSE_ID
784 WHERE JOURNAL_STATUS != " . self::JOURNAL_STATUS_LESSON_EDGES_CREATED .
"
785 AND WAS_COURSE_ID IS NULL",
786 $ignore_errors =
true);
789 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
791 while ($arLesson =
$res->Fetch())
793 $sort = $arLesson[
'SORT'];
795 $childNodeId = $arLesson[
'ID'];
798 if ($arLesson[
'WAS_CHAPTER_ID'] === NULL)
800 if ($arLesson[
'CHAPTER_ID'] !== NULL)
805 elseif ($arLesson[
'COURSE_ID'] !== NULL)
814 $parentNodeId = NULL;
819 if ($arLesson[
'WAS_PARENT_CHAPTER_ID'] !== NULL)
824 elseif ($arLesson[
'WAS_PARENT_COURSE_ID'] !== NULL)
833 $parentNodeId = NULL;
837 if ($parentNodeId === NULL)
839 elseif ($parentNodeId === -1)
854 $errorMessage .=
"Problem occured with CHAPTER_ID = " . $arLesson[
'CHAPTER_ID']
855 .
"; COURSE_ID = " . $arLesson[
'COURSE_ID'] .
"<br>\n";
857 elseif ($parentNodeId <= 0)
860 throw new CLearnInstall201203ConvertDBException(
'EA_OTHER: invalid parentNodeId for lesson_id = ' . $arLesson[
'ID']);
885 $rc =
$DB->Update(
'b_learn_lesson',
886 array (
'JOURNAL_STATUS' => self::JOURNAL_STATUS_LESSON_EDGES_CREATED),
887 "WHERE ID = '" . ($lessonId + 0) .
"'",
888 $error_position =
"",
890 $ignore_errors =
true
894 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
907 "DELETE FROM b_learn_lesson_edges
908 WHERE SOURCE_NODE = '" . $parentNodeId .
"'
909 AND TARGET_NODE = '" . $childNodeId .
"'",
910 $ignore_errors =
true);
913 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
917 "INSERT INTO b_learn_lesson_edges (SOURCE_NODE, TARGET_NODE, SORT)
918 VALUES ('" . $parentNodeId .
"', '" . $childNodeId .
"', '" . $sort .
"')",
919 $ignore_errors =
true);
922 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
934 "SELECT ID FROM b_learn_lesson
935 WHERE WAS_CHAPTER_ID = '" . ($b_learn_chapter_ID + 0) .
"'",
936 $ignore_errors =
true);
939 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
941 if ($arLesson =
$res->Fetch())
942 return ($arLesson[
'ID'] + 0);
956 "SELECT ID FROM b_learn_lesson
957 WHERE WAS_COURSE_ID = '" . ($b_learn_course_ID + 0) .
"'",
958 $ignore_errors =
true);
961 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
963 if ($arLesson =
$res->Fetch())
964 return ($arLesson[
'ID'] + 0);
978 $res =
$DB->Query (
"SELECT * FROM b_learn_course WHERE JOURNAL_STATUS != " . self::JOURNAL_STATUS_COURSE_LINKED,
979 $ignore_errors =
true);
982 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
984 while ($arCourses =
$res->Fetch())
987 'ACTIVE' => $arCourses[
'ACTIVE'],
988 'NAME' => ($arCourses[
'NAME'] === NULL) ?
false : $arCourses[
'NAME'],
989 'CODE' => ($arCourses[
'CODE'] === NULL) ?
false : $arCourses[
'CODE'],
990 'SORT' => $arCourses[
'SORT'],
991 'PREVIEW_PICTURE' => ($arCourses[
'PREVIEW_PICTURE'] === NULL) ?
false : $arCourses[
'PREVIEW_PICTURE'],
992 'DETAIL_PICTURE' => ($arCourses[
'PREVIEW_PICTURE'] === NULL) ?
false : $arCourses[
'PREVIEW_PICTURE'],
993 'PREVIEW_TEXT_TYPE' => $arCourses[
'PREVIEW_TEXT_TYPE'],
994 'DETAIL_TEXT_TYPE' => $arCourses[
'DESCRIPTION_TYPE'],
996 'JOURNAL_STATUS' => self::JOURNAL_STATUS_UNPROCESSED,
997 'WAS_CHAPTER_ID' =>
false,
998 'WAS_PARENT_CHAPTER_ID' =>
false,
999 'WAS_PARENT_COURSE_ID' =>
false,
1000 'WAS_COURSE_ID' => $arCourses[
'ID'],
1001 'PREVIEW_TEXT' => $arCourses[
'PREVIEW_TEXT'],
1002 'DETAIL_TEXT' => $arCourses[
'DESCRIPTION']
1009 $rc =
$DB->Update (
'b_learn_course',
1010 array (
'LINKED_LESSON_ID' => $id_of_new_lesson),
1011 "WHERE ID = '" . ($arCourses[
'ID'] + 0) .
"'",
1012 $error_position =
"",
1014 $ignore_errors =
true
1018 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
1021 $rc =
$DB->Update(
'b_learn_course',
1022 array (
'JOURNAL_STATUS' => self::JOURNAL_STATUS_COURSE_LINKED),
1023 "WHERE ID = '" . ($arCourses[
'ID'] + 0) .
"'",
1024 $error_position =
"",
1026 $ignore_errors =
true
1030 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
1046 static $started_at =
false;
1047 static $time_limit =
false;
1049 if ($started_at ===
false)
1051 $started_at = microtime (
true);
1053 $rc = ini_get(
'max_execution_time');
1054 if (($rc ===
false) || ($rc ===
'') || ($rc < 0))
1057 set_time_limit (28);
1060 $rc = ini_get(
'max_execution_time');
1063 if (($rc ===
false) || ($rc ===
'') || ($rc < 0))
1083 $time_limit = ($rc + 0);
1087 $time_executed = microtime(
true) - $started_at;
1088 $time_left = $time_limit - $time_executed;
1091 throw new CLearnInstall201203ConvertDBTimeOut();
1101 $res =
$DB->Query (
"SELECT * FROM b_learn_chapter WHERE JOURNAL_STATUS != " . self::JOURNAL_STATUS_CHAPTER_COPIED,
1102 $ignore_errors =
true);
1105 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
1107 while ($arChapter =
$res->Fetch())
1110 'ACTIVE' => $arChapter[
'ACTIVE'],
1111 'NAME' => ($arChapter[
'NAME'] === NULL) ?
false : $arChapter[
'NAME'],
1112 'CODE' => ($arChapter[
'CODE'] === NULL) ?
false : $arChapter[
'CODE'],
1113 'SORT' => (
string) (1000000 + (
int) $arChapter[
'SORT']),
1114 'PREVIEW_PICTURE' => ($arChapter[
'PREVIEW_PICTURE'] === NULL) ?
false : $arChapter[
'PREVIEW_PICTURE'],
1115 'PREVIEW_TEXT' => $arChapter[
'PREVIEW_TEXT'],
1116 'PREVIEW_TEXT_TYPE' => $arChapter[
'PREVIEW_TEXT_TYPE'],
1117 'DETAIL_PICTURE' => ($arChapter[
'DETAIL_PICTURE'] === NULL) ?
false : $arChapter[
'DETAIL_PICTURE'],
1118 'DETAIL_TEXT' => $arChapter[
'DETAIL_TEXT'],
1119 'DETAIL_TEXT_TYPE' => $arChapter[
'DETAIL_TEXT_TYPE'],
1121 'JOURNAL_STATUS' => self::JOURNAL_STATUS_UNPROCESSED,
1122 'WAS_CHAPTER_ID' => ($arChapter[
'ID']),
1123 'WAS_PARENT_CHAPTER_ID' => ($arChapter[
'CHAPTER_ID'] === NULL) ?
false : $arChapter[
'CHAPTER_ID'],
1124 'WAS_PARENT_COURSE_ID' => ($arChapter[
'COURSE_ID'] === NULL) ?
false : $arChapter[
'COURSE_ID'],
1125 'WAS_COURSE_ID' =>
false
1136 "UPDATE b_learn_test
1137 SET TIMESTAMP_X = " .
$DB->GetNowFunction()
1138 .
", QUESTIONS_FROM = 'R',
1139 QUESTIONS_FROM_ID = " . ($id_of_new_lesson + 0)
1140 .
" WHERE QUESTIONS_FROM = 'H'
1141 AND QUESTIONS_FROM_ID = '" . ($arChapter[
'ID'] + 0) .
"'",
1142 $ignore_errors =
true
1146 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
1149 $rc =
$DB->Update(
'b_learn_chapter',
1150 array (
'JOURNAL_STATUS' => self::JOURNAL_STATUS_CHAPTER_COPIED),
1151 "WHERE ID = '" . ($arChapter[
'ID'] + 0) .
"'",
1152 $error_position =
"",
1154 $ignore_errors =
true
1158 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
1179 throw new CLearnInstall201203ConvertDBException(
'EA_PARAMS');
1185 if (array_key_exists(
'WAS_CHAPTER_ID',
$arFields)
1186 && (
$arFields[
'WAS_CHAPTER_ID'] !==
false)
1190 $sqlWhere =
"WAS_CHAPTER_ID = '" . (
$arFields[
'WAS_CHAPTER_ID'] + 0) .
"'";
1193 && (
$arFields[
'WAS_COURSE_ID'] !==
false)
1197 $sqlWhere =
"WAS_COURSE_ID = '" . (
$arFields[
'WAS_COURSE_ID'] + 0) .
"'";
1201 throw new CLearnInstall201203ConvertDBException(
'EA_PARAMS');
1205 $rc =
$DB->Query (
"DELETE FROM b_learn_lesson WHERE " . $sqlWhere, $ignore_errors =
true);
1207 throw new CLearnInstall201203ConvertDBException(
'EA_SQLERROR');
1215 return ($newLessonId);
1233 if ($rc === self::STATUS_INSTALL_NEVER_START)
1237 if (
$DB->TableExists(
'b_learn_lesson_edges')
1238 &&
$DB->TableExists(
'b_learn_rights_all')
1239 && ( !
$DB->TableExists(
'b_learn_course_permission') )
1247 elseif ($rc === self::STATUS_INSTALL_COMPLETE)
1249 elseif ($rc === self::STATUS_INSTALL_INCOMPLETE)
1260 if ( !
$DB->TableExists(
'b_learn_course_permission') )
1263 $rc =
$DB->Query (
"DROP TABLE b_learn_course_permission",
true);
1265 throw new CLearnInstall201203ConvertDBException(
'Can\'t DROP `b_learn_course_permission` under database engine: mysql');
1272 if (
$DB->TableExists(
'b_learn_lesson_edges'))
1276 =
"CREATE TABLE b_learn_lesson_edges (
1277 SOURCE_NODE INT NOT NULL ,
1278 TARGET_NODE INT NOT NULL ,
1279 SORT INT NOT NULL DEFAULT '500',
1280 PRIMARY KEY ( SOURCE_NODE , TARGET_NODE )
1283 $rc =
$DB->Query ($sql, $ignore_errors =
true);
1285 throw new CLearnInstall201203ConvertDBException(
'Can\'t create `b_learn_lesson_edges` under database engine: mysql');
1292 $arTableFields =
array(
1293 'b_learn_lesson' =>
$DB->GetTableFieldsList (
'b_learn_lesson'),
1294 'b_learn_chapter' =>
$DB->GetTableFieldsList (
'b_learn_chapter'),
1295 'b_learn_course' =>
$DB->GetTableFieldsList (
'b_learn_course')
1299 $other_sql_skip_errors =
array();
1300 $other_sql =
array();
1303 $sql_add[
'b_learn_lesson'] =
array (
1304 'KEYWORDS' =>
"ALTER TABLE b_learn_lesson ADD KEYWORDS TEXT NOT NULL DEFAULT ''",
1305 'CODE' =>
"ALTER TABLE b_learn_lesson ADD CODE VARCHAR( 50 ) NULL DEFAULT NULL",
1306 'WAS_CHAPTER_ID' =>
"ALTER TABLE b_learn_lesson ADD WAS_CHAPTER_ID INT NULL DEFAULT NULL",
1307 'WAS_PARENT_CHAPTER_ID' =>
"ALTER TABLE b_learn_lesson ADD WAS_PARENT_CHAPTER_ID INT NULL DEFAULT NULL",
1308 'WAS_PARENT_COURSE_ID' =>
"ALTER TABLE b_learn_lesson ADD WAS_PARENT_COURSE_ID INT NULL DEFAULT NULL",
1309 'WAS_COURSE_ID' =>
"ALTER TABLE b_learn_lesson ADD WAS_COURSE_ID INT NULL DEFAULT NULL",
1310 'JOURNAL_STATUS' =>
"ALTER TABLE b_learn_lesson ADD JOURNAL_STATUS INT NOT NULL DEFAULT '0'"
1313 $sql_add[
'b_learn_chapter'] =
array (
1314 'JOURNAL_STATUS' =>
"ALTER TABLE b_learn_chapter ADD JOURNAL_STATUS INT NOT NULL DEFAULT '0'"
1317 $sql_add[
'b_learn_course'] =
array (
1318 'LINKED_LESSON_ID' =>
"ALTER TABLE b_learn_course ADD LINKED_LESSON_ID INT NULL DEFAULT NULL",
1319 'JOURNAL_STATUS' =>
"ALTER TABLE b_learn_course ADD JOURNAL_STATUS INT NOT NULL DEFAULT '0'"
1322 $sql_tbl_b_learn_rights =
"
1323 CREATE TABLE b_learn_rights (
1324 LESSON_ID INT UNSIGNED NOT NULL ,
1325 SUBJECT_ID VARCHAR( 100 ) NOT NULL ,
1326 TASK_ID INT NOT NULL ,
1327 PRIMARY KEY ( LESSON_ID , SUBJECT_ID )
1330 $other_sql_skip_errors[] =
"ALTER TABLE b_learn_course ALTER COLUMN NAME SET DEFAULT 'name'";
1331 $other_sql_skip_errors[] =
"ALTER TABLE b_learn_lesson ALTER COLUMN NAME SET DEFAULT 'name'";
1332 $other_sql_skip_errors[] =
"ALTER TABLE b_learn_lesson ALTER COLUMN COURSE_ID SET DEFAULT '0'";
1334 $other_sql_skip_errors[] =
"
1335 CREATE TABLE b_learn_publish_prohibition
1337 COURSE_LESSON_ID INT UNSIGNED NOT NULL ,
1338 PROHIBITED_LESSON_ID INT UNSIGNED NOT NULL ,
1339 PRIMARY KEY ( COURSE_LESSON_ID , PROHIBITED_LESSON_ID )
1342 $other_sql_skip_errors[] =
"
1343 CREATE TABLE b_learn_exceptions_log (
1344 DATE_REGISTERED datetime NOT NULL,
1345 CODE int(11) NOT NULL,
1346 MESSAGE text NOT NULL,
1347 FFILE text NOT NULL,
1348 LINE int(11) NOT NULL,
1349 BACKTRACE text NOT NULL
1352 if ( !
$DB->TableExists(
'b_learn_rights'))
1354 $rc =
$DB->Query($sql_tbl_b_learn_rights);
1356 throw new CLearnInstall201203ConvertDBException(__LINE__ .
'/tbl: sql_tbl_b_learn_rights');
1359 foreach ($sql_add as $tableName => $sql_for_table)
1362 foreach ($sql_for_table as $fieldName => $sql)
1364 if ( ! in_array($fieldName, $arTableFields[$tableName],
true) )
1366 $rc =
$DB->Query($sql, $ignore_erros =
true);
1369 throw new CLearnInstall201203ConvertDBException(__LINE__.
'/tbl:'.mb_strlen($fieldName));
1385 foreach ($other_sql_skip_errors as $sql)
1386 $rc =
$DB->Query($sql, $ignore_erros =
true);
1388 foreach ($other_sql as $sql)
1390 $rc =
$DB->Query($sql, $ignore_erros =
true);
1392 throw new CLearnInstall201203ConvertDBException(__LINE__ .
'/sql:' .
htmlspecialcharsbx($sql));
1396 $rc =
$DB->DDL(
"SELECT * FROM b_learn_lesson WHERE 1=1",
true);
1398 throw new CLearnInstall201203ConvertDBException(__LINE__ .
', on DDL\'s cache drop');
1440 public static function _GiveUp($msg =
false)
1443 throw new Exception (
'FATAL: ' . $msg);
1445 throw new Exception (
'Shit happens.');
static GetList($by='c_sort', $order='asc', $arFilter=[], $SHOW_USERS_AMOUNT="N")
static GetOptionString($module_id, $name, $def="", $site=false, $bExactSite=false)
static SetOptionString($module_id, $name, $value="", $desc=false, $site="")
const STATUS_INSTALL_COMPLETE
const STATUS_INSTALL_NEVER_START
static _GiveUp($msg=false)
static _MarkLessonAsProcessed($lessonId)
static InitializeNewRightsModel()
const JOURNAL_STATUS_UNPROCESSED
static _CreateEdgeForNodes($parentNodeId, $childNodeId, $sort)
static StartTransaction()
static _RemoveOrphanedTables()
static _processChapters()
static ConvertPermissions()
const JOURNAL_STATUS_CHAPTER_COPIED
const JOURNAL_STATUS_LESSON_EDGES_CREATED
static _RightsModelGetAllOperations()
const STATUS_INSTALL_INCOMPLETE
static _RightsModelCreateOperations()
static _CheckTasksInDB($arTasksOperations)
const JOURNAL_STATUS_COURSE_LINKED
static _GetChapterIdInNewDataModel($b_learn_chapter_ID)
static ReCreateTriggersForMSSQL()
static _UnrepeatableCreateLesson($arFields)
static _CheckOperationsInDB()
static _GetCourseIdInNewDataModel($b_learn_course_ID)
static _buildEdges(&$errorMessage)
static ConvertDB(&$errorMessage)
static _RightsModelCreateTasksAndRelation($arOperationsInDB)
static _CreateTblRightsAll()
static _RightsModelPurge()
static IsNewRightsModelInitialized(&$step, &$msg)
static _CreateFieldsInTbls()
static _RightsModelGetTasksWithOperations()
static _CheckTasksOperationsRelations($arOperationsInDB, $arTasksInDB, $arTasksOperations)
static _IsAlreadyConverted()
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
while($arParentIBlockProperty=$dbParentIBlockProperty->Fetch()) $errorMessage
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"