martes, mayo 22, 2007

Fin del proyecto

Finalmente, luego de varios meses de arduo trabajo, he presentado el proyecto y luego de la defensa del mismo ante el tribunal formado por Marc Alier, Miquel Barceló y Javier Verdú, ha sido aprobado con la fabulosa nota de 9,5.
Aprovecho para agradecer a todos mis compañeros de proyecto, en especial a Juan Luis Paton y a Mr.Pigui, además a mi director de proyecto, mister Marc Alier.
Hasta pronto!

jueves, noviembre 30, 2006

Reunión semana 8-9-10-11

En estas reuniones hemos estado tratando el tema de la migración de las ewikis a newwiki.
El proceso era bastante complicado debido a las múltiples variantes de versiones de ewiki, dfwiki y el propio moodle, y por otro lado estamos realizando operaciones que pueden afectar al contenido que los usuarios ya tuvieran en el sistema.

Durante la semana 8 hemos realizado un estudio del ámbito sobre el cuál debíamos realizar el proceso de migración.

Durante la semana 9 hemos implementado el proceso de migración.

La semana 10 y 11 la hemos dedicado a realizar pruebas exhaustivas y a depurar el proceso de migración para garantizar que se realiza correctamente.

Proceso de migracion ewiki´s

En un post anterior se comenta las versiones de la ewiki que puede exisitir en Moodle 1.6.
Tomando como base dicha versión de Moodle, describo los pasos generales del proceso de migración de la ewiki a la newwiki.
Este proceso reliza la migración del esquema de la bd y el contenido, manteniendo prácticamente la misma sintaxis que será interpretada por el parser con formato ewiki de la newiki .


  1. Ver si tenemos la dfwiki.
    • Si la tenemos, y la versión es mayor que la versión que estamos controlando, cancelamos la migración y notificamos al usuario.
    • Si la tenemos y la versión es menor o igual que la versión que estamos controlando ejecutamos la actualización llamando a la función dfwiki_installed_upgrade($oldversion).
    • Si no tenemos la dfwiki intalamos una nueva dfwiki actualizada mediante la instrucción modify_database($CFG->dirroot.'/mod/wiki/wikimigrate/dfwiki_'. $CFG->dbtype .'.sql')
  2. De esta manera, conseguimos que antes de convertir la ewikis a dfwiki, la estructura de las tablas dfwiki sean la misma tanto con dfwiki temporal o si ya estaba instalada. Concretamente la versión de dfwiki 2006052502.
  3. Pasamos las páginas ewikis a dfwiki.
  4. Borramos las tablas wiki, wiki_entries y wiki_pages del esquema wiki
  5. Migramos la dfwiki a newwiki.
    • Renombramos las tablas dfwiki como wiki
    • Si se utiliza una dfwiki instalada, creamos nuevamente las tablas dfwiki para evitar que se instale nuevamente la dfwiki debido a que la carpeta mod/dfwiki continúa existiendo.
  6. Actualizamos la newwiki, partiendo de una misma estructura de bd tanto si existía la dfwiki como si no y tratando los casos que son diferentes en la actualización de la newwiki como proceso de la migración de la newwiki si ésta ya estaba previamente instalada (actualización en lugar de migración).
Resultado
  • Con este planteo conseguimos migrar cualquier versión antigua de la ewiki o de la ewiki+dfwiki simpre sobre moodle1.6, o de moodle.1.5 actualizado a moodle 1.6.
  • Cualquier actualización posterior de la newwiki se podrá distribuir de manera habitual.
  • Cualquier actualización de la dfwiki posterior tendrá una versión mayor que la que controlamos, aspecto que deberemos contemplar ya que el usuario puede querer migrar de ewiki a newwiki más adelante con la nueva versión de la dfwiki. ( O en moodle 1.8 si la newwiki es la oficial).
    • En este caso, siempre que salga una versión de dfwiki nueva, se deberá sacar una versión de newwiki que permita migrar dicha dfwiki a newwiki. Para esto, la versión de newiki deberá:
      • Contener el archivo migratelib/mysql.sql y migratelib/postgres.sql (Para la instalación de una dfwiki temporal actualizada)
      • Contener el código para actualizar cualquier dfwiki anterior a la última versión de dfwiki dentro de dfwiki_installed_upgrade ($oldversión) en el archivo migratlib.php.
      • Controlar en los bloques if($oldversio...) cualquier modificación sobre la estructura de la bd, que se haya aplicado con anterioridad en la dfwiki. Esto solo en el caso de que se modifique la estructura de la bd en la última dfwiki.
      • Modificar la condición para que no permita migrar si existe una versión de dfwiki mayor.

Pruebas:

A continuación se comentan los entronos en que se han realizado las pruebas para garantizar que el proceso de migración se realiza correctamente:

  1. Migración de ewikis a newwiki en Moodle 1.5/1.6
  2. Migración de ewikis+dfwiki a newwiki en Moodle 1.5/1.6
  3. Migración de ewikis a newwiki en Moodle 1.6
  4. Migración de ewikis+dfwiki a newwiki en Moodle 1.6
Observaciones:

  • DFWIKI RESIDUAL:
    • En el caso que la dfwiki ya estuviera instalada, mantenemos la versión de la dfwiki que había antes de actualizar. Esto ha de ser así, ya que si cambiamos la versión de la tabla de módulos por la nueva versión, el archivo dfwiki/version.php sigue haciendo referencia a la versión de la dfwiki anterior, con lo que Moodle ejecutaría el proceso de actualización y daría error ya que no puede hacer un downgrade del módulo.
    • Como se comentó arriba, si el usuario tenía la dfwiki instalada, luego de renombrar las tablas dfwiki a wiki, se vuelven a crear las tablas dfwiki para evitar que se instale la dfwiki.
    • Lo que debe hacer el usuario, una vez a migrado a newwiki, es que si tiene la dfwiki instalada, ha de desinstalarla (módulo y bloques) utilizando el menú de admin de moodle, y luego borrar las carpetas dfwiki de modulo, y si lo tuviera, las carpetas de bloques también.
  • Campo studentmode:
    • Si este campo vale 1, entonces ownerid debe tener el mismo valor que userid, o la newwiki no funciona.
    • En el caso de las ewikis, studentmode ha de ser siempre 0, por lo que ownerid también debe valer 0.
    • En el caso de las dfwiki, a partir de la versión en que se introduce este campo, hay que ver el valor de dicho campo, y si vale 1, hay que hacer ownerid=userid.

jueves, noviembre 09, 2006

Analisis de versiones ewiki 1.6

Luego de los problemas que han tenido algunos usuarios al intentar instalar la wiki_candidate, debido a un fallo en el proceso de migración de la ewiki a la newwiki, hemos realizado el siguiente análisis de las diferentes versiones de la ewiki sobre moodle 1.6 para garantizar que dicho proceso se realice correctamente.

Con motivo de utilizar una versión que sirva de eje comparativo, he tomado la version Moodle_1.61 cuyas versiones de archivos de definición de la estructura de la base de datos son los siguientes: Version.php 1.17.2.1: 2006042801 (Mysql.php 1.9/Mysql.sql 1.8)

A continuación se describen las diferentes versiones de la ewiki sobre la distribución de Moodle 1.6.

Todos los datos se han recopilado del sourceforge.


Moodle_1.6_AUTHREFACTOR_PRE

Moodle_1.6_AUTHREFACTOR

Moodle_1.6_MULTIENROL_MP1

Moodle_1.6_MULTIENROL_PRE

Moodle_1.6_UTF8_PRE

Moodle_UTF81.6_MULTIENROL

Todas estas versiones, utilizan los archivos:

Version.php 1.14 2005031000 (Mysql.php v_1.7/Mysql.sql v_1.6)

Descripción del archivo Mysql.sql v_1.6

CREATE TABLE `prefix_wiki` (

`id` int(10) unsigned NOT NULL auto_increment,

`course` int(10) unsigned NOT NULL default '0',

`name` varchar(255) NOT NULL default '',

`summary` text NOT NULL,

`pagename` varchar(255) default NULL,

`wtype` enum('teacher','group','student') NOT NULL default 'group',

`ewikiprinttitle` tinyint(4) NOT NULL default '1',

`htmlmode` tinyint(4) NOT NULL default '0',

`ewikiacceptbinary` tinyint(4) NOT NULL default '0',

`disablecamelcase` tinyint(4) NOT NULL default '0',

`setpageflags` tinyint(4) NOT NULL default '1',

`strippages` tinyint(4) NOT NULL default '1',

`removepages` tinyint(4) NOT NULL default '1',

`revertchanges` tinyint(4) NOT NULL default '1',

`initialcontent` varchar(255) default NULL,

`timemodified` int(10) NOT NULL default '0',

PRIMARY KEY (`id`),

KEY `course` (`course`)

) TYPE=MyISAM COMMENT='Main wiki table';

CREATE TABLE `prefix_wiki_entries` (

`id` int(10) NOT NULL auto_increment,

`wikiid` int(10) NOT NULL default '0',

`course` int(10) NOT NULL default '0',

`groupid` int(10) NOT NULL default '0',

`userid` int(10) NOT NULL default '0',

`pagename` varchar(255) NOT NULL default '',

`timemodified` int(10) NOT NULL default '0',

PRIMARY KEY (`id`),

KEY `wikiid` (`wikiid`),

KEY `course` (`course`),

KEY `gropuid` (`groupid`),

KEY `userid` (`userid`),

KEY `pagename` (`pagename`)

) TYPE=MyISAM COMMENT='Holds entries for each wiki start instance.';

CREATE TABLE `prefix_wiki_pages` (

`id` int(10) unsigned NOT NULL auto_increment,

`pagename` VARCHAR(160) NOT NULL,

`version` INTEGER UNSIGNED NOT NULL DEFAULT 0,

`flags` INTEGER UNSIGNED DEFAULT 0,

`content` MEDIUMTEXT,

`author` VARCHAR(100) DEFAULT 'ewiki',

`userid` INTEGER UNSIGNED NOT NULL DEFAULT 0,

`created` INTEGER UNSIGNED DEFAULT 0,

`lastmodified` INTEGER UNSIGNED DEFAULT 0,

`refs` MEDIUMTEXT,

`meta` MEDIUMTEXT,

`hits` INTEGER UNSIGNED DEFAULT 0,

`wiki` int(10) unsigned NOT NULL,

PRIMARY KEY `id` (`id`),

UNIQUE KEY `wiki_pages_uk` (`pagename`, `version`, `wiki`)

) TYPE=MyISAM COMMENT='Holds the Wiki-Pages';



Moodle_1.6_BETA

Utiliza las siguientes versiones de archivos:

Version.php 1.17 2006042800 (Mysql.php 1.8/Mysql.sql 1.9)

Descripción del archivo Mysql.sql v_1.8

CREATE TABLE `prefix_wiki` (

`id` int(10) unsigned NOT NULL auto_increment,

`course` int(10) unsigned NOT NULL default '0',

`name` varchar(255) NOT NULL default '',

`summary` text NOT NULL default '',

`pagename` varchar(255) NOT NULL default '',

`wtype` enum('teacher','group','student') NOT NULL default 'group',

`ewikiprinttitle` tinyint(4) NOT NULL default '1',

`htmlmode` tinyint(4) NOT NULL default '0',

`ewikiacceptbinary` tinyint(4) NOT NULL default '0',

`disablecamelcase` tinyint(4) NOT NULL default '0',

`setpageflags` tinyint(4) NOT NULL default '1',

`strippages` tinyint(4) NOT NULL default '1',

`removepages` tinyint(4) NOT NULL default '1',

`revertchanges` tinyint(4) NOT NULL default '1',

`initialcontent` varchar(255) NOT NULL default '',

`timemodified` int(10) NOT NULL default '0',

PRIMARY KEY (`id`),

KEY `course` (`course`)

) TYPE=MyISAM COMMENT='Main wiki table';

CREATE TABLE `prefix_wiki_entries` (

`id` int(10) NOT NULL auto_increment,

`wikiid` int(10) NOT NULL default '0',

`course` int(10) NOT NULL default '0',

`groupid` int(10) NOT NULL default '0',

`userid` int(10) NOT NULL default '0',

`pagename` varchar(255) NOT NULL default '',

`timemodified` int(10) NOT NULL default '0',

PRIMARY KEY (`id`),

KEY `wikiid` (`wikiid`),

KEY `course` (`course`),

KEY `gropuid` (`groupid`),

KEY `userid` (`userid`),

KEY `pagename` (`pagename`)

) TYPE=MyISAM COMMENT='Holds entries for each wiki start instance.';

CREATE TABLE `prefix_wiki_pages` (

`id` int(10) unsigned NOT NULL auto_increment,

`pagename` VARCHAR(160) NOT NULL,

`version` INTEGER UNSIGNED NOT NULL DEFAULT 0,

`flags` INTEGER UNSIGNED DEFAULT 0,

`content` MEDIUMTEXT default '',

`author` VARCHAR(100) DEFAULT 'ewiki',

`userid` INTEGER UNSIGNED NOT NULL DEFAULT 0,

`created` INTEGER UNSIGNED DEFAULT 0,

`lastmodified` INTEGER UNSIGNED DEFAULT 0,

`refs` MEDIUMTEXT default '',

`meta` MEDIUMTEXT default '',

`hits` INTEGER UNSIGNED DEFAULT 0,

`wiki` int(10) unsigned NOT NULL default 0,

PRIMARY KEY `id` (`id`),

UNIQUE KEY `wiki_pages_uk` (`pagename`, `version`, `wiki`)

) TYPE=MyISAM COMMENT='Holds the Wiki-Pages';



Moodel_1.6/Moodle_1.61

Ambas distribuciones de Moodle utiliza las siguientes versiones de archivos:

Version.php 1.17.2.1: 2006042801 (Mysql.php 1.9/Mysql.sql 1.8)

Las versiones de Mysql.php y Mysql.sql son las mismas que la versión 1.6_BETA.

Luego de analizar el archivo Mysql.php se observa que no se realiza ningún cambio en la estructura de la Base de Datos respecto a la versión 1.6_BETA.


Moodle_1.62

Moodle_1.63

Moodle_MERGED

Moodle_STABLE

Todas estas distribuciones de Moodle utiliza las siguientes versiones de archivos:

Version.php 1.17.2.2 2006080701 (Mysql.php 1.9/Mysql.sql 1.8)

Las versiones de Mysql.php y Mysql.sql son las mismas que la versión Moodle_1.6_BETA.

Luego de analizar el archivo Mysql.php se observa que no se realiza ningún cambio en la estructura de la Base de Datos respecto a la versión Moodle_1.6_BETA.



Moodle 1.6_HEAD

Utiliza las siguientes versiones de archivos:

Version.php 1.27 2006092602 (Mysql.php 1.12/Mysql.sql 1.8)

Descripción del archivo Mysql.php v_1.12 (Se muestran solo los cambios respecto al archivo Mysql.php v_1.9)

if ($oldversion <>

modify_database("","

CREATE TABLE prefix_wiki_locks(

id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,

wikiid INT(10) UNSIGNED NOT NULL,

pagename VARCHAR(160) NOT NULL DEFAULT '',

lockedby INT(10) NOT NULL DEFAULT 0,

lockedsince INT(10) NOT NULL DEFAULT 0,

lockedseen INT(10) NOT NULL DEFAULT 0,

PRIMARY KEY(id),

UNIQUE INDEX wiki_locks_uk(wikiid,pagename),

INDEX wiki_locks_ix(lockedseen)

);");

}

Esta versión (Moodle_HEAD), es la única que modifica la estructura de la base de datos.
Todas las demás versiones de la ewiki en Moodle 1.6, si bien se observa algunos cambios de versión del módulo, se puede afirmar que mantienen la misma estructura de la base de datos que la versión Moodle_1.6.1, que he utilizado para efectuar las pruebas de migración.

Sin embargo esta tabla nueva que se genera debería estar definida a su vez en el archivo Mysql.php, ya que de al no ser así, esta tabla solamente se crea en la base de datos en el caso de estar migrando desde las versiones de módulos ewiki anteriores a la versión 2006092502, mientras que si se realiza una instalación desde cero de la ewiki con la version Moodle_HEAD, dicha tabla no se instalará. El por qué de este comportamiento particular de esta tabla debeerá analizarse con mayor detalle.