mirror of
https://gitlab.com/gitlab-org/gitlab-foss.git
synced 2025-08-01 16:04:19 +00:00
42 lines
1.1 KiB
Ruby
42 lines
1.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module ClickHouse
|
|
class SyncCursor
|
|
QUERY = <<~SQL
|
|
SELECT argMax(primary_key_value, recorded_at) AS primary_key_value
|
|
FROM sync_cursors
|
|
WHERE table_name = {table_name:String}
|
|
LIMIT 1
|
|
SQL
|
|
|
|
INSERT_CURSOR_QUERY = <<~SQL
|
|
INSERT INTO sync_cursors
|
|
(primary_key_value, table_name, recorded_at)
|
|
VALUES ({primary_key_value:UInt64}, {table_name:String}, {recorded_at:DateTime64})
|
|
SQL
|
|
|
|
def self.cursor_for(identifier)
|
|
query = ClickHouse::Client::Query.new(
|
|
raw_query: QUERY,
|
|
placeholders: { table_name: identifier.to_s }
|
|
)
|
|
|
|
# The query returns the default value (0) when no records are present.
|
|
ClickHouse::Client.select(query, :main).first['primary_key_value']
|
|
end
|
|
|
|
def self.update_cursor_for(identifier, value)
|
|
query = ClickHouse::Client::Query.new(
|
|
raw_query: INSERT_CURSOR_QUERY,
|
|
placeholders: {
|
|
primary_key_value: value,
|
|
table_name: identifier.to_s,
|
|
recorded_at: Time.current.to_f
|
|
}
|
|
)
|
|
|
|
ClickHouse::Client.execute(query, :main)
|
|
end
|
|
end
|
|
end
|