Advertisement
cheungtifan

Untitled

May 3rd, 2012
395
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. if (typeof db == 'undefined') var db = {};
  2. db = {
  3.  
  4. cache: null,
  5.  
  6. MAX_TWEET_CACHE_SIZE: 4096,
  7.  
  8. MAX_USER_CACHE_SIZE: 1024,
  9.  
  10. version: 2,
  11.  
  12. init:
  13. function init (callback) {
  14.     db.database = mozIndexedDB.open('hotot.cache', 'Cache of Hotot');
  15.     db.get_version(function (version) {
  16.         var db_version = parseInt(version);
  17.         if (db_version != db.version) {
  18.             db.create_database(callback);
  19.         } else {
  20.             if (typeof (callback) != 'undefined') {
  21.                 callback();
  22.             }
  23.         }
  24.     });
  25. },
  26.  
  27. put: function(dataObj, onSuccess, onError) {
  28.     onError || ( onError = function(error) { console.log('Could not write data.', error); } );
  29.     var putTransaction = this.db.transaction([this.storeName], IDBTransaction.READ_WRITE, 1000);
  30. },
  31.  
  32. create_database:
  33. function create_database(callback) {
  34.     db.database.transaction(function (tx) {
  35.     var procs = [
  36.     function() {
  37.         tx.executeSql('DROP TABLE IF EXISTS "Info"', [],
  38.         function () {
  39.             $(window).dequeue('_database');
  40.         });
  41.     },
  42.     function () {
  43.         tx.executeSql('DROP TABLE IF EXISTS "TweetCache"', [],
  44.         function () {
  45.             $(window).dequeue('_database');
  46.         });
  47.     },
  48.     function () {
  49.             tx.executeSql('DROP TABLE IF EXISTS "UserCache"', [],
  50.             function () {
  51.                 $(window).dequeue('_database');
  52.             });
  53.     },
  54.     function () {
  55.             tx.executeSql('DROP TABLE IF EXISTS "Profile"', [],
  56.             function () {
  57.                 $(window).dequeue('_database');
  58.             });
  59.     },
  60.     function () {
  61.             tx.executeSql('CREATE TABLE IF NOT EXISTS "Info" ("key" CHAR(256) PRIMARY KEY  NOT NULL  UNIQUE , "value" TEXT NOT NULL )', [],
  62.             function () {
  63.                 $(window).dequeue('_database');
  64.             });    
  65.     },
  66.     function () {
  67.             tx.executeSql('CREATE TABLE IF NOT EXISTS "TweetCache" ("id" CHAR(256) PRIMARY KEY  NOT NULL  UNIQUE , "status" NCHAR(140) NOT NULL, "json" TEXT NOT NULL )', [],
  68.             function () {
  69.                 $(window).dequeue('_database');
  70.             });    
  71.     },
  72.     function () {
  73.             tx.executeSql('CREATE TABLE IF NOT EXISTS "UserCache" ("id" CHAR(256) PRIMARY KEY  NOT NULL  UNIQUE , "screen_name" CHAR(64) NOT NULL , "json" TEXT NOT NULL )', [],
  74.             function () {
  75.                 $(window).dequeue('_database');
  76.             });    
  77.     },
  78.     function () {
  79.             tx.executeSql('CREATE TABLE IF NOT EXISTS "Profile" ("name" CHAR(256) PRIMARY KEY  NOT NULL UNIQUE , "protocol" CHAR(64) NOT NULL , "preferences" TEXT NOT NULL, "order" INTEGER DEFAULT 0)', [],
  80.             function () {
  81.                 $(window).dequeue('_database');
  82.             });    
  83.     },
  84.     function () {
  85.         tx.executeSql('INSERT or REPLACE INTO Info VALUES("version", ?)', [db.version],
  86.         function () {
  87.             $(window).dequeue('_database');
  88.         });
  89.     },
  90.     function () {
  91.         tx.executeSql('INSERT or REPLACE INTO Info VALUES("settings", ?)', [JSON.stringify(conf.default_settings)],
  92.         function () {
  93.             $(window).dequeue('_database');
  94.         });
  95.     },
  96.     function () {
  97.         if (typeof (callback) != 'undefined') {
  98.             callback();
  99.         }    
  100.     }
  101.     ];
  102.  
  103.     $(window).queue('_database', procs);
  104.     $(window).dequeue('_database');
  105.     });
  106. },
  107.  
  108. dump_users:
  109. function dump_users(json_obj) {
  110.     var dump_single_user = function (tx, user) {
  111.         // update user obj
  112.         tx.executeSql('INSERT or REPLACE INTO UserCache VALUES (?, ?, ?)', [user.id_str, user.screen_name, JSON.stringify(user)],
  113.         function (tx, rs) {},
  114.         function (tx, error) {
  115.             hotot_log('DB', 'INSERT ERROR: '+ error.code + ','+ error.message);
  116.         });
  117.     };
  118.     // dump users
  119.     db.database.transaction(function (tx) {
  120.         for (var i = 0, l = json_obj.length; i < l; i += 1) {
  121.             var user = json_obj[i];
  122.             dump_single_user(tx, user);
  123.         }
  124.     });
  125. },
  126.  
  127. dump_tweets:
  128. function dump_tweets(json_obj) {
  129.     var dump_single_user = function (tx, user) {
  130.         tx.executeSql('INSERT or REPLACE INTO UserCache VALUES (?, ?, ?)', [user.id_str, user.screen_name, JSON.stringify(user)],
  131.         function (tx, rs) {
  132.         },
  133.         function (tx, error) {
  134.             hotot_log('DB', 'INSERT ERROR: '+ error.code + ','+ error.message);
  135.         });
  136.     };
  137.     var dump_single_tweet = function (tx, tweet_obj) {
  138.         tx.executeSql('INSERT or REPLACE INTO TweetCache VALUES (?, ?, ?)', [tweet_obj.id_str, tweet_obj.text, JSON.stringify(tweet_obj)],
  139.         function (tx, rs) {},
  140.         function (tx, error) {
  141.             hotot_log('DB', 'INSERT ERROR: '+ error.code + ','+ error.message);
  142.         });
  143.     };
  144.  
  145.     // dump tweets
  146.     db.database.transaction(function (tx) {
  147.         for (var i = 0, l = json_obj.length; i < l; i += 1) {
  148.             var tweet_obj = json_obj[i];
  149.             if (tweet_obj.hasOwnProperty('retweeted_status')) {
  150.                 dump_single_tweet(tx, tweet_obj['retweeted_status']);
  151.             }
  152.             dump_single_tweet(tx, tweet_obj);
  153.         }
  154.     });
  155.     // dump users
  156.     db.database.transaction(function (tx) {
  157.         for (var i = 0, l = json_obj.length; i < l; i += 1) {
  158.             var tweet_obj = json_obj[i];
  159.             var user = typeof tweet_obj.user != 'undefined'
  160.                 ? tweet_obj.user: tweet_obj.sender;
  161.             dump_single_user(tx, user);
  162.         }
  163.     });
  164. },
  165.  
  166. get_version:
  167. function get_version(callback) {
  168.     db.database.transaction(function (tx) {
  169.         tx.executeSql('SELECT * FROM sqlite_master WHERE type="table" and name="Info"',[],
  170.         function (tx, rs){
  171.             if (rs.rows.length == 0) {
  172.                 callback(-1);
  173.             } else {
  174.                 tx.executeSql('SELECT key, value FROM Info WHERE key="version"', [],
  175.                 function(tx, rs) {
  176.                     callback(rs.rows.item(0).value);
  177.                 },
  178.                 function (tx, err) {
  179.                     callback(-2);
  180.                 });
  181.             }
  182.         });
  183.     });
  184. },
  185.  
  186.  
  187. get_tweet:
  188. function get_tweet(key, callback) {
  189.     db.database.transaction(function (tx) {
  190.         tx.executeSql('SELECT id, status, json FROM TweetCache WHERE id=?', [key],
  191.             function(tx, rs) {callback(tx,rs);});
  192.     });
  193. },
  194.  
  195. get_user:
  196. function get_user(screen_name, callback) {
  197.     db.database.transaction(function (tx) {
  198.         tx.executeSql('SELECT id, screen_name, json FROM UserCache WHERE screen_name=?', [screen_name],
  199.         function (tx, rs) {
  200.             if (rs.rows.length != 0) {
  201.                 callback(JSON.parse(rs.rows.item(0).json));
  202.             } else {
  203.                 callback(null);
  204.             }
  205.         });
  206.     });
  207. },
  208.  
  209. search_user:
  210. function search_user(query, callback) {
  211.     db.database.transaction(function (tx) {
  212.         tx.executeSql('SELECT id, screen_name, json FROM UserCache WHERE screen_name LIKE \'%'+query+'%\'', [],
  213.             function(tx, rs) {callback(tx,rs);});
  214.     });
  215. },
  216.  
  217. get_screen_names_starts_with:
  218. function get_users_starts_with(starts, callback) {
  219.     db.database.transaction(function (tx) {
  220.         tx.executeSql('SELECT screen_name FROM UserCache WHERE screen_name LIKE \''+starts+'%\'', [],
  221.             function(tx, rs) {callback(tx,rs);});
  222.     });
  223. },
  224.  
  225. reduce_user_cache:
  226. function reduce_user_cache(limit, callback) {
  227.     db.database.transaction(function (tx) {
  228.         tx.executeSql('DELETE FROM UserCache WHERE id in (SELECT id FROM UserCache ORDER BY id limit ?)', [limit], callback);
  229.     });
  230. },
  231.  
  232. reduce_tweet_cache:
  233. function reduce_tweet_cache(limit, callback) {
  234.     db.database.transaction(function (tx) {
  235.         tx.executeSql('DELETE FROM TweetCache WHERE id in (SELECT id FROM TweetCache ORDER BY id limit ?)', [limit], callback);
  236.     });
  237. },
  238.  
  239. get_tweet_cache_size:
  240. function get_tweet_cache_size(callback) {
  241.     db.database.transaction(function (tx) {
  242.         tx.executeSql('SELECT count(*) FROM TweetCache', [],
  243.         function (tx, rs) {
  244.             callback(rs.rows.item(0)['count(*)']);
  245.         });
  246.     });
  247. },
  248.  
  249. get_user_cache_size:
  250. function get_user_cache_size(callback) {
  251.     db.database.transaction(function (tx) {
  252.         tx.executeSql('SELECT count(*) FROM UserCache', [],
  253.         function (tx, rs) {
  254.             callback(rs.rows.item(0)['count(*)']);
  255.         });
  256.     });
  257. },
  258.  
  259. reduce_db:
  260. function reduce_db () {
  261.     db.get_tweet_cache_size(function (size) {
  262.         if (db.MAX_TWEET_CACHE_SIZE < size) {
  263.             db.reduce_tweet_cache(
  264.                 parseInt(db.MAX_TWEET_CACHE_SIZE*2/3)
  265.             , function () {
  266.             })
  267.         }
  268.     });
  269.     db.get_user_cache_size(function (size) {
  270.         if (db.MAX_USER_CACHE_SIZE < size) {
  271.             db.reduce_user_cache(
  272.                 parseInt(db.MAX_USER_CACHE_SIZE*2/3)
  273.             , function () {
  274.             })
  275.         }
  276.     });
  277. },
  278.  
  279. save_option:
  280. function save_option(key, value, callback) {
  281.     db.database.transaction(function (tx) {
  282.         tx.executeSql('INSERT or REPLACE INTO Info VALUES(?, ?)', [key, value],
  283.         function (tx, rs) {
  284.             callback(true);
  285.         },
  286.         function (tx, error) {
  287.             callback(false);
  288.         });
  289.     });
  290. },
  291.  
  292. load_option:
  293. function load_option(key, callback) {
  294.     db.database.transaction(function (tx) {
  295.         tx.executeSql('SELECT key, value FROM Info WHERE key=?', [key],
  296.         function (tx, rs) {
  297.             callback(rs.rows.item(0).value);
  298.         },
  299.         function (tx, error) {
  300.             callback(null);
  301.         });
  302.     });
  303. },
  304.  
  305. save_profile_prefs:
  306. function save_profile_prefs(name, json, callback) {
  307.     db.database.transaction(function (tx) {
  308.         tx.executeSql('UPDATE Profile SET preferences=? WHERE name=?', [name, json],
  309.         function (tx, rs) {
  310.             callback(true);
  311.         },
  312.         function (tx, error) {
  313.             callback(false);
  314.         });
  315.     });
  316. },
  317.  
  318. load_profile_prefs:
  319. function load_profile_prefs(name, callback) {
  320.     db.database.transaction(function (tx) {
  321.         tx.executeSql('SELECT preferences FROM Profile WHERE name=?', [name],
  322.         function (tx, rs) {
  323.             if (rs.rows.length == 0) {
  324.                 callback('{}');
  325.             } else {
  326.                 callback(rs.rows.item(0).preferences);
  327.             }
  328.         });
  329.     });
  330. },
  331.  
  332. add_profile:
  333. function add_profile(prefix, protocol, callback) {
  334.     db.database.transaction(function (tx) {
  335.         tx.executeSql('INSERT INTO Profile VALUES(?, ?, ?, ?)', [prefix+'@'+protocol, protocol, JSON.stringify(conf.get_default_prefs(protocol)), 0],
  336.         function (tx, rs) {
  337.             callback(true);
  338.         },
  339.         function (tx, error) {
  340.             callback(error);
  341.         });
  342.     });
  343. },
  344.  
  345. remove_profile:
  346. function remove_profile(name, callback) {
  347.     db.database.transaction(function (tx) {
  348.         tx.executeSql('DELETE FROM Profile WHERE name=?', [name],
  349.         function (tx, rs) {
  350.             callback(true);
  351.         },
  352.         function (tx, error) {
  353.             callback(false);
  354.         });
  355.     });
  356. },
  357.  
  358. modify_profile:
  359. function modify_profile(name, profile, callback) {
  360.     db.database.transaction(function (tx) {
  361.         tx.executeSql('UPDATE Profile SET "name"=?, "protocol"=?, "preferences"=?, "order"=? WHERE "name"=?', [profile.name, profile.protocol, profile.preferences, profile.order, name],
  362.         function (tx, rs) {
  363.             callback(true);
  364.         },
  365.         function (tx, error) {
  366.             callback(error);
  367.         });
  368.     });
  369. },
  370.  
  371. get_profile:
  372. function get_profile(name, callback) {
  373.     db.database.transaction(function (tx) {
  374.         tx.executeSql('SELECT * FROM Profile WHERE name=?', [name],
  375.         function (tx, rs) {
  376.             if (rs.rows.length == 0) {
  377.                 callback({});
  378.             } else {
  379.                 callback({'name': rs.rows.item(0).name
  380.                         , 'protocol': rs.rows.item(0).protocol
  381.                         , 'preferences': rs.rows.item(0).preferences
  382.                         , 'order': rs.rows.item(0).order});
  383.             }
  384.         });
  385.     });
  386. },
  387.  
  388. get_all_profiles:
  389. function get_all_profiles(callback) {
  390.     db.database.transaction(function (tx) {
  391.         tx.executeSql('SELECT * FROM "Profile" ORDER BY "Profile"."order"', [],
  392.         function (tx, rs) {
  393.             if (rs.rows.length == 0) {
  394.                 callback([]);
  395.             } else {
  396.                 var profs = [];
  397.                 for (var i = 0, l = rs.rows.length; i < l; i += 1) {
  398.                     profs.push({'name': rs.rows.item(i).name
  399.                         , 'protocol': rs.rows.item(i).protocol
  400.                         , 'preferences': rs.rows.item(i).preferences
  401.                         , 'order': rs.rows.item(i).order});
  402.                 }
  403.                 callback(profs);
  404.             }
  405.         });
  406.     });
  407. }
  408.  
  409. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement