| 78 | This seems to fall naturally into three pieces: |
| 79 | * Track schema changes revision by revision. |
| 80 | * Compare schemas (e.g. those in Web2py *.table files) and report the differences. |
| 81 | * Attempt to infer what happened (e.g. detect table name changes by matching columns in tables |
| 82 | that were in the old schema but not the new to tables that appeared in the new schema). |
| 83 | * Set this up to produce reports revision-by-revision (e.g. have the continuous integration build, |
| 84 | which is triggered by commits to the Eden trunk, run a script). |
| 85 | * Provide a UI that allows whoever made the schema change to tell how to convert the database. |
| 86 | For instance, this could include allowing them to: |
| 87 | * Match up renamed tables and columns. |
| 88 | * Describe how to set a value for new unique columns in existing records. |
| 89 | * Provide a template for subdividing records when tables are refactored (in straightforward cases). |
| 90 | * Provide a script to do more complex conversions. |
| 91 | * This subproject would only record the requested conversions, not apply them. |
| 92 | * Design a process to convert a database at one revision into the form needed by a later revision. |
| 93 | * Write a script that converts from revision N to N+1 given the conversion info from the above |
| 94 | subprojects. |
| 95 | * Write a script that backs up the database, gets the starting and ending revisions, and iterates |
| 96 | over the conversions. |
| 97 | * As an alternative, it might be possible to take the revision by revision conversions and |
| 98 | generate an end-to-end conversion, then apply the end-to-end conversion to the database. |
| 99 | This is likely not worth the effort -- its purpose would be speeding up the conversion, but |
| 100 | it adds risk and is difficult. So long as the site upgrades fairly regularly, speed should |
| 101 | not be an issue. |
| 102 | The first subproject is the most staightforward, and might not require the entire summer. |
| 103 | If so, one could get a start on the second subproject. It is possible to make these somewhat |
| 104 | independent by specifying what the output of the second subproject will be, so the third could |
| 105 | use that before the second was done. |
| 106 | |