Class: MysqlCacheManager::CacheImage::SQLite3

Inherits:
Object
  • Object
show all
Defined in:
lib/mysql_cache_manager/cache_image/sqlite3.rb

Constant Summary collapse

TABLE_SCHEMA =
{
  "metadata" => "
    CREATE TABLE metadata (
      k STRING NOT NULL,
      v STRING NOT NULL,
      PRIMARY KEY (k)
    )
  ",
  "pages" => "
    CREATE TABLE pages (
      space         INTEGER NOT NULL,
      page_number   INTEGER NOT NULL
    )
  ",
}

Instance Method Summary collapse

Constructor Details

#initialize(filename, create_if_needed) ⇒ SQLite3

Returns a new instance of SQLite3.



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/mysql_cache_manager/cache_image/sqlite3.rb', line 22

def initialize(filename, create_if_needed)
  @filename = filename

  if File.exists?(filename)
    @db = ::SQLite3::Database.new(@filename)
  else
    if create_if_needed
      @db = ::SQLite3::Database.new(@filename)
      TABLE_SCHEMA.each do |name, schema|
        @db.query(schema)
      end
    else
      raise "File not found: #{filename}"
    end
  end

  @db.cache_size = 200000
  @db.synchronous = "off"
  @db.temp_store = "memory"
end

Instance Method Details

#add_metadata(k, v) ⇒ Object



48
49
50
51
# File 'lib/mysql_cache_manager/cache_image/sqlite3.rb', line 48

def (k, v)
  @insert_metadata ||= @db.prepare("INSERT INTO metadata (k, v) VALUES (?, ?)")
  @insert_metadata.execute(k, v)
end

#each_page(space) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/mysql_cache_manager/cache_image/sqlite3.rb', line 92

def each_page(space)
  unless block_given?
    return Enumerable::Enumerator.new(self, :each_page, space)
  end

  pages = 0
  @db.execute("SELECT page_number FROM pages WHERE space = #{space} ORDER BY page_number") do |row|
    pages += 1
    yield row[0]
  end

  pages
end

#each_page_batch(space, batch_size) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/mysql_cache_manager/cache_image/sqlite3.rb', line 106

def each_page_batch(space, batch_size)
  unless block_given?
    return Enumerable::Enumerator.new(self, :each_page_batch, space, batch_size)
  end

  batch_pages = Array.new
  pages = each_page(space) do |page_number|
    batch_pages << page_number
    if batch_pages.size >= batch_size
      yield batch_pages
      batch_pages.clear
    end
  end

  unless batch_pages.empty?
    yield batch_pages
  end

  pages
end

#each_spaceObject



78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/mysql_cache_manager/cache_image/sqlite3.rb', line 78

def each_space
  unless block_given?
    return Enumerable::Enumerator.new(self, :each_space)
  end

  spaces = 0
  @db.execute("SELECT DISTINCT space FROM pages ORDER BY space") do |row|
    spaces += 1
    yield row[0]
  end

  spaces
end

#empty!Object



43
44
45
46
# File 'lib/mysql_cache_manager/cache_image/sqlite3.rb', line 43

def empty!
  @db.query("DELETE FROM metadata")
  @db.query("DELETE FROM pages")
end

#metadataObject



53
54
55
56
57
58
59
60
# File 'lib/mysql_cache_manager/cache_image/sqlite3.rb', line 53

def 
   = {}
  @db.execute("SELECT k, v FROM metadata ORDER BY k") do |row|
    [row[0]] = row[1]
  end

  
end

#save_page(space, page_number) ⇒ Object



72
73
74
75
76
# File 'lib/mysql_cache_manager/cache_image/sqlite3.rb', line 72

def save_page(space, page_number)
  @insert_page ||= @db.prepare("INSERT OR IGNORE INTO pages (space, page_number) VALUES (?, ?)")

  @insert_page.execute(space, page_number)
end

#save_pages(page_iterator) ⇒ Object



62
63
64
65
66
67
68
69
70
# File 'lib/mysql_cache_manager/cache_image/sqlite3.rb', line 62

def save_pages(page_iterator)
  @db.transaction
  pages = page_iterator.each do |page|
    save_page(*page)
  end
  @db.commit

  pages
end