ext-db.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:7k
源码类别:

中间件编程

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.0.0  * Copyright(c) 2006-2009 Ext JS, LLC  * licensing@extjs.com  * http://www.extjs.com/license  */
  2. // Asbtract base class for SqlDB classes
  3. Ext.data.SqlDB = function(config){
  4. Ext.apply(this, config);
  5. Ext.data.SqlDB.superclass.constructor.call(this);
  6. this.addEvents({
  7. open : true,
  8. close: true
  9. });
  10. };
  11. Ext.extend(Ext.data.SqlDB, Ext.util.Observable, {
  12. maxResults: 10000,
  13. openState : false,
  14.     // abstract methods
  15.     open : function(file, cb, scope){
  16. },
  17. close : function(){
  18. },
  19.     exec : function(sql, cb, scope){
  20. },
  21. execBy : function(sql, args, cb, scope){
  22. },
  23. query : function(sql, cb, scope){
  24. },
  25. queryBy : function(sql, args, cb, scope){
  26. },
  27.     // protected/inherited method
  28.     isOpen : function(){
  29. return this.openState;
  30. },
  31. getTable : function(name, keyName){
  32. return new Ext.data.SqlDB.Table(this, name, keyName);
  33. },
  34. createTable : function(o){
  35. var tableName = o.name;
  36. var keyName = o.key;
  37. var fs = o.fields;
  38. var cb = o.callback;
  39. var scope = o.scope;
  40. if(!(fs instanceof Array)){ // Ext fields collection
  41. fs = fs.items;
  42. }
  43. var buf = [];
  44. for(var i = 0, len = fs.length; i < len; i++){
  45. var f = fs[i], s = f.name;
  46. switch(f.type){
  47.             case "int":
  48.             case "bool":
  49.             case "boolean":
  50.                 s += ' INTEGER';
  51.                 break;
  52.             case "float":
  53.                 s += ' REAL';
  54.                 break;
  55.             default:
  56.              s += ' TEXT';
  57.         }
  58.         if(f.allowNull === false || f.name == keyName){
  59.          s += ' NOT NULL';
  60.         }
  61.         if(f.name == keyName){
  62.          s += ' PRIMARY KEY';
  63.         }
  64.         if(f.unique === true){
  65.          s += ' UNIQUE';
  66.         }
  67.         buf[buf.length] = s;
  68.     }
  69.     var sql = ['CREATE TABLE IF NOT EXISTS ', tableName, ' (', buf.join(','), ')'].join('');
  70.         this.exec(sql, cb, scope);
  71. }
  72. });
  73. Ext.data.SqlDB.getInstance = function(db, config){
  74.     if(window.htmlControl){ // air
  75.         return new Ext.data.AirDB(config);
  76.     } else { // gears
  77.         return new Ext.data.GearsDB(config);
  78.     }
  79. };
  80. Ext.data.SqlDB.Table = function(conn, name, keyName){
  81. this.conn = conn;
  82. this.name = name;
  83. this.keyName = keyName;
  84. };
  85. Ext.data.SqlDB.Table.prototype = {
  86. update : function(o, cb, scope){
  87. var clause = this.keyName + " = :" + this.keyName;
  88. this.updateBy(o, clause, {}, cb, scope);
  89. },
  90. updateBy : function(o, clause, args, cb, scope){
  91. var sql = "UPDATE " + this.name + " set ";
  92. var fs = [], a = [];
  93. for(var key in o){
  94. if(o.hasOwnProperty(key)){
  95. fs[fs.length] = key + ' = ?';
  96. a[a.length] = o[key];
  97. }
  98. }
  99. for(var key in args){
  100. if(args.hasOwnProperty(key)){
  101. a[a.length] = args[key];
  102. }
  103. }
  104. sql = [sql, fs.join(','), ' WHERE ', clause].join('');
  105. this.conn.execBy(sql, a, cb, scope);
  106. },
  107. insert : function(o, cb, scope){
  108. var sql = "INSERT into " + this.name + " ";
  109. var fs = [], vs = [], a = [];
  110. for(var key in o){
  111. if(o.hasOwnProperty(key)){
  112. fs[fs.length] = key;
  113. vs[vs.length] = '?';
  114. a[a.length] = o[key];
  115. }
  116. }
  117. sql = [sql, '(', fs.join(','), ') VALUES (', vs.join(','), ')'].join('');
  118.         this.conn.execBy(sql, a, cb, scope);
  119.     },
  120. select : function(clause, cb, scope){
  121. this.selectBy(clause, null, cb, scope);
  122. },
  123. selectBy : function(clause, args, cb, scope){
  124. var sql = "select * from " + this.name;
  125. if(clause){
  126. sql += ' ' + clause;
  127. }
  128. args = args || {};
  129. this.conn.queryBy(sql, args, cb, scope);
  130. },
  131. remove : function(clause, cb, scope){
  132. this.deleteBy(clause, null, cb, scope);
  133. },
  134. removeBy : function(clause, args, cb, scope){
  135. var sql = "delete from " + this.name;
  136. if(clause){
  137. sql += ' where ' + clause;
  138. }
  139. args = args || {};
  140. this.conn.execBy(sql, args, cb, scope);
  141. }
  142. };
  143. Ext.data.SqlDB.Proxy = function(conn, table, keyName, store){
  144.     Ext.data.SqlDB.Proxy.superclass.constructor.call(this);
  145.     this.conn = conn;
  146.     this.table = this.conn.getTable(table, keyName);
  147.     this.store = store;
  148.     this.store.on('add', this.onAdd, this);
  149.     this.store.on('update', this.onUpdate, this);
  150.     this.store.on('remove', this.onRemove, this);
  151. };
  152. Ext.extend(Ext.data.SqlDB.Proxy, Ext.data.DataProxy, {
  153.     load : function(params, reader, callback, scope, arg){
  154.      if(!this.conn.isOpen()){ // assume that the connection is in the process of opening
  155.      this.conn.on('open', function(){
  156.      this.load(params, reader, callback, scope, arg);
  157.      }, this, {single:true});
  158.      return;
  159.      };
  160.      if(this.fireEvent("beforeload", this, params, reader, callback, scope, arg) !== false){
  161. var clause = params.where || '';
  162. var args = params.args || [];
  163. var group = params.groupBy;
  164. var sort = params.sort;
  165. var dir = params.dir;
  166. if(group || sort){
  167. clause += ' ORDER BY ';
  168. if(group && group != sort){
  169. clause += group + ' ASC, ';
  170. }
  171. clause += sort + ' ' + (dir || 'ASC');
  172. }
  173. this.table.selectBy(clause, args,
  174. this.onLoad.createDelegate(this, [{callback:callback, scope:scope, arg:arg, reader: reader}], 0));
  175.         }else{
  176.             callback.call(scope||this, null, arg, false);
  177.         }
  178.     },
  179.     onLoad : function(trans, rs, e, stmt){
  180.         if(rs === false){
  181.      this.fireEvent("loadexception", this, null, trans.arg, e);
  182.             trans.callback.call(trans.scope||window, null, trans.arg, false);
  183.             return;
  184.      }
  185.      var result = trans.reader.readRecords(rs);
  186.         this.fireEvent("load", this, rs, trans.arg);
  187.         trans.callback.call(trans.scope||window, result, trans.arg, true);
  188.     },
  189.     processData : function(o){
  190.      var fs = this.store.fields;
  191.      var r = {};
  192.      for(var key in o){
  193.      var f = fs.key(key), v = o[key];
  194. if(f){
  195. if(f.type == 'date'){
  196. r[key] = v ? v.format('Y-m-d H:i:s') : '';
  197. }else if(f.type == 'boolean'){
  198. r[key] = v ? 1 : 0;
  199. }else{
  200. r[key] = v;
  201. }
  202. }
  203. }
  204. return r;
  205.     },
  206.     onUpdate : function(ds, record){
  207.      var changes = record.getChanges();
  208.      var kn = this.table.keyName;
  209.      this.table.updateBy(this.processData(changes), kn + ' = ?', [record.data[kn]]);
  210.      record.commit(true);
  211.     },
  212.     onAdd : function(ds, records, index){
  213.      for(var i = 0, len = records.length; i < len; i++){
  214.          this.table.insert(this.processData(records[i].data));
  215.      }
  216.     },
  217.     onRemove : function(ds, record, index){
  218.         var kn = this.table.keyName;
  219.      this.table.removeBy(kn + ' = ?', [record.data[kn]]);
  220.     }
  221. });