Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2017
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package as3.mongo.wire
  2. {
  3.     import as3.mongo.db.DB;
  4.     import as3.mongo.db.document.Document;
  5.     import as3.mongo.error.MongoError;
  6.     import as3.mongo.wire.cursor.Cursor;
  7.     import as3.mongo.wire.cursor.GetMoreMessage;
  8.     import as3.mongo.wire.messages.MessageFactory;
  9.     import as3.mongo.wire.messages.client.FindOptions;
  10.     import as3.mongo.wire.messages.client.OpDelete;
  11.     import as3.mongo.wire.messages.client.OpGetMore;
  12.     import as3.mongo.wire.messages.client.OpInsert;
  13.     import as3.mongo.wire.messages.client.OpQuery;
  14.     import as3.mongo.wire.messages.client.OpUpdate;
  15.     import as3.mongo.wire.messages.database.FindOneOpReplyLoader;
  16.     import as3.mongo.wire.messages.database.OpReplyLoader;
  17.  
  18.     import flash.net.Socket;
  19.  
  20.     import org.osflash.signals.Signal;
  21.     import org.serialization.bson.Int64;
  22.  
  23.     public class Wire
  24.     {
  25.         protected var _socket:Socket;
  26.         protected var _messageFactory:MessageFactory;
  27.  
  28.         protected var _db:DB;
  29.         protected var _isConnected:Boolean;
  30.         protected var _messenger:Messenger;
  31.         protected var _connector:Connector;
  32.         protected var _cursorFactory:CursorFactory;
  33.         protected var _activeCursors:Array;
  34.  
  35.         public function get connector():Connector
  36.         {
  37.             return _connector;
  38.         }
  39.  
  40.         public function get messenger():Messenger
  41.         {
  42.             return _messenger;
  43.         }
  44.  
  45.         public function get db():DB
  46.         {
  47.             return _db;
  48.         }
  49.  
  50.         public function get messageFactory():MessageFactory
  51.         {
  52.             return _messageFactory;
  53.         }
  54.  
  55.         public function get socket():Socket
  56.         {
  57.             return _socket;
  58.         }
  59.  
  60.         public function get isConnected():Boolean
  61.         {
  62.             return _isConnected;
  63.         }
  64.  
  65.         public function Wire(db:DB)
  66.         {
  67.             _initializeWire(db);
  68.         }
  69.  
  70.         private function _initializeWire(db:DB):void
  71.         {
  72.             _db = db;
  73.             _socket = new Socket();
  74.             _messenger = new Messenger(this);
  75.             _connector = new Connector(this);
  76.             _messageFactory = new MessageFactory();
  77.             _cursorFactory = new CursorFactory();
  78.             _activeCursors = new Array();
  79.         }
  80.  
  81.         public function connect():void
  82.         {
  83.             _connector.connect();
  84.         }
  85.  
  86.         internal function setConnected(value:Boolean):void
  87.         {
  88.             _isConnected = value;
  89.         }
  90.  
  91.         public function runCommand(command:Document):Signal
  92.         {
  93.             _checkIfSocketIsConnected();
  94.             const opQuery:OpQuery             = messageFactory.makeRunCommandOpQueryMessage(_db.name, "$cmd", command);
  95.             const opReplyLoader:OpReplyLoader = new OpReplyLoader(socket);
  96.             _messenger.sendMessage(opQuery);
  97.  
  98.             _activeOpReplyLoaders.push(opReplyLoader);
  99.             opReplyLoader.LOADED.addOnce(_onOpReplyLoaded);
  100.             return opReplyLoader.LOADED;
  101.         }
  102.  
  103.         private var _activeOpReplyLoaders:Vector.<OpReplyLoader> = new Vector.<OpReplyLoader>();
  104.  
  105.         public function findOne(collectionName:String, query:Document, returnFields:Document=null):Signal
  106.         {
  107.             _checkIfSocketIsConnected();
  108.             const opQuery:OpQuery                           = messageFactory.makeFindOneOpQueryMessage(_db.name, collectionName, query, returnFields);
  109.             const findOneOpReplyLoader:FindOneOpReplyLoader = new FindOneOpReplyLoader(socket);
  110.             _messenger.sendMessage(opQuery);
  111.  
  112.             _activeOpReplyLoaders.push(findOneOpReplyLoader);
  113.             findOneOpReplyLoader.LOADED.addOnce(_onOpReplyLoaded);
  114.             return findOneOpReplyLoader.LOADED;
  115.         }
  116.  
  117.         private function _onOpReplyLoaded(document:Object):void
  118.         {
  119.             const loadedLoaders:Vector.<OpReplyLoader> = new Vector.<OpReplyLoader>();
  120.             var loader:OpReplyLoader
  121.             for each (loader in _activeOpReplyLoaders)
  122.             {
  123.                 if (loader.isLoaded)
  124.                     loadedLoaders.push(loader);
  125.             }
  126.  
  127.             for each (loader in loadedLoaders)
  128.             {
  129.                 if (_activeOpReplyLoaders.lastIndexOf(loader) != -1)
  130.                     _activeOpReplyLoaders.splice(_activeOpReplyLoaders.lastIndexOf(loader), 1);
  131.             }
  132.         }
  133.  
  134.         private function _checkIfSocketIsConnected():void
  135.         {
  136.             if (false === socket.connected)
  137.                 throw new MongoError(MongoError.SOCKET_NOT_CONNECTED);
  138.         }
  139.  
  140.         // TODO: Write integration tests for this
  141.         public function insert(dbName:String, collectionName:String, document:Document):void
  142.         {
  143.             _checkIfSocketIsConnected();
  144.             const opInsert:OpInsert = messageFactory.makeSaveOpInsertMessage(dbName, collectionName, document);
  145.             _messenger.sendMessage(opInsert);
  146.         }
  147.  
  148.         // TODO: Write integration tests for this
  149.         public function remove(dbName:String, collectionName:String, selector:Document):void
  150.         {
  151.             _checkIfSocketIsConnected();
  152.             const opDelete:OpDelete = messageFactory.makeRemoveOpDeleteMessage(dbName, collectionName, selector);
  153.             _messenger.sendMessage(opDelete);
  154.         }
  155.  
  156.         // TODO: Write integration tests for this
  157.         public function updateFirst(dbName:String, collectionName:String, selector:Document, document:Document):void
  158.         {
  159.             _checkIfSocketIsConnected();
  160.             const opUpdate:OpUpdate = messageFactory.makeUpdateFirstOpUpdateMessage(dbName, collectionName, selector, document);
  161.             _messenger.sendMessage(opUpdate);
  162.         }
  163.  
  164.         // TODO: Write integration tests for this
  165.         public function update(dbName:String, collectionName:String, selector:Document, modifier:Document):void
  166.         {
  167.             _checkIfSocketIsConnected();
  168.             const opUpdate:OpUpdate = messageFactory.makeUpdateOpUpdateMessage(dbName, collectionName, selector, modifier);
  169.             _messenger.sendMessage(opUpdate);
  170.         }
  171.  
  172.         // TODO: Write integration tests for this
  173.         public function upsert(dbName:String, collectionName:String, selector:Document, document:Document):void
  174.         {
  175.             _checkIfSocketIsConnected();
  176.             const opUpdate:OpUpdate = messageFactory.makeUpsertOpUpdateMessage(dbName, collectionName, selector, document);
  177.             _messenger.sendMessage(opUpdate);
  178.         }
  179.  
  180.         public function find(dbName:String, collectionName:String, query:Document, options:FindOptions=null):Signal
  181.         {
  182.             _checkIfSocketIsConnected();
  183.             const opQuery:OpQuery               = messageFactory.makeFindOpQueryMessage(dbName, collectionName, query, options);
  184.             const opReplyLoader:OpReplyLoader   = new OpReplyLoader(socket);
  185.  
  186.             const getMoreMessage:GetMoreMessage = new GetMoreMessage(dbName, collectionName, options, this);
  187.             const cursor:Cursor                 = _cursorFactory.getCursor(opReplyLoader, getMoreMessage);
  188.             _activeCursors.push(cursor);
  189.             cursor.cursorReady.addOnce(_onCursorReady);
  190.  
  191.             _messenger.sendMessage(opQuery);
  192.             return cursor.cursorReady;
  193.         }
  194.  
  195.         private function _onCursorReady(cursor:Cursor):void
  196.         {
  197.             if (-1 < _activeCursors.lastIndexOf(cursor))
  198.             {
  199.                 _activeCursors.splice(_activeCursors.lastIndexOf(cursor), 1);
  200.             }
  201.         }
  202.  
  203.         public function getMore(dbName:String, collectionName:String, options:FindOptions, cursorID:Int64):Signal
  204.         {
  205.             _checkIfSocketIsConnected();
  206.  
  207.             const opGetMore:OpGetMore           = messageFactory.makeGetMoreOpGetMoreMessage(dbName, collectionName, options.numberToReturn, cursorID);
  208.             const opReplyLoader:OpReplyLoader   = new OpReplyLoader(socket);
  209.  
  210.             const getMoreMessage:GetMoreMessage = new GetMoreMessage(dbName, collectionName, options, this);
  211.             const cursor:Cursor                 = _cursorFactory.getCursor(opReplyLoader, getMoreMessage);
  212.             _activeCursors.push(cursor);
  213.             cursor.cursorReady.addOnce(_onCursorReady);
  214.  
  215.             _messenger.sendMessage(opGetMore);
  216.             return cursor.cursorReady;
  217.         }
  218.     }
  219. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement