Changeset 354 for GearsORM/trunk

Show
Ignore:
Timestamp:
10/08/07 15:21:05 (15 months ago)
Author:
uriel
Message:

basic syncUp and syncDown functions,need more work and testing

Location:
GearsORM/trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • GearsORM/trunk/GearsORM.Sync.js

    r340 r354  
    11GearsORM.Sync =  
    22{ 
     3        ACTIONS: 
     4        { 
     5                INSERT:0, 
     6                UPDATE:1, 
     7                DELETE:2 
     8        }, 
    39        Log:new GearsORM.Model({ 
    410                name:"GearsORM_Log", 
     
    612                { 
    713                        modelName:new GearsORM.Fields.String({maxLength:"128",notNull:true}), 
    8                         saved:new GearsORM.Fields.Integer(), 
    9                         id:new GearsORM.Fields.Integer() 
     14                        action:new GearsORM.Fields.Integer({notNull:true}), 
     15                        id:new GearsORM.Fields.Integer({notNull:true}) 
    1016                } 
    1117        }), 
     
    1420                GearsORM.Sync.Log.createTable(); 
    1521                for(var modelName in GearsORM._models) 
    16                         if(modelName != "GearsORM_Log" && modelName != "sqlite_master")//skip Log and sqlite_master tables 
    17                                 GearsORM._models[modelName].addListener("onAfterSave",function(instance) 
    18                                 { 
    19                                         GearsORM.Sync._onChange(instance,1); 
    20                                 }) 
    21                                 .addListener("onBeforeRemove",function(instance)//this is not the best need to be sure that it was removed 
    22                                 { 
    23                                         GearsORM.Sync._onChange(instance,0);             
    24                                 }); 
     22                        { 
     23                                var model = GearsORM._models[modelName];  
     24                                if(model.options.log && !model.options._logSetupDone)//log only tables with log option set to true 
     25                                        model.addListener("onAfterSave",function(instance) 
     26                                        { 
     27                                                GearsORM.Sync._onChange(instance, 
     28                                                        GearsORM.getDB().lastInsertRowId == instance.rowid ?  
     29                                                                GearsORM.Sync.ACTIONS.INSERT : GearsORM.Sync.ACTIONS.UPDATE ); 
     30                                        }) 
     31                                        .addListener("onBeforeRemove",function(instance)//this is not the best need to be sure that it was removed 
     32                                        { 
     33                                                GearsORM.Sync._onChange(instance,GearsORM.Sync.ACTIONS.DELETE);          
     34                                        }).options._logSetupDone = true; 
     35                        } 
    2536        }, 
    26         _onChange:function(instance,saved) 
     37        _onChange:function(instance,action) 
    2738        { 
    2839                var modelName = instance.modelClass.options.name,id = instance.rowid; 
    2940                new GearsORM.Sync.Log({ 
    3041                        modelName:modelName, 
    31                         saved:saved, 
     42                        action:action, 
    3243                        id:id 
    3344                }).save(); 
    34                 if(!saved)//remove log about save when object is deleted 
    35                         GearsORM.Sync.Log.remove("modelName = ? AND id = ? AND saved = ?",[modelName,id,1]); 
     45                if(action == GearsORM.Sync.ACTIONS.DELETE)//remove log when object is deleted 
     46                        GearsORM.Sync.Log.remove("modelName = ? AND id = ? AND action <> ?",[modelName,id,GearsORM.Sync.ACTIONS.DELETE]); 
     47        }, 
     48        syncUp:function() 
     49        { 
     50                var objectIDS = {},objects={},deletedObjects={}; 
     51                GearsORM.Sync.Log.select().each(function(log) 
     52                { 
     53                        if(log.action == GearsORM.Sync.ACTIONS.DELETE) 
     54                        { 
     55                                if(!deletedObjects[log.modelName]) deletedObjects[log.modelName] = [log.id]; 
     56                                else deletedObjects[log.modelName].push(log.id); 
     57                        } 
     58                        else 
     59                        { 
     60                                if(!objectIDS[log.modelName]) objectIDS[log.modelName] = [log.id]; 
     61                                else objectIDS[log.modelName].push(log.id); 
     62                        } 
     63                }); 
     64                GearsORM.Transaction(function() 
     65                { 
     66                        for(var modelName in objectIDS) 
     67                                //TODO:add a new method to return objects as raw objects 
     68                                objects[modelName] = GearsORM._models[modelName].select("rowid IN (" + objectIDS[modelName].join(",")+ ")").toArray(); 
     69                }); 
     70                objects.deletedObjects = deletedObjects; 
     71                return objects; 
     72        }, 
     73        syncDown:function(syncObject) 
     74        { 
     75                GearsORM.Transaction(function() 
     76                { 
     77                        var deletedObjects = syncObject.deletedObjects; 
     78                        delete syncObject.deletedObjects; 
     79                        //save new objects 
     80                        for(var modelName in syncObject) 
     81                        { 
     82                                var model = GearsORM._models[modelName],l=syncObject[modelName],ln=l.length; 
     83                                for(var i=0;ln>i;i++) 
     84                                { 
     85                                        new model(l[i]).save(); 
     86                                } 
     87                        } 
     88                        //delete old objects 
     89                        for(var modelName in deletedObjects) 
     90                                GearsORM._models[modelName].remove("rowid IN ("+deletedObjects[modelName].join(",")+")"); 
     91                        //clean up log 
     92                        GearsORM.Sync.Log.remove(); 
     93                }); 
    3694        } 
    3795}; 
  • GearsORM/trunk/tests/test_sync.html

    r340 r354  
    1919                                        firstName:new GearsORM.Fields.String({maxLength:25}), 
    2020                                        lastName:new GearsORM.Fields.String({maxLength:25}) 
    21                                 } 
     21                                }, 
     22                                log:true 
    2223                        }); 
    2324                         
     
    3536                                        var person = new Person({firstName:"John",lastName:"Doe"}).save(); 
    3637                                        var id = person.rowid; 
    37                                         UnitTest.assertEqual(1,GearsORM.Sync.Log.count("modelName = ? AND id = ? AND saved = ?",["Person",id,1])); 
     38                                        UnitTest.assertEqual(1,GearsORM.Sync.Log.count("modelName = ? AND id = ? AND action = ?",["Person",id,GearsORM.Sync.ACTIONS.INSERT])); 
    3839                                        person.remove(); 
    39                                         UnitTest.assertEqual(1,GearsORM.Sync.Log.count("modelName = ? AND id = ? AND saved = ?",["Person",id,0])); 
     40                                        UnitTest.assertEqual(1,GearsORM.Sync.Log.count("modelName = ? AND id = ? AND action = ?",["Person",id,GearsORM.Sync.ACTIONS.DELETE])); 
    4041                                        //check that log about saving was deleted 
    41                                         UnitTest.assertEqual(0,GearsORM.Sync.Log.count("modelName = ? AND id = ? AND saved = ?",["Person",id,1])); 
     42                                        UnitTest.assertEqual(0,GearsORM.Sync.Log.count("modelName = ? AND id = ? AND action = ?",["Person",id,GearsORM.Sync.ACTIONS.INSERT])); 
    4243                                }, 
    4344                                down:function()