org.dcache.chimera.PgSQL95FsSqlDriver.java Source code

Java tutorial

Introduction

Here is the source code for org.dcache.chimera.PgSQL95FsSqlDriver.java

Source

/*
 * This library is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Library General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this program (see the file COPYING.LIB for more
 * details); if not, write to the Free Software Foundation, Inc.,
 * 675 Mass Ave, Cambridge, MA 02139, USA.
 */
package org.dcache.chimera;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DuplicateKeyException;

import javax.sql.DataSource;

import java.sql.Timestamp;

import org.dcache.chimera.store.InodeStorageInformation;

/**
 * PostgreSQL 9.5 and later specific
 *
 *
 */
public class PgSQL95FsSqlDriver extends PgSQLFsSqlDriver {

    /**
     * logger
     */
    private static final Logger _log = LoggerFactory.getLogger(PgSQL95FsSqlDriver.class);

    /**
     *  this is a utility class which is issues SQL queries on database
     *
     */
    public PgSQL95FsSqlDriver(DataSource dataSource) throws ChimeraFsException {
        super(dataSource);
        _log.info("Running PostgreSQL >= 9.5 specific Driver");
    }

    @Override
    void createEntryInParent(FsInode parent, String name, FsInode inode) {
        int n = _jdbc.update(
                "INSERT INTO t_dirs (iparent, iname, ichild) VALUES(?,?,?) ON CONFLICT ON CONSTRAINT t_dirs_pkey DO NOTHING",
                ps -> {
                    ps.setLong(1, parent.ino());
                    ps.setString(2, name);
                    ps.setLong(3, inode.ino());
                });
        if (n == 0) {
            /*
             * no updates as such entry already exists.
             * To be compatible with others, throw corresponding
             * DataAccessException.
             */
            throw new DuplicateKeyException("Entry already exists");
        }
    }

    /**
      *
      * adds a new location for the inode
      *
      * @param inode
      * @param type
      * @param location
      */
    void addInodeLocation(FsInode inode, int type, String location) {
        _jdbc.update(
                "INSERT INTO t_locationinfo (inumber,itype,ilocation,ipriority,ictime,iatime,istate) VALUES(?,?,?,?,?,?,?) "
                        + "ON CONFLICT ON CONSTRAINT t_locationinfo_pkey DO NOTHING",
                ps -> {
                    Timestamp now = new Timestamp(System.currentTimeMillis());
                    ps.setLong(1, inode.ino());
                    ps.setInt(2, type);
                    ps.setString(3, location);
                    ps.setInt(4, 10); // default priority
                    ps.setTimestamp(5, now);
                    ps.setTimestamp(6, now);
                    ps.setInt(7, 1); // online
                });
    }

    @Override
    void setStorageInfo(FsInode inode, InodeStorageInformation storageInfo) {
        _jdbc.update("INSERT INTO t_storageinfo VALUES (?,?,?,?) "
                + "ON CONFLICT ON CONSTRAINT t_storageinfo_pkey DO NOTHING", ps -> {
                    ps.setLong(1, inode.ino());
                    ps.setString(2, storageInfo.hsmName());
                    ps.setString(3, storageInfo.storageGroup());
                    ps.setString(4, storageInfo.storageSubGroup());
                });
    }

    @Override
    void setInodeChecksum(FsInode inode, int type, String value) {
        _jdbc.update("INSERT INTO t_inodes_checksum (inumber,itype,isum) VALUES (?,?,?) "
                + "ON CONFLICT ON CONSTRAINT t_inodes_checksum_pkey DO NOTHING", ps -> {
                    ps.setLong(1, inode.ino());
                    ps.setInt(2, type);
                    ps.setString(3, value);
                });
    }
}