기여 목록 / 8505857
[sql] Use ColumnTime() and BindTime() in payments and DPO stores
자동완성 결제 메타데이터 표와 DeclarativePerformanceObserverStore가 시간 값을 읽고 쓸 때 손으로 하던 변환을 sql::Statement::ColumnTime()·BindTime()으로 바꿨습니다. sql::Statement 시간 접근자 이행 시리즈(crbug.com/40176243, OSSCA #416)의 다섯 번째 CL입니다. 2파일 +10/−22, 저장 형식은 바뀌지 않습니다. webdata OWNER fleimgruber@가 autofill 쪽을 승인한 뒤 성능 관찰자 저장소의 OWNER이자 작성자인 sisidovski@를 더해 두 번째 승인을 받았고, sisidovski@가 CQ를 돌려 한 번에 통과해 2026-10-06에 머지됐습니다(c29c63e9fb89c).
문제 설명
- issue url: https://crbug.com/40176243
sql/statement.h는 시간 컬럼을ColumnTime()·BindTime()으로 다루고 손 변환을 옮기라는 TODO를 남겨 두었습니다. CL 1~4(8382856, 8410045, 8474691, 8479611)에 이어 남은 곳을 옮기고 있습니다.PaymentsAutofillTable은 서버 카드·IBAN 메타데이터의use_date를BindTime()으로 쓰면서, 읽을 때는 네 곳에서base::Time::FromDeltaSinceWindowsEpoch(base::Microseconds(...))로 손 변환하고 있었습니다.DeclarativePerformanceObserverStore는created_at을 같은 방식으로 읽고,created_at과 정리 쿼리의 만료 기준 시각을ToDeltaSinceWindowsEpoch().InMicroseconds()로 손 변환해 쓰고 있었습니다.
해결 내용
- 결제 표의 읽기 4곳을
s.ColumnTime(index++)로 바꿨습니다. - 성능 관찰자 저장소의 읽기 1곳을
ColumnTime()으로, 쓰기 2곳과 만료 기준 시각 바인딩 2곳을BindTime()으로 바꿨습니다. 기준 시각을 담던 지역 변수threshold_us도 사라졌습니다.
- card_metadata.use_date = base::Time::FromDeltaSinceWindowsEpoch(
- base::Microseconds(s.ColumnInt64(index++)));
+ card_metadata.use_date = s.ColumnTime(index++);
...
- int64_t threshold_us = (base::Time::Now() - kReportsTimeToLive)
- .ToDeltaSinceWindowsEpoch()
- .InMicroseconds();
- clean_policies_statement.BindInt64(0, threshold_us);
+ clean_policies_statement.BindTime(0,
+ base::Time::Now() - kReportsTimeToLive);결제 표의 오퍼 만료 시각은 밀리초 단위로 저장돼 있어 두 접근자와 같은 값이 아니므로 이번 범위에서 뺐습니다.
발굴 과정
원래 계획에서 CL 5는 결제 표 4곳과 statement.h 정리였습니다. 착수 전에 최신 main(10-01)을 다시 전수 검색했는데, 이번에는 줄바꿈된 형태와 지역 변수를 거쳐 변환하는 경우까지 잡도록 검색을 넓혔습니다. 그 결과 두 가지가 나왔습니다.
- 성능 관찰자 저장소 5곳: CL 4 때 «이미 바뀌었다»고 잘못 판단해 빠졌던 곳이라 이번 CL에 함께 넣었습니다.
- iOS 다운로드 기록 DB 7곳: iOS 전용이라 별도 CL로 나눕니다. 그래서
statement.h정리는 그 뒤의 마지막 CL로 미뤘습니다. 시간 간격(TimeDelta) 쪽은 남은 곳이 없었습니다.
리뷰어는 이 파일의 최근 CL을 모두 승인한 webdata OWNER fleimgruber@에게 먼저 받고, 이어서 성능 관찰자 저장소의 단독 OWNER이자 작성자인 sisidovski@에게 받습니다.
테스트 방법
동작 불변 리팩토링이라 새 테스트는 없고 기존 테스트 통과가 검증입니다.
- 등가성:
sql/statement.cc에서BindTime()은time.ToDeltaSinceWindowsEpoch().InMicroseconds()를 바인딩하고,ColumnTime()은base::Time::FromDeltaSinceWindowsEpoch(base::Microseconds(value))를 돌려줍니다. 손으로 쓴 변환과 같은 값입니다. components_unittests·content_unittests증분 빌드 7스텝 15초components_unittests --gtest_filter='PaymentsAutofillTableTest.*:*AutofillTableTest*:WebDatabaseMigrationTest.*'166/166,content_unittests --gtest_filter='*DeclarativePerformanceObserver*'48/48 통과- presubmit 0 경고
배운 점
- 같은 변환이 한 줄짜리, 줄바꿈된 것, 지역 변수를 거치는 것 등 여러 모양으로 흩어져 있어 검색 패턴을 넓혀야 빠짐없이 찾을 수 있습니다.
- 범위에서 빼는 판단도 근거를 원문으로 확인해야 합니다. CL 4 때 그 확인을 빠뜨려 한 파일이 이번 CL로 넘어왔습니다.
- 파일마다 OWNER가 다른 CL은 각 파일의 OWNER를 순서대로 붙이면 승인 두 개가 자연스럽게 채워집니다. 첫 리뷰어의 +1이 오자마자 두 번째를 붙여 사흘 안에 머지됐습니다.