ruby - RSS 作成 - テーブルアクセス

 
1. 概要
2. ライブラリのインストール
3. モジュール

1. 概要

 当初、定義をコンフィグレーションファイルに書いて、それを読みこむような考えでおりましたが・・・。  サイト定義テーブルというものを持って、そこから定義を持ってくるように方針変更しました。

2. ライブラリのインストール

 gem で pg というライブラリをインストールすればいいそうな。  本項は「rubyからpostgresqlにアクセスする。 - rderaログ」を参考にさせていただきました。  環境は FreeBSD ですので root ユーザ権限で

> gem install pg
Fetching: pg-1.1.3.gem (100%)
Building native extensions. This could take a while...
Successfully installed pg-1.1.3
Parsing documentation for pg-1.1.3
Installing ri documentation for pg-1.1.3
Done installing documentation for pg after 2 seconds
1 gem installed
 すぐに終わります。

3. モジュール

=begin

=end

require('pry')
require('pg')
require('ExceptLog')
require('BaseClass')

class DBaccess < BaseClass
  @@connection = nil                                          # メンバ変数 データベースとのコネクション

  def DBaccess.callback                                       # ファイナライザーで切断
    proc {
      @@connection.finish if @@connection
    }
  end

  def initialize
    ObjectSpace.define_finalizer(self, DBaccess.callback)
  end

  def connect(dbparam)                                        # 接続
    begin
      @@connection = PG::connect(dbparam)

    rescue PGError => error
      exeptlog = ExceptLog.new
      exeptlog.execute(self, error)
    rescue => error
      exeptlog = ExceptLog.new
      exeptlog.execute(self, error)
    ensure

    end
  end

  def feed                                                    # サイト定義テーブルの読込
    begin
      hash = Hash.new
      results = @@connection.exec("SELECT * FROM FEED")

      results.fields.each do | column |
        hash[column] = results.field_values(column)[0]
      end

    rescue PGError => error
      exeptlog = ExceptLog.new
      exeptlog.execute(self, error)
    rescue => error
      exeptlog = ExceptLog.new
      exeptlog.execute(self, error)
    ensure
      return hash
    end
  end

  def content=(detail)
    begin

      detail.each do | record |
        #puts("[#{self.class.name}.#{__method__}] insert=[#{record[:uri]}]")

        if (record[:title] == nil)
          puts("[#{self.class.name}.#{__method__}] URI[#{record[:uri]}] のタイトルが nill です")
          next
        end

        if (record[:description] == nil)
          puts("[#{self.class.name}.#{__method__}] URI[#{record[:description]}] の要約(description)が nill です")
          next
        end

        begin
          contentstr  = @@connection.escape_literal(record[:content])
          title       = @@connection.escape_literal(record[:title])
          description = @@connection.escape_literal(record[:description])
        rescue => error
          exeptlog = ExceptLog.new
          exeptlog.execute(self, error)
          binding.pry
          exit 1
        ensure
        end

        insert = "INSERT INTO CONTENTS "
        insert << "(INDEX, URI, DOCUMENT, TITLE, MODIFIED, DESCRIPTION, CONTENT) "
        insert << "VALUES "
        insert << "("+record[:index]+", '"+record[:uri]+"', '"+record[:document]+"', "+title+", TO_TIMESTAMP('"+record[:modified].to_s[0, 19]+"', 'YYYY-MM-DD HH24:MI:SS'), "+description+", "+contentstr+") "
        insert << "ON CONFLICT (INDEX, URI) "
        insert << "DO UPDATE "
        insert << "SET DOCUMENT='"+record[:document]+"', TITLE="+title+", MODIFIED=TO_TIMESTAMP('"+record[:modified].to_s[0, 19]+"', 'YYYY-MM-DD HH24:MI:SS'), DESCRIPTION="+description+", CONTENT="+contentstr+" "

        #binding.pry
        #puts("[#{self.class.name}.#{__method__}] insert=[#{insert}]")

        results = @@connection.exec(insert)
      end
    rescue => error
      exeptlog = ExceptLog.new
      exeptlog.execute(self, error)
      exit 1
    ensure
    end
  end
end



 feed メソッドで、FEED テーブルの内容を取得します。  content メソッドで、CONTENTS テーブルへ内容を追加したり更新したりしています。