Skip to content

Commit c1d3ff4

Browse files
fix: reset current.ts
1 parent 62a16c0 commit c1d3ff4

File tree

2 files changed

+169
-164
lines changed

2 files changed

+169
-164
lines changed

migrations/current.ts

+5-164
Original file line numberDiff line numberDiff line change
@@ -1,164 +1,5 @@
1-
import {getSelectResults} from "./src/utils";
2-
3-
function registerEventIds(limit: number, offset: number): string[] {
4-
// NB: collect all contract execution event IDs with related "register" action attribute.
5-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
6-
// @ts-ignore
7-
const results = getSelectResults(plv8.execute(`SELECT ev.id
8-
FROM app.events ev
9-
JOIN app.event_attributes ea ON ev.id = ea.event_id
10-
WHERE ev.type = 'wasm'
11-
AND ea.key = 'action'
12-
AND ea.value = 'register'
13-
LIMIT ${limit}
14-
OFFSET ${offset}`));
15-
if (results) {
16-
return results.map(e => e[0]);
17-
}
18-
return null;
19-
}
20-
21-
function registerEventData(eventIds: string[]): string[][] {
22-
if (eventIds.length == 0) {
23-
return [];
24-
}
25-
26-
const eventIdValues = eventIds.map(e => `'${e}'`).join(", ");
27-
28-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
29-
// @ts-ignore
30-
return getSelectResults(plv8.execute(`SELECT ev.id, ev.transaction_id, ev.block_id, ea.key, ea.value
31-
FROM app.events ev
32-
JOIN app.event_attributes ea ON ev.id = ea.event_id
33-
WHERE ev.id in (${eventIdValues})`));
34-
}
35-
36-
function insertAgents(agents: Record<string, string>) {
37-
// NB: bulk insert agents
38-
const agentIdValues = Object.values(agents).map(id => `('${id}')`).join(", ");
39-
const insertAgents = `INSERT INTO app.agents (id)
40-
VALUES ${agentIdValues}`;
41-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
42-
// @ts-ignore
43-
plv8.execute(insertAgents);
44-
}
45-
46-
export function migrationMicroAgentAlmanacRegistrations() {
47-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
48-
// @ts-ignore
49-
plv8.execute("SET SCHEMA 'app'");
50-
51-
const batchSize = 500;
52-
for (let i = 0; ; i++) {
53-
const eventIdsBatch = registerEventIds(batchSize, batchSize * i);
54-
if (!eventIdsBatch) {
55-
// NB: no more register events to process.
56-
break;
57-
}
58-
59-
const registerEvents = registerEventData(eventIdsBatch);
60-
61-
// NB: organize register event data
62-
const eventIds = {};
63-
const agents = {};
64-
const services = {};
65-
const expiryHeights = {};
66-
const signatures = {};
67-
const sequences = {};
68-
const contracts = {};
69-
const txIds = {};
70-
const blockIds = {};
71-
for (const record of registerEvents) {
72-
if (record.length < 5) {
73-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
74-
// @ts-ignore
75-
plv8.elog(WARNING, `unable to migrate registration event; event ID: ${record[0]}`);
76-
continue;
77-
}
78-
79-
const [eventId, txId, blockId, key, value] = record;
80-
eventIds[eventId] = null;
81-
82-
if (!txIds[eventId]) {
83-
txIds[eventId] = txId;
84-
}
85-
86-
if (!blockIds[eventId]) {
87-
blockIds[eventId] = blockId;
88-
}
89-
90-
switch (key) {
91-
case "_contract_address":
92-
contracts[eventId] = value;
93-
break;
94-
case "agent_address":
95-
agents[eventId] = value;
96-
break;
97-
case "record":
98-
try {
99-
// NB: replaces all instances of \" with ".
100-
const unescapedValue = value.replace(new RegExp("\\\\\"", "g"), "\"");
101-
const service = JSON.parse(unescapedValue).service;
102-
if (!service) {
103-
throw new Error("expected record to contain service key but none found");
104-
}
105-
106-
services[eventId] = JSON.stringify(service);
107-
} catch (error) {
108-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
109-
// @ts-ignore
110-
plv8.elog(WARNING, `unable to parse expected JSON value "${value}": ${error.toString()}`);
111-
continue;
112-
}
113-
break;
114-
case "signature":
115-
signatures[eventId] = value;
116-
break;
117-
case "sequence":
118-
sequences[eventId] = value;
119-
break;
120-
case "expiry_height":
121-
expiryHeights[eventId] = value;
122-
break;
123-
}
124-
}
125-
126-
insertAgents(agents);
127-
128-
// NB: bulk insert records
129-
const recordValues = Object.keys(eventIds).map(eventId => {
130-
return "(" + [
131-
eventId,
132-
services[eventId],
133-
txIds[eventId],
134-
blockIds[eventId],
135-
].map(e => `'${e}'`).join(", ") + ")";
136-
}).join(", ");
137-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
138-
// @ts-ignore
139-
plv8.execute(`INSERT INTO app.almanac_records (id, service, transaction_id, block_id)
140-
VALUES ${recordValues}`);
141-
142-
// NB: bulk insert registrations
143-
const registrationValues = Object.keys(eventIds).map(eventId => {
144-
return "(" + [
145-
eventId,
146-
expiryHeights[eventId],
147-
signatures[eventId],
148-
sequences[eventId],
149-
agents[eventId],
150-
eventId,
151-
contracts[eventId],
152-
txIds[eventId],
153-
blockIds[eventId],
154-
].map(e => `'${e}'`).join(", ") + ")";
155-
}).join(", ");
156-
157-
const insertRegistrations = `INSERT INTO app.almanac_registrations (id, expiry_height, signature, sequence, agent_id, record_id,
158-
contract_id, transaction_id, block_id)
159-
VALUES ${registrationValues}`;
160-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
161-
// @ts-ignore
162-
plv8.execute(insertRegistrations);
163-
}
164-
}
1+
// write plv8 based migration here
2+
//
3+
// export function migrationSomeChange() {
4+
//
5+
// }

migrations/src/000007.ts

+164
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
import {getSelectResults} from "./src/utils";
2+
3+
function registerEventIds(limit: number, offset: number): string[] {
4+
// NB: collect all contract execution event IDs with related "register" action attribute.
5+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
6+
// @ts-ignore
7+
const results = getSelectResults(plv8.execute(`SELECT ev.id
8+
FROM app.events ev
9+
JOIN app.event_attributes ea ON ev.id = ea.event_id
10+
WHERE ev.type = 'wasm'
11+
AND ea.key = 'action'
12+
AND ea.value = 'register'
13+
LIMIT ${limit}
14+
OFFSET ${offset}`));
15+
if (results) {
16+
return results.map(e => e[0]);
17+
}
18+
return null;
19+
}
20+
21+
function registerEventData(eventIds: string[]): string[][] {
22+
if (eventIds.length == 0) {
23+
return [];
24+
}
25+
26+
const eventIdValues = eventIds.map(e => `'${e}'`).join(", ");
27+
28+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
29+
// @ts-ignore
30+
return getSelectResults(plv8.execute(`SELECT ev.id, ev.transaction_id, ev.block_id, ea.key, ea.value
31+
FROM app.events ev
32+
JOIN app.event_attributes ea ON ev.id = ea.event_id
33+
WHERE ev.id in (${eventIdValues})`));
34+
}
35+
36+
function insertAgents(agents: Record<string, string>) {
37+
// NB: bulk insert agents
38+
const agentIdValues = Object.values(agents).map(id => `('${id}')`).join(", ");
39+
const insertAgents = `INSERT INTO app.agents (id)
40+
VALUES ${agentIdValues}`;
41+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
42+
// @ts-ignore
43+
plv8.execute(insertAgents);
44+
}
45+
46+
export function migrationMicroAgentAlmanacRegistrations() {
47+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
48+
// @ts-ignore
49+
plv8.execute("SET SCHEMA 'app'");
50+
51+
const batchSize = 500;
52+
for (let i = 0; ; i++) {
53+
const eventIdsBatch = registerEventIds(batchSize, batchSize * i);
54+
if (!eventIdsBatch) {
55+
// NB: no more register events to process.
56+
break;
57+
}
58+
59+
const registerEvents = registerEventData(eventIdsBatch);
60+
61+
// NB: organize register event data
62+
const eventIds = {};
63+
const agents = {};
64+
const services = {};
65+
const expiryHeights = {};
66+
const signatures = {};
67+
const sequences = {};
68+
const contracts = {};
69+
const txIds = {};
70+
const blockIds = {};
71+
for (const record of registerEvents) {
72+
if (record.length < 5) {
73+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
74+
// @ts-ignore
75+
plv8.elog(WARNING, `unable to migrate registration event; event ID: ${record[0]}`);
76+
continue;
77+
}
78+
79+
const [eventId, txId, blockId, key, value] = record;
80+
eventIds[eventId] = null;
81+
82+
if (!txIds[eventId]) {
83+
txIds[eventId] = txId;
84+
}
85+
86+
if (!blockIds[eventId]) {
87+
blockIds[eventId] = blockId;
88+
}
89+
90+
switch (key) {
91+
case "_contract_address":
92+
contracts[eventId] = value;
93+
break;
94+
case "agent_address":
95+
agents[eventId] = value;
96+
break;
97+
case "record":
98+
try {
99+
// NB: replaces all instances of \" with ".
100+
const unescapedValue = value.replace(new RegExp("\\\\\"", "g"), "\"");
101+
const service = JSON.parse(unescapedValue).service;
102+
if (!service) {
103+
throw new Error("expected record to contain service key but none found");
104+
}
105+
106+
services[eventId] = JSON.stringify(service);
107+
} catch (error) {
108+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
109+
// @ts-ignore
110+
plv8.elog(WARNING, `unable to parse expected JSON value "${value}": ${error.toString()}`);
111+
continue;
112+
}
113+
break;
114+
case "signature":
115+
signatures[eventId] = value;
116+
break;
117+
case "sequence":
118+
sequences[eventId] = value;
119+
break;
120+
case "expiry_height":
121+
expiryHeights[eventId] = value;
122+
break;
123+
}
124+
}
125+
126+
insertAgents(agents);
127+
128+
// NB: bulk insert records
129+
const recordValues = Object.keys(eventIds).map(eventId => {
130+
return "(" + [
131+
eventId,
132+
services[eventId],
133+
txIds[eventId],
134+
blockIds[eventId],
135+
].map(e => `'${e}'`).join(", ") + ")";
136+
}).join(", ");
137+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
138+
// @ts-ignore
139+
plv8.execute(`INSERT INTO app.almanac_records (id, service, transaction_id, block_id)
140+
VALUES ${recordValues}`);
141+
142+
// NB: bulk insert registrations
143+
const registrationValues = Object.keys(eventIds).map(eventId => {
144+
return "(" + [
145+
eventId,
146+
expiryHeights[eventId],
147+
signatures[eventId],
148+
sequences[eventId],
149+
agents[eventId],
150+
eventId,
151+
contracts[eventId],
152+
txIds[eventId],
153+
blockIds[eventId],
154+
].map(e => `'${e}'`).join(", ") + ")";
155+
}).join(", ");
156+
157+
const insertRegistrations = `INSERT INTO app.almanac_registrations (id, expiry_height, signature, sequence, agent_id, record_id,
158+
contract_id, transaction_id, block_id)
159+
VALUES ${registrationValues}`;
160+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
161+
// @ts-ignore
162+
plv8.execute(insertRegistrations);
163+
}
164+
}

0 commit comments

Comments
 (0)