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


 クラウディア


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

1. 概要

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

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

 「gem」で「pg」というライブラリをインストールすればいいそうな。  環境は、「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」テーブルへ内容を追加したり更新したりしています。

4. 参考サイト

 本ページは、下記のサイトを参考にさせていただきました。
ruby から postgresql にアクセスする

audiobook.jp
TikTok Shop 【リピート用プログラム】
【usus ウズウズ】
Amazonギフトカード
薬屋の独り言
アフィリエイトのアクセストレード
ベルリッツ
健康サポート特集
損保との違い
JETBOY
サウンドハウス
葬送のフリーレン Prime Video
5G CONNECT
ハイスピードプラン
それがだいじWi-Fi
ネットオークションの相場、統計、価格比較といえばオークファン
earthcar(アースカー)
EaseUS
U-NEXT