(
global_db: Option<&GlobalDb>,
lcm_conn: Option<&libsql::Connection>,
project_id: &str,
)
| 112 | } |
| 113 | |
| 114 | async fn durable_analytics_rows( |
| 115 | global_db: Option<&GlobalDb>, |
| 116 | lcm_conn: Option<&libsql::Connection>, |
| 117 | project_id: &str, |
| 118 | ) -> Option<Vec<Value>> { |
| 119 | if let Some(db) = global_db { |
| 120 | if let Ok(events) = db |
| 121 | .query_analytics_events(&AnalyticsEventQuery { |
| 122 | provider: None, |
| 123 | project_id: Some(project_id.to_string()), |
| 124 | session_id: None, |
| 125 | event_kind: None, |
| 126 | since: None, |
| 127 | limit: ANALYTICS_EVENT_LIMIT, |
| 128 | }) |
| 129 | .await |
| 130 | { |
| 131 | if !events.is_empty() { |
| 132 | return Some(events.iter().map(durable_analytics_event_row).collect()); |
| 133 | } |
| 134 | } |
| 135 | } |
| 136 | |
| 137 | let rows = query_rows( |
| 138 | lcm_conn?, |
| 139 | "SELECT provider, timestamp, event_kind, hook_name, tool_name, |
| 140 | tool_category, skill_name, hint_category, outcome, metadata_json |
| 141 | FROM ( |
| 142 | SELECT provider, timestamp, event_kind, hook_name, tool_name, |
| 143 | tool_category, skill_name, hint_category, outcome, metadata_json, id |
| 144 | FROM analytics_events |
| 145 | WHERE project_id = ?1 |
| 146 | ORDER BY timestamp DESC, id DESC |
| 147 | LIMIT 10000 |
| 148 | ) |
| 149 | ORDER BY timestamp, id", |
| 150 | libsql::params![project_id], |
| 151 | ) |
| 152 | .await |
| 153 | .ok()?; |
| 154 | if rows.is_empty() { |
| 155 | None |
| 156 | } else { |
| 157 | Some(rows) |
| 158 | } |
| 159 | } |
| 160 | |
| 161 | pub(crate) fn durable_analytics_event_row(event: &AnalyticsEventRecord) -> Value { |
| 162 | json!({ |
no test coverage detected