home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Narzedzia / AIMP2 / aimp_2.61.583.exe / $TEMP / YandexPackSetup.msi / filF16851A92FD261E961A3A4E118854D62 < prev    next >
Text File  |  2010-07-12  |  7KB  |  296 lines

  1. var gYaStorage = {
  2.   init: function() {
  3.     this._initStorage();
  4.     OBSERVER_SERVICE.addObserver(this, "quit-application-granted", false);
  5.   },
  6.   
  7.   _uninit: function() {
  8.     this.shutdown();
  9.     OBSERVER_SERVICE.removeObserver(this, "quit-application-granted");
  10.   },
  11.   
  12.   shutdown: function() {
  13.     try {
  14.       this._dbClearStatementsCache();
  15.       
  16.       if (this._dbConnection)
  17.         this._dbConnection.close();
  18.     } catch(e) {}
  19.   },
  20.   
  21.   observe: function(aSubject, aTopic, aData) {
  22.     switch (aTopic) {
  23.       case "quit-application-granted":
  24.         this._uninit();
  25.         break;
  26.       
  27.       default:
  28.         break;
  29.     }
  30.   },
  31.   
  32.   get _storageService() {
  33.     delete this._storageService;
  34.     return this._storageService = Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
  35.   },
  36.   
  37.   DB_VERSION: 1,
  38.   
  39.   _dbSchema: {
  40.     tables: {
  41.       page_snapshots:  "id                  INTEGER PRIMARY KEY,\
  42.                         hostRevert          TEXT,\
  43.                         url                 TEXT UNIQUE ON CONFLICT REPLACE NOT NULL,\
  44.                         urlReal             TEXT,\
  45.                         title               TEXT,\
  46.                         checkTime           INTEGER NOT NULL,\
  47.                         httpStatus          INTEGER NOT NULL,\
  48.                         faviconUrl          TEXT,\
  49.                         img                 BLOB"
  50.     }
  51.   },
  52.   
  53.   _storageInitialized: false,
  54.   
  55.   _dbConnection: null,
  56.   _dbStatementsCache: null,
  57.   
  58.   _dbFile: null,
  59.   _dbFileName: "yasearch-storage.sqlite",
  60.   
  61.   _dbCreateStatement: function(aQuery, aParams) {
  62.     let wrappedStatement = (aQuery in this._dbStatementsCache) ? this._dbStatementsCache[aQuery] : null;
  63.     
  64.     if (!wrappedStatement) {
  65.       wrappedStatement = Cc["@mozilla.org/storage/statement-wrapper;1"].createInstance(Ci.mozIStorageStatementWrapper);
  66.       wrappedStatement.initialize(this._dbConnection.createStatement(aQuery));
  67.       this._dbStatementsCache[aQuery] = wrappedStatement;
  68.     }
  69.     
  70.     if (aParams)
  71.       for (let name in aParams)
  72.         wrappedStatement.params[name] = aParams[name];
  73.     
  74.     return wrappedStatement;
  75.   },
  76.   
  77.   _initStorage: function() {
  78.     this._dbStatementsCache = {};
  79.     
  80.     try {
  81.       if (!this._dbFile) {
  82.         this._dbFile = gYaSearchService.getYandexDir();
  83.         this._dbFile.append(this._dbFileName);
  84.       }
  85.       
  86.       this._dbInit();
  87.       this._storageInitialized = true;
  88.     
  89.     } catch(e) {
  90.       gYaSearchService.log("gYaStorage: " + this._dbFileName + " initialization failed: " + e);
  91.     }
  92.   },
  93.   
  94.   _dbInit: function () {
  95.     let isFirstRun = false;
  96.     
  97.     try {
  98.       this._dbConnection = this._storageService.openDatabase(this._dbFile);
  99.       
  100.       let version = this._dbConnection.schemaVersion;
  101.       if (version === 0) {
  102.         this._dbCreate();
  103.         isFirstRun = true;
  104.       } else if (version != this.DB_VERSION) {
  105.         this._dbMigrate(version);
  106.       }
  107.     } catch (e if e.result == Components.results.NS_ERROR_FILE_CORRUPTED) {
  108.       this._dbCleanup(true);
  109.       throw e;
  110.     } catch (e) {
  111.       throw e;
  112.     }
  113.     
  114.     return isFirstRun;
  115.   },
  116.   
  117.   _dbCreate: function() {
  118.     this._dbCreateSchema();
  119.     this._dbConnection.schemaVersion = this.DB_VERSION;
  120.   },
  121.   
  122.   _dbCreateSchema: function() {
  123.     this._dbCreateTables();
  124.   },
  125.   
  126.   _dbCreateTables: function() {
  127.     for (let name in this._dbSchema.tables)
  128.       this._dbConnection.createTable(name, this._dbSchema.tables[name]);
  129.   },
  130.   
  131.   _dbMigrate: function(aVersion) {
  132.     this._dbConnection.schemaVersion = this.DB_VERSION;
  133.   },
  134.   
  135.   _dbCleanup: function(aBackup) {
  136.     this._dbClearStatementsCache();
  137.     
  138.     try {
  139.       this._dbConnection.close();
  140.     } catch(e) {}
  141.     
  142.     this._dbFile.remove(false);
  143.   },
  144.   
  145.   _dbClearStatementsCache: function() {
  146.     if (this._dbStatementsCache) {
  147.       try {
  148.         for each (let dbStatement in this._dbStatementsCache)
  149.           dbStatement.statement.finalize();
  150.       } catch(e) {}
  151.     }
  152.     
  153.     this._dbStatementsCache = {};
  154.   },
  155.   
  156.   _dbCleanupOldURLData: function(aExistURLs) {
  157.     let query = "DELETE FROM page_snapshots WHERE checkTime < :checkTime";
  158.     
  159.     let params = {
  160.       checkTime: Date.now() - DAY_SECS
  161.     }
  162.     
  163.     let append = [];
  164.     let i = 1;
  165.     aExistURLs.forEach(function(aURL) {
  166.       append.push(" url != :url" + i);
  167.       params["url" + i++] = aURL;
  168.     });
  169.     
  170.     if (append.length)
  171.       query += " AND " + append.join(" AND ");
  172.     
  173.     let stmt;
  174.     try {
  175.       stmt = this._dbCreateStatement(query, params);
  176.       stmt.execute();
  177.     } catch(e) {
  178.       gYaSearchService.log("gYaStorage: Couldn't cleanup old data from database: " + e);
  179.     } finally {
  180.       if (stmt)
  181.         stmt.reset();
  182.     }
  183.   },
  184.   
  185.   get _rowNames() {
  186.     delete this._rowNames;
  187.     
  188.     return this._rowNames = this._dbSchema.tables.page_snapshots
  189.                             .split(",")
  190.                             .map(function(aRowName) { return aRowName.replace(/^\s+/, "").replace(/\s.*/, ""); });
  191.   },
  192.   
  193.   setURLData: function(aData) {
  194.     this._insertURLData(aData);
  195.   },
  196.   
  197.   getImageForURL: function(aURL) {
  198.     if (!(aURL && typeof aURL == "string"))
  199.       return null;
  200.     
  201.     let query = "SELECT img FROM page_snapshots WHERE url = :url";
  202.     
  203.     let params = {
  204.       url: aURL
  205.     }
  206.     
  207.     let result = null,
  208.         stmt;
  209.     
  210.     try {
  211.       stmt = this._dbCreateStatement(query, params);
  212.       if (stmt.step()) {
  213.         result = stmt.row["img"];
  214.       }
  215.     } catch(e) {
  216.       gYaSearchService.log("gYaStorage: Couldn't read from database: " + e);
  217.     } finally {
  218.       if (stmt)
  219.         stmt.reset();
  220.     }
  221.     
  222.     return result;
  223.   },
  224.   
  225.   getURLData: function(aURL) {
  226.     if (!(aURL && typeof aURL == "string"))
  227.       return null;
  228.     
  229.     let query = "SELECT * FROM page_snapshots WHERE url = :url";
  230.     
  231.     let params = {
  232.       url: aURL
  233.     }
  234.     
  235.     let result = null,
  236.         stmt;
  237.     
  238.     try {
  239.       stmt = this._dbCreateStatement(query, params);
  240.       if (stmt.step()) {
  241.         result = {};
  242.         this._rowNames.forEach(function(aRowName) {
  243.           result[aRowName] = stmt.row[aRowName];
  244.         });
  245.       }
  246.     } catch(e) {
  247.       gYaSearchService.log("gYaStorage: Couldn't read from database: " + e);
  248.     } finally {
  249.       if (stmt)
  250.         stmt.reset();
  251.     }
  252.     
  253.     if (result) {
  254.       result.state = (result.checkTime && !result.img) ? "error" : "";
  255.     }
  256.     
  257.     return result;
  258.   },
  259.   
  260.   _insertURLData: function(aData) {
  261.     let params = {},
  262.         paramsName = [];
  263.     
  264.     this._rowNames.forEach(function(aParamName) {
  265.       if (aParamName in aData) {
  266.         params[aParamName] = (aData[aParamName] || "").toString();
  267.         paramsName.push(aParamName);
  268.       }
  269.     });
  270.     
  271.     let query, stmt;
  272.     
  273.     let existPage = this.getURLData(aData.url);
  274.     if (existPage) {
  275.       let values = [];
  276.       paramsName.forEach(function(name) {
  277.         if (name !== "url")
  278.           values.push(name + " = :" + name);
  279.       });
  280.       query = "UPDATE page_snapshots SET " + values.join(", ") + " WHERE url = :url";
  281.     } else {
  282.       query = "INSERT INTO page_snapshots (" + paramsName.join(",") + ") " +
  283.               "VALUES (:" + paramsName.join(", :") + ")";
  284.     }
  285.     
  286.     try {
  287.       stmt = this._dbCreateStatement(query, params);
  288.       stmt.execute();
  289.     } catch(e) {
  290.       gYaSearchService.log("gYaStorage: Couldn't write to database: " + e);
  291.     } finally {
  292.       if (stmt)
  293.         stmt.reset();
  294.     }
  295.   }
  296. };