function getSchemaDiff()

in public/dexie.js [1910:1961]


    function getSchemaDiff(oldSchema, newSchema) {
      var diff = {
        del: [],
        add: [],
        change: [], // Array of {name: tableName, recreate: newDefinition, del: delIndexNames, add: newIndexDefs, change: changedIndexDefs}
      };
      for (var table in oldSchema) {
        if (!newSchema[table]) diff.del.push(table);
      }
      for (table in newSchema) {
        var oldDef = oldSchema[table],
          newDef = newSchema[table];
        if (!oldDef) {
          diff.add.push([table, newDef]);
        } else {
          var change = {
            name: table,
            def: newDef,
            recreate: false,
            del: [],
            add: [],
            change: [],
          };
          if (oldDef.primKey.src !== newDef.primKey.src) {
            // Primary key has changed. Remove and re-add table.
            change.recreate = true;
            diff.change.push(change);
          } else {
            // Same primary key. Just find out what differs:
            var oldIndexes = oldDef.idxByName;
            var newIndexes = newDef.idxByName;
            for (var idxName in oldIndexes) {
              if (!newIndexes[idxName]) change.del.push(idxName);
            }
            for (idxName in newIndexes) {
              var oldIdx = oldIndexes[idxName],
                newIdx = newIndexes[idxName];
              if (!oldIdx) change.add.push(newIdx);
              else if (oldIdx.src !== newIdx.src) change.change.push(newIdx);
            }
            if (
              change.del.length > 0 ||
              change.add.length > 0 ||
              change.change.length > 0
            ) {
              diff.change.push(change);
            }
          }
        }
      }
      return diff;
    }