ponder 0.8.0 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/ponder.js +48 -43
- package/dist/bin/ponder.js.map +1 -1
- package/package.json +1 -1
- package/src/build/configAndIndexingFunctions.ts +10 -5
- package/src/database/index.ts +82 -70
package/package.json
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { BuildError } from "@/common/errors.js";
|
|
2
|
-
import type { Factory } from "@/config/address.js";
|
|
3
2
|
import type { Config } from "@/config/config.js";
|
|
4
3
|
import {
|
|
5
4
|
type Network,
|
|
@@ -414,11 +413,14 @@ export async function buildConfigAndIndexingFunctions({
|
|
|
414
413
|
|
|
415
414
|
const resolvedAddress = source?.address;
|
|
416
415
|
|
|
417
|
-
if (
|
|
416
|
+
if (
|
|
417
|
+
typeof resolvedAddress === "object" &&
|
|
418
|
+
!Array.isArray(resolvedAddress)
|
|
419
|
+
) {
|
|
418
420
|
// Note that this can throw.
|
|
419
421
|
const logFactory = buildLogFactory({
|
|
420
422
|
chainId: network.chainId,
|
|
421
|
-
...
|
|
423
|
+
...resolvedAddress,
|
|
422
424
|
});
|
|
423
425
|
|
|
424
426
|
const logSource = {
|
|
@@ -579,11 +581,14 @@ export async function buildConfigAndIndexingFunctions({
|
|
|
579
581
|
);
|
|
580
582
|
}
|
|
581
583
|
|
|
582
|
-
if (
|
|
584
|
+
if (
|
|
585
|
+
typeof resolvedAddress === "object" &&
|
|
586
|
+
!Array.isArray(resolvedAddress)
|
|
587
|
+
) {
|
|
583
588
|
// Note that this can throw.
|
|
584
589
|
const logFactory = buildLogFactory({
|
|
585
590
|
chainId: network.chainId,
|
|
586
|
-
...
|
|
591
|
+
...resolvedAddress,
|
|
587
592
|
});
|
|
588
593
|
|
|
589
594
|
return [
|
package/src/database/index.ts
CHANGED
|
@@ -672,20 +672,7 @@ export const createDatabase = ({
|
|
|
672
672
|
),
|
|
673
673
|
} satisfies PonderApp;
|
|
674
674
|
|
|
675
|
-
|
|
676
|
-
if (previousApp === undefined) {
|
|
677
|
-
await tx
|
|
678
|
-
.insertInto("_ponder_meta")
|
|
679
|
-
.values({ key: "status", value: null })
|
|
680
|
-
.execute();
|
|
681
|
-
await tx
|
|
682
|
-
.insertInto("_ponder_meta")
|
|
683
|
-
.values({
|
|
684
|
-
key: "app",
|
|
685
|
-
value: newApp,
|
|
686
|
-
})
|
|
687
|
-
.execute();
|
|
688
|
-
|
|
675
|
+
const createEnums = async () => {
|
|
689
676
|
for (
|
|
690
677
|
let i = 0;
|
|
691
678
|
i < schemaBuild.statements.enums.sql.length;
|
|
@@ -704,6 +691,9 @@ export const createDatabase = ({
|
|
|
704
691
|
throw e;
|
|
705
692
|
});
|
|
706
693
|
}
|
|
694
|
+
};
|
|
695
|
+
|
|
696
|
+
const createTables = async () => {
|
|
707
697
|
for (
|
|
708
698
|
let i = 0;
|
|
709
699
|
i < schemaBuild.statements.tables.sql.length;
|
|
@@ -722,6 +712,47 @@ export const createDatabase = ({
|
|
|
722
712
|
throw e;
|
|
723
713
|
});
|
|
724
714
|
}
|
|
715
|
+
};
|
|
716
|
+
|
|
717
|
+
const dropTables = async () => {
|
|
718
|
+
for (const tableName of getTableNames(schemaBuild.schema)) {
|
|
719
|
+
await tx.schema
|
|
720
|
+
.dropTable(tableName.sql)
|
|
721
|
+
.cascade()
|
|
722
|
+
.ifExists()
|
|
723
|
+
.execute();
|
|
724
|
+
await tx.schema
|
|
725
|
+
.dropTable(tableName.reorg)
|
|
726
|
+
.cascade()
|
|
727
|
+
.ifExists()
|
|
728
|
+
.execute();
|
|
729
|
+
}
|
|
730
|
+
};
|
|
731
|
+
|
|
732
|
+
const dropEnums = async () => {
|
|
733
|
+
for (const enumName of schemaBuild.statements.enums.json) {
|
|
734
|
+
await tx.schema.dropType(enumName.name).ifExists().execute();
|
|
735
|
+
}
|
|
736
|
+
};
|
|
737
|
+
|
|
738
|
+
// If schema is empty, create tables
|
|
739
|
+
// If schema is empty, create tables
|
|
740
|
+
if (previousApp === undefined) {
|
|
741
|
+
await tx
|
|
742
|
+
.insertInto("_ponder_meta")
|
|
743
|
+
.values({ key: "status", value: null })
|
|
744
|
+
.execute();
|
|
745
|
+
await tx
|
|
746
|
+
.insertInto("_ponder_meta")
|
|
747
|
+
.values({
|
|
748
|
+
key: "app",
|
|
749
|
+
value: newApp,
|
|
750
|
+
})
|
|
751
|
+
.execute();
|
|
752
|
+
|
|
753
|
+
await createEnums();
|
|
754
|
+
await createTables();
|
|
755
|
+
|
|
725
756
|
common.logger.info({
|
|
726
757
|
service: "database",
|
|
727
758
|
msg: `Created tables [${newApp.table_names.join(", ")}]`,
|
|
@@ -748,61 +779,16 @@ export const createDatabase = ({
|
|
|
748
779
|
.execute();
|
|
749
780
|
await tx
|
|
750
781
|
.updateTable("_ponder_meta")
|
|
751
|
-
.set({
|
|
752
|
-
value: newApp,
|
|
753
|
-
})
|
|
782
|
+
.set({ value: newApp })
|
|
754
783
|
.where("key", "=", "app")
|
|
755
784
|
.execute();
|
|
756
785
|
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
.execute();
|
|
763
|
-
await tx.schema
|
|
764
|
-
.dropTable(tableName.reorg)
|
|
765
|
-
.cascade()
|
|
766
|
-
.ifExists()
|
|
767
|
-
.execute();
|
|
768
|
-
}
|
|
786
|
+
await dropTables();
|
|
787
|
+
await dropEnums();
|
|
788
|
+
|
|
789
|
+
await createEnums();
|
|
790
|
+
await createTables();
|
|
769
791
|
|
|
770
|
-
for (
|
|
771
|
-
let i = 0;
|
|
772
|
-
i < schemaBuild.statements.enums.sql.length;
|
|
773
|
-
i++
|
|
774
|
-
) {
|
|
775
|
-
await sql
|
|
776
|
-
.raw(schemaBuild.statements.enums.sql[i]!)
|
|
777
|
-
.execute(tx)
|
|
778
|
-
.catch((_error) => {
|
|
779
|
-
const error = _error as Error;
|
|
780
|
-
if (!error.message.includes("already exists")) throw error;
|
|
781
|
-
const e = new NonRetryableError(
|
|
782
|
-
`Unable to create enum '${preBuild.namespace}'.'${schemaBuild.statements.enums.json[i]!.name}' because an enum with that name already exists.`,
|
|
783
|
-
);
|
|
784
|
-
e.stack = undefined;
|
|
785
|
-
throw e;
|
|
786
|
-
});
|
|
787
|
-
}
|
|
788
|
-
for (
|
|
789
|
-
let i = 0;
|
|
790
|
-
i < schemaBuild.statements.tables.sql.length;
|
|
791
|
-
i++
|
|
792
|
-
) {
|
|
793
|
-
await sql
|
|
794
|
-
.raw(schemaBuild.statements.tables.sql[i]!)
|
|
795
|
-
.execute(tx)
|
|
796
|
-
.catch((_error) => {
|
|
797
|
-
const error = _error as Error;
|
|
798
|
-
if (!error.message.includes("already exists")) throw error;
|
|
799
|
-
const e = new NonRetryableError(
|
|
800
|
-
`Unable to create table '${preBuild.namespace}'.'${schemaBuild.statements.tables.json[i]!.tableName}' because a table with that name already exists.`,
|
|
801
|
-
);
|
|
802
|
-
e.stack = undefined;
|
|
803
|
-
throw e;
|
|
804
|
-
});
|
|
805
|
-
}
|
|
806
792
|
common.logger.info({
|
|
807
793
|
service: "database",
|
|
808
794
|
msg: `Created tables [${newApp.table_names.join(", ")}]`,
|
|
@@ -817,8 +803,7 @@ export const createDatabase = ({
|
|
|
817
803
|
// If crash recovery is not possible, error
|
|
818
804
|
if (
|
|
819
805
|
common.options.command === "dev" ||
|
|
820
|
-
previousApp.build_id !== newApp.build_id
|
|
821
|
-
previousApp.checkpoint === encodeCheckpoint(zeroCheckpoint)
|
|
806
|
+
previousApp.build_id !== newApp.build_id
|
|
822
807
|
) {
|
|
823
808
|
const error = new NonRetryableError(
|
|
824
809
|
`Schema '${preBuild.namespace}' was previously used by a different Ponder app. Drop the schema first, or use a different schema. Read more: https://ponder.sh/docs/getting-started/database#database-schema`,
|
|
@@ -845,6 +830,35 @@ export const createDatabase = ({
|
|
|
845
830
|
|
|
846
831
|
// Crash recovery is possible, recover
|
|
847
832
|
|
|
833
|
+
if (previousApp.checkpoint === encodeCheckpoint(zeroCheckpoint)) {
|
|
834
|
+
await tx
|
|
835
|
+
.updateTable("_ponder_meta")
|
|
836
|
+
.set({ value: null })
|
|
837
|
+
.where("key", "=", "status")
|
|
838
|
+
.execute();
|
|
839
|
+
await tx
|
|
840
|
+
.updateTable("_ponder_meta")
|
|
841
|
+
.set({ value: newApp })
|
|
842
|
+
.where("key", "=", "app")
|
|
843
|
+
.execute();
|
|
844
|
+
|
|
845
|
+
await dropTables();
|
|
846
|
+
await dropEnums();
|
|
847
|
+
|
|
848
|
+
await createEnums();
|
|
849
|
+
await createTables();
|
|
850
|
+
|
|
851
|
+
common.logger.info({
|
|
852
|
+
service: "database",
|
|
853
|
+
msg: `Created tables [${newApp.table_names.join(", ")}]`,
|
|
854
|
+
});
|
|
855
|
+
|
|
856
|
+
return {
|
|
857
|
+
status: "success",
|
|
858
|
+
checkpoint: encodeCheckpoint(zeroCheckpoint),
|
|
859
|
+
} as const;
|
|
860
|
+
}
|
|
861
|
+
|
|
848
862
|
const checkpoint = previousApp.checkpoint;
|
|
849
863
|
newApp.checkpoint = checkpoint;
|
|
850
864
|
|
|
@@ -855,9 +869,7 @@ export const createDatabase = ({
|
|
|
855
869
|
.execute();
|
|
856
870
|
await tx
|
|
857
871
|
.updateTable("_ponder_meta")
|
|
858
|
-
.set({
|
|
859
|
-
value: newApp,
|
|
860
|
-
})
|
|
872
|
+
.set({ value: newApp })
|
|
861
873
|
.where("key", "=", "app")
|
|
862
874
|
.execute();
|
|
863
875
|
|