2012/07/26

简单的几条SQLite3数据库查询语句

假设我们有一张如下数据的SQLite3数据表:
那么我们可以进行如下操作:

查看表中的所有数据
SELECT * FROM PushEvent;

查找所有event_id小于205530的记录
SELECT * FROM PushEvent WHERE event_id < 205530;

查找当前表中所记录的最大的event_id
SELECT max(event_id) FROM PushEvent;

查找所有早于2012年7月26之前创建的记录
SELECT * FROM PushEvent WHERE strftime('%s', create_at) < strftime('%s', "2012-07-26");

查找指定的5分钟区间的记录
SELECT * FROM PushEvent WHERE 
strftime('%s', created_at) < strftime('%s', "2012-07-26 07:11:00")
AND 
strftime('%s', created_at) > strftime('%s', "2012-07-26 07:06:00");

2012/07/25

使用ruby简单操作sqlite3数据库

昨天有写到一个简单的github event爬虫,今天考虑做一个简单的增强,把数据放到sqlite数据文件中去。

因为是第一次跟sqlite3打交道,做简要记录。

首先通过命令行创建一个数据库。
sqlite3 events.sqlite3
这会创建一个新的,名为events.sqlite3的空数据文件。接着创建一张测试表:
CREATE TABLE PushEvent (
  event_id INTEGER PRIMARY KEY,
  created_at text,
  actor_login text,
  repo_name text,
  payload_size INTEGER DEFAULT NULL
);
这样我们已经在新的数据文件中创建了一张测试表,包含5个字段。

 接下来就是用ruby往里边插入数据了,代码如下:
require 'sqlite3'
begin
    db = SQLite3::Database.open "../db/events.sqlite3"
rescue SQLite3::Exception => e
    puts "Cannot open SQLite3 db"
    puts e
end

db.execute "INSERT INTO PushEvent VALUES(205205, '2012-07-25T08:21:34Z',
'ju', 'zh/Registrat', 1)"

db.close

如果你的系统没有sqlite3这个gem,则可以通过一下命令安装
gem install sqlite3 

2012/07/24

一个简单的github event爬虫

最近在考虑用cacti对现有的application做一些简单的monitor。公司内部有一套github供developer使用。针对github的监控主要侧重于对push,commit,create行为的监控。 今天迈出第一步,照猫画虎的用ruby里的eventmachine写了一个抓github event的小爬虫,数据处理部分以后慢慢设计。 代码如下:
require 'yajl'
require 'em-http'
require 'em-http/middleware/json_response'
$latest_event_id = 0;
$base_api_url = "https://内部github链接";

$push_event_count = 0
$push_event_commit_count = 0
$create_event_repo_count = 0
$create_event_branch_count = 0
$create_event_tag_count = 0

EM.run do 
    stop = Proc.new do
        puts "Terminating event crawler"
        puts "Following events occurs during monitor:"
        puts "Push             #{$push_event_count}"
        puts "Commit           #{$push_event_commit_count}"
        puts "Repo creation    #{$create_event_repo_count}"
        puts "Branch creation  #{$create_event_branch_count}"
        puts "Tag creation     #{$create_event_tag_count}"
        EM.stop
    end
    Signal.trap("INT", &stop)
    Signal.trap("TERM", &stop)
    process = Proc.new do 
        req = EM::HttpRequest.new($base_api_url + "/events").get
        req.callback do
            latest_page = Yajl::Parser.parse(req.response)
            new_events  = latest_page.reject { |e| e['id'].to_i <= $latest_event_id }
            new_events_id = latest_page.collect { |e| e['id'].to_i }
            $latest_event_id = new_events_id.max
            new_events.each do |event|
                if event['type'] == "PushEvent" then
                    $push_event_count += 1
                    $push_event_commit_count += event['payload']['size']
                end
                if event['type'] == "CreateEvent" then
                    case event['payload']
                    when "repository" then $create_event_repo_count += 1
                    when "branch"     then $create_event_branch_count += 1
                    when "tag"        then $create_event_tag_count += 1
                    end
                end
            end
            puts "Found #{new_events.size} new events"
        
            if new_events.size >= 25
                EM.add_timer(1.5, &process)
            end
        end
    end
    EM.add_periodic_timer(12, &process)
end