what is who

N.S.
プログラム開発などを約34年ほど経験。
IT関連会社で業務
・猫が好き
・趣味はアクアリウム
  自宅に海水魚が泳ぐ。
  →ライブ配信
・ペットにモルモットも…
・RaspberryPiで工作なども
 →回し車カウンター

  • IndexedDBを使おうかと思った、ただ意図的に消さないとずっと残るらしい

    IndexedDBを使う

    
    const __debug__ = true;
    
    /**
     * indexedDB操作クラス
     */
    class indexDBAccess {
        /**
         * 初期化
         *
         * string dbName DB名
         * string storeName store名
         * int maxDataCount 保存データ数(これを過ぎると古いものから消す)
         */
        constructor(dbName = "indexDbAccess", storeName = 'datas', maxDataCount=1000){
            let self = this;
            if(!indexedDB) {
                self.debuglog("indexedDBが使えない");
                return false;
            }
    
            self.dbName = dbName;
            self.storeName = storeName;
            self.logMax = maxDataCount;
            self.dbVersion = 1;
    
            let openReq = indexedDB.open(self.dbName);
    
            // DBがある場合はバージョンを取得する
            openReq.onsuccess = function(event) {
                let db = event.target.result;
                self.dbVersion = db.version;
                self.debuglog("dbopen success:" + self.dbVersion);
                db.close();
            }
    
            // DBが無い場合は作成
            openReq.onerror = function(event) {
                self.debuglog("db none");
                self.createDB();
            }
        }
    
        /**
         * DBとストア作成
         */
        createDB() {
            let self = this;
            self.debuglog("create dbVersion="+self.dbVersion);
            let openReq  = indexedDB.open(self.dbName,self.dbVersion);
    
            // 新規作成時
            openReq.onupgradeneeded = function(event){
                let db = event.target.result;
                self.dbVersion = db.version;
                self.debuglog("created db upgrade dbVersion="+self.dbVersion);
                let store = db.createObjectStore(self.storeName, {keyPath : 'id', autoIncrement: true});
                db.close();
            }
    
            // 既に該当のバージョンがある場合
            openReq.onsuccess = function(event){
                let db = event.target.result;
                self.dbVersion = db.version;
                self.debuglog("created db dbVersion="+self.dbVersion);
                db.close();
            }
    
            // バージョンが上がっている場合エラーになるのでバージョン番号のみ取得する、
            openReq.onerror = function(event) {
                self.debuglog("dbVersion invalid");
                let openReq = indexedDB.open(self.dbName);
                openReq.onsuccess = function(event){
                    let db = event.target.result;
                    self.dbVersion = db.version;
                    self.debuglog("created db dbVersion="+self.dbVersion);
                    db.close();
                }
            }
        }
    
        /**
         * 保存データ数の変更
         * 
         * int maxDataCount 保存データ数
         */
        setMaxCount(maxDataCount=10) {
            this.logMax = maxDataCount;
        }
    
        /**
         * DBの削除
         */
        drop () {
            if(!indexedDB) {
                return false;
            }
            let self = this;
            let dbName = self.dbName;
            let storeName  = self.storeName;
            self.debuglog("delete count dbVersion="+self.dbVersion);
            self.dbVersion++;
            self.debuglog("delete counted dbVersion="+self.dbVersion);
    
            indexedDB.deleteDatabase(dbName);
        }
    
        /**
         * 追加
         */
        add(val) {
            let self = this;
            self.put(val);
        }
    
        /**
         * 更新
         */
        put(val, key=null) {
            if(!indexedDB) {
                return false;
            }
    
            let self = this;
            let dbName = self.dbName;
            let storeName  = self.storeName;
    
            self.debuglog("dbName=" + dbName + " dbViersion=" + self.dbVersion + " write value:" + val);
            let openReq  = indexedDB.open(dbName,self.dbVersion);
        
            openReq.onupgradeneeded = function(event){
                let db = event.target.result;
                self.dbVersion = db.version;
                self.debuglog('write create object store:' + self.dbVersion);
                let store = db.createObjectStore(self.storeName, {keyPath : 'id', autoIncrement: true});
            }
    
            openReq.onsuccess = function(event){
                let db = event.target.result;
                self.dbVersion = db.version;
                self.debuglog("write db open dbVersion="+self.dbVersion + ":" + db.objectStoreNames.length);
                if (db.objectStoreNames.length<1){
                    self.drop();
                    self.createDB();
                    return;
                }
                let transaction = db.transaction([storeName], "readwrite");
                let store = transaction.objectStore(storeName);
                if (key === null) {
                    let result = store.add({value: val});
                    self.debuglog("add value");
                    result.onsuccess = function(event){
                        let maxkey = event.target.result;
                        self.debuglog("write add dbVersion="+self.dbVersion);
                        if (maxkey>self.logMax) {
                            let keyRangeValue = IDBKeyRange.upperBound(maxkey-self.logMax, false);
                            store.delete(keyRangeValue);
                        }
                    }
                }
                else{
                    let result = store.put({id: key, value: val});
                    result.onsuccess = function(event) {
                        let db = event.target.result;
                        self.dbVersion = db.version;
                        self.debuglog("put value key=" + key + " dbVersion=" + self.dbVersion);
                    }
                }
                db.close();
            }
        }
    
        /**
         * 取得
         */
        dataGet() {
            if(!indexedDB) {
                return false;
            }
            let self = this;
    
            let resultData = new Array();
    
            const promise = new Promise((resolve, reject) => {
                let dbName = self.dbName;
                let storeName  = self.storeName;
                let openReq  = indexedDB.open(dbName,self.dbVersion);
    
                openReq.onupgradeneeded = function(event){
                    let db = event.target.result;
                    self.dbVersion = db.version;
                    self.debuglog('dataGet create object store:' + self.dbVersion);
                    let store = db.createObjectStore(self.storeName, {keyPath : 'id', autoIncrement: true});
                }
    
                openReq.onsuccess = function(event){
                    let db = event.target.result;
                    self.dbVersion = db.version;
                    self.debuglog("dataGet dbVersion="+self.dbVersion);
                    if (db.objectStoreNames.length<1){
                        db.close();
                        self.drop();
                        self.createDB();
                        return;
                    }
                    let transaction = db.transaction([storeName], "readwrite");
                    let datas = transaction.objectStore(storeName);
    
                    datas.openCursor().onsuccess = function (event) {
                        let cursor = event.target.result;
                        if (cursor) {
                            let cv = cursor.value;
                            resultData.push(cv);
                            cursor.continue();  
                        }
                    }
                    db.close();
                }
            });
            return resultData;
    
        }
    
        debuglog(msg) {
            if (__debug__) {
                console.log(msg);
            }
        }
    }
    
    let db = new indexDBAccess();
    
    function getdata() {
        let result = db.dataGet();
        console.log(result);
    }
    
    意図的に消さないと消えない。
    つまり、削除の機能を実装するか、ブラウザの設定で消さないと利用者のディスク容量がどんどん消費されてしまう。
    ライブのログとかを書き出す用途で使うとやばいやつ。

    javascript,indexeddb

    2019-03-11 15:07:52

    2019-03-12 14:12:33