forked from lthn/blockchain
Compare commits
2448 commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b61d773a0f | |||
|
|
c9ad4de9bb | ||
|
|
22c0c5a251 | ||
|
|
f3df50cba5 | ||
|
|
1545a80335 | ||
|
|
467c64d015 | ||
|
|
7ee2265cae | ||
|
|
4120a9a664 | ||
|
|
5dae74347c | ||
|
|
92e0aa779b | ||
|
|
7b0a08f9ff | ||
|
|
88d4357628 | ||
|
|
4a5c5ae742 | ||
|
|
57983cb865 | ||
|
|
ef776a93cc | ||
|
|
106b3431db | ||
|
|
0882f94203 | ||
|
|
1c584e7c76 | ||
|
|
79121dce71 | ||
|
|
3dbb8b1487 | ||
|
|
11d19e5446 | ||
|
|
e4ff164f0d | ||
|
|
dd7a19ac6f | ||
|
|
eb60d4519c | ||
|
|
3e2bad36a6 | ||
|
|
7f930b0fec | ||
|
|
c2c130a076 | ||
|
|
d8d81c1f2e | ||
|
|
c8acc964e3 | ||
|
|
763d70bec2 | ||
|
|
b02addf264 | ||
|
|
bf22a89733 | ||
|
|
2f1011e27c | ||
|
|
7b0c286cef | ||
|
|
b84b99287d | ||
|
|
a03d081287 | ||
|
|
2eaa599066 | ||
|
|
eafeb894f9 | ||
|
|
db80165063 | ||
|
|
b9d85e1c09 | ||
|
|
5982abd525 | ||
|
|
de5e0caebd | ||
|
|
91ced14b2d | ||
|
|
d7d0ba0a41 | ||
|
|
c36355d489 | ||
|
|
11d4bbf1da | ||
|
|
15417edbce | ||
|
|
b9b175c00f | ||
|
|
e3186aef40 | ||
|
|
feb5de6f20 | ||
|
|
9aaa0f8cb8 | ||
|
|
cc8ff1d5a3 | ||
|
|
ff6cbe2548 | ||
|
|
3a9245f743 | ||
|
|
8b57f3acab | ||
|
|
96081db687 | ||
|
|
a93aefd507 | ||
|
|
4923f644c4 | ||
|
|
260228433c | ||
|
|
cbc7357fa7 | ||
|
|
0c7d09d951 | ||
|
|
d78911b344 | ||
|
|
e10a711c36 | ||
|
|
6e6831c355 | ||
|
|
8953e201d6 | ||
|
|
d9557d3bb1 | ||
|
|
334d26a4ac | ||
|
|
d6c6df78f4 | ||
|
|
035f233bc7 | ||
|
|
cd16b5c743 | ||
|
|
b57fa844ef | ||
|
|
4618c240f2 | ||
|
|
3e71f078ca | ||
|
|
7a463d8065 | ||
|
|
06573647b8 | ||
|
|
06d6553473 | ||
|
|
2c920287d3 | ||
|
|
b0e00c0803 | ||
|
|
b0b30e20b2 | ||
|
|
1b8cfa0194 | ||
|
|
0c48a01fbf | ||
|
|
60560ad18c | ||
|
|
71cc7d1363 | ||
|
|
be3938a886 | ||
|
|
e2bfde5bbc | ||
|
|
6fed9dcac5 | ||
|
|
68871b93ec | ||
|
|
32194f88b1 | ||
|
|
854c198415 | ||
|
|
23cf10a4b8 | ||
|
|
94c2e65dad | ||
|
|
0e1618c496 | ||
|
|
015c7ddbb4 | ||
|
|
f8e298af86 | ||
|
|
4695229f2a | ||
|
|
97b17221d9 | ||
|
|
98f5880ae6 | ||
|
|
6c318fc34b | ||
|
|
9e81e7228c | ||
|
|
556746c194 | ||
|
|
ee883a690c | ||
|
|
2edb2e6fe4 | ||
|
|
a3587a48e7 | ||
|
|
63cf4e5dd6 | ||
|
|
cac85721a2 | ||
|
|
8574cc0894 | ||
|
|
d241861d86 | ||
|
|
fed84de8b7 | ||
|
|
a08772ea6a | ||
|
|
8fb16d207f | ||
|
|
d711373824 | ||
|
|
eed7d9e3af | ||
|
|
ffd279f21f | ||
|
|
8042f9a6a5 | ||
|
|
573028c764 | ||
|
|
695bd88c11 | ||
|
|
992ea22294 | ||
|
|
9cce235931 | ||
|
|
9fe3f812aa | ||
|
|
75ad8c7a69 | ||
|
|
6f8d727332 | ||
|
|
f287916372 | ||
|
|
5e0c84e735 | ||
|
|
0cd2ef8ccb | ||
|
|
65241adc1c | ||
|
|
6ad7dad01d | ||
|
|
51990c9d2d | ||
|
|
d56bf75bde | ||
|
|
94b9741976 | ||
|
|
87cd247eb5 | ||
|
|
28606d07ef | ||
|
|
9589c952f8 | ||
|
|
0554d7b8c4 | ||
|
|
db86b3fa15 | ||
|
|
5ac8b20816 | ||
|
|
c241cb3f9b | ||
|
|
2f368cbf2c | ||
|
|
04364afc53 | ||
|
|
035a441efe | ||
|
|
e232c827a6 | ||
|
|
c637e16848 | ||
|
|
dfbda0a77f | ||
|
|
d5890e3c7f | ||
|
|
187a830f58 | ||
|
|
6a4d6e1fc6 | ||
|
|
430d31ba5e | ||
|
|
05ea60a70c | ||
|
|
22b49d93a8 | ||
|
|
5340c6db32 | ||
|
|
a0c1c8b4df | ||
|
|
2b3360f66a | ||
|
|
ffa94febc6 | ||
|
|
f8600d9fe4 | ||
|
|
afd479fa62 | ||
|
|
aaf878419d | ||
|
|
0c77467c7b | ||
|
|
a3905348f1 | ||
|
|
c6614912b1 | ||
|
|
46eab64834 | ||
|
|
1b0f64176d | ||
|
|
430cbffd25 | ||
|
|
ab01ce4fd6 | ||
|
|
2fb8f499e1 | ||
|
|
2bab917700 | ||
|
|
90a4a68eb5 | ||
|
|
166b683295 | ||
|
|
4f7345e475 | ||
|
|
79a3d416c1 | ||
|
|
ecabd4a73a | ||
|
|
29d02c1816 | ||
|
|
23f874f142 | ||
|
|
48176b6a72 | ||
|
|
2bb1113b43 | ||
|
|
2a13a63eb7 | ||
|
|
7ac70737dc | ||
|
|
9efce2ddb3 | ||
|
|
87fae9440c | ||
|
|
79f4c3ef75 | ||
|
|
06af2ea879 | ||
|
|
1131d25725 | ||
|
|
cb3891ac0c | ||
|
|
e0acea65b8 | ||
|
|
c6b1a84461 | ||
|
|
c86a19de08 | ||
|
|
e725b784c1 | ||
|
|
f84ecf579e | ||
|
|
7fb2fcc188 | ||
|
|
411cda4ad4 | ||
|
|
7eb6986f4d | ||
|
|
3d2ce52b8e | ||
|
|
7793efaeac | ||
|
|
25056b751e | ||
|
|
1c045d0732 | ||
|
|
c4c8d65798 | ||
|
|
be0b6ab35e | ||
|
|
99bcf712df | ||
|
|
8a91bccea3 | ||
|
|
686c137332 | ||
|
|
e66b21085b | ||
|
|
ffe5051d8b | ||
|
|
0066e75c39 | ||
|
|
1bb0523b83 | ||
|
|
4d272c4edb | ||
|
|
296a6c6211 | ||
|
|
43bde5aa99 | ||
|
|
cebeebe730 | ||
|
|
91cd6148e8 | ||
|
|
ec35462267 | ||
|
|
0b7a8a89bd | ||
|
|
dd9fb6c8a7 | ||
|
|
54f5b2acc1 | ||
|
|
d911673544 | ||
|
|
cc9e39825c | ||
|
|
4be5761a90 | ||
|
|
bafae7b120 | ||
|
|
d9c7a2ac08 | ||
|
|
d4cc1bd6ff | ||
|
|
83234af5b6 | ||
|
|
92ea96a41d | ||
|
|
915d01fa7d | ||
|
|
11ff5a8c62 | ||
|
|
6ff59d2392 | ||
|
|
3a5e37f34c | ||
|
|
6ea2d90104 | ||
|
|
078b03534d | ||
|
|
0cbe915ed5 | ||
|
|
7a0b4cdc82 | ||
|
|
22196f9de6 | ||
|
|
ef0a47c720 | ||
|
|
c2bd27cb58 | ||
|
|
c8d41b5e4a | ||
|
|
e5323d0c5a | ||
|
|
cc7188f450 | ||
|
|
59a55f7ebd | ||
|
|
13b73bcb33 | ||
|
|
90ed7ee409 | ||
|
|
36d14dbc99 | ||
|
|
7606c69961 | ||
|
|
f087117a33 | ||
|
|
02da52eb0d | ||
|
|
a7a4505b79 | ||
|
|
7f8dbb73db | ||
|
|
fe220afdde | ||
|
|
83eefd205e | ||
|
|
15d2c1f725 | ||
|
|
afb9ddb42e | ||
|
|
48725ea817 | ||
|
|
24600931ac | ||
|
|
ed7597e6b9 | ||
|
|
7f7b99ed7e | ||
|
|
d4366d3f18 | ||
|
|
cbb9a39bf1 | ||
|
|
cd5b0c22da | ||
|
|
34b9e15301 | ||
|
|
3abfd90e2f | ||
|
|
71248cfd25 | ||
|
|
e2406fc518 | ||
|
|
f65578f5a5 | ||
|
|
144d403c8b | ||
|
|
5978ed27f2 | ||
|
|
affa0a91ac | ||
|
|
745932738e | ||
|
|
d95b07fe0a | ||
|
|
0ad804fbc0 | ||
|
|
7736199189 | ||
|
|
c7f0106bf0 | ||
|
|
df0171d989 | ||
|
|
d1cade7bdb | ||
|
|
7d3bd99867 | ||
|
|
23f3593ae0 | ||
|
|
ff2bb36de4 | ||
|
|
d3a2392cfa | ||
|
|
701625d2f0 | ||
|
|
68194dc60b | ||
|
|
2fd53a59cb | ||
|
|
fb0ba230ea | ||
|
|
2872515117 | ||
|
|
bd05907dd8 | ||
|
|
9115226f00 | ||
|
|
857a7eabe2 | ||
|
|
048886c4e9 | ||
|
|
490198feee | ||
|
|
ace2b4dbf5 | ||
|
|
b48f23ab54 | ||
|
|
938050df0f | ||
|
|
20ad8de9f5 | ||
|
|
0662f9bbed | ||
|
|
60471f7f46 | ||
|
|
8b910b9111 | ||
|
|
2241263925 | ||
|
|
77100b462e | ||
|
|
9a816a090d | ||
|
|
d85b94df92 | ||
|
|
b603d70be8 | ||
|
|
013b7f77ef | ||
|
|
c2f0b1166c | ||
|
|
3095e0fbcb | ||
|
|
3917d95019 | ||
|
|
532f9a81dc | ||
|
|
39e36cf8c8 | ||
|
|
767f02a3ba | ||
|
|
f0f54efe17 | ||
|
|
695fc1dd4e | ||
|
|
ef9a0ab5fd | ||
|
|
5984b47ad9 | ||
|
|
dc5b5f72a3 | ||
|
|
be129f7a87 | ||
|
|
5f56d146c2 | ||
|
|
64e2e53629 | ||
|
|
ec08952674 | ||
|
|
4303f84152 | ||
|
|
616c56fa35 | ||
|
|
cf3930e863 | ||
|
|
78293c32d6 | ||
|
|
89e70c74cd | ||
|
|
ead80ac4cb | ||
|
|
b0cbce935e | ||
|
|
bbc80a8a77 | ||
|
|
2e57faf822 | ||
|
|
6be32747c7 | ||
|
|
56a265bd48 | ||
|
|
334a90bbe0 | ||
|
|
1cc85850bb | ||
|
|
f136bff547 | ||
|
|
f08d2ff8af | ||
|
|
cb92f260e4 | ||
|
|
cd51fcc293 | ||
|
|
932414dc32 | ||
|
|
db788333de | ||
|
|
488c16138a | ||
|
|
9674bc9d7a | ||
|
|
71336c1bc0 | ||
|
|
4d5d32c7ed | ||
|
|
357a59a1f7 | ||
|
|
3e2a39db2c | ||
|
|
3a29780d8f | ||
|
|
ccfc0327e0 | ||
|
|
405d076ce2 | ||
|
|
e07bba437b | ||
|
|
3ad96b5028 | ||
|
|
09c3c2c156 | ||
|
|
be59c78439 | ||
|
|
dfe5238f77 | ||
|
|
a54c00e823 | ||
|
|
4715d69596 | ||
|
|
926549e740 | ||
|
|
a588173605 | ||
|
|
ec54dc72c9 | ||
|
|
01b5f89725 | ||
|
|
b6efadad40 | ||
|
|
d40311da17 | ||
|
|
d93624bbf4 | ||
|
|
6b152827af | ||
|
|
e15a7f804e | ||
|
|
dc81b4331f | ||
|
|
fca1194f55 | ||
|
|
79e3c6eaf1 | ||
|
|
09ddda7dba | ||
|
|
fbeb658ae0 | ||
|
|
c5c206ea13 | ||
|
|
7ddbabc51e | ||
|
|
11437ac38f | ||
|
|
a13eedf556 | ||
|
|
bb92e52ae2 | ||
|
|
ca46fca7b1 | ||
|
|
5808e1a3d3 | ||
|
|
1354eb0d47 | ||
|
|
a448b62e9a | ||
|
|
fe85ce27fb | ||
|
|
936ff46f9c | ||
|
|
571897a23b | ||
|
|
f0378d8be0 | ||
|
|
ede5df5afe | ||
|
|
2bcc6075b7 | ||
|
|
88060ee2a4 | ||
|
|
38ae547f5c | ||
|
|
8341f4f31f | ||
|
|
141a8eac6a | ||
|
|
672309ba5f | ||
|
|
d8f12cdcc8 | ||
|
|
cb74abddc5 | ||
|
|
4c860417f5 | ||
|
|
2006b71250 | ||
|
|
664a971c46 | ||
|
|
05f0458658 | ||
|
|
6893535388 | ||
|
|
b79e962e75 | ||
|
|
820569ff4e | ||
|
|
c47dee5158 | ||
|
|
3bbdc9c140 | ||
|
|
337ce00b77 | ||
|
|
a25baf8d94 | ||
|
|
a85445083f | ||
|
|
a0ddaea1a3 | ||
|
|
a101a676b0 | ||
|
|
ca9a8f95de | ||
|
|
3cf39eec88 | ||
|
|
3d1f4a5336 | ||
|
|
8fc70f4d6d | ||
|
|
467fd4b6ba | ||
|
|
1cd3a95625 | ||
|
|
4ad93162e8 | ||
|
|
2628656537 | ||
|
|
d14ca4f53f | ||
|
|
dd64c805d7 | ||
|
|
072d53de9b | ||
|
|
a23ccd76fb | ||
|
|
38e6556a49 | ||
|
|
f6d363d313 | ||
|
|
e73eb4f59a | ||
|
|
aab20167fb | ||
|
|
075ee3119b | ||
|
|
35f79d3780 | ||
|
|
ddd91d8fec | ||
|
|
1087be7b0a | ||
|
|
dcd7f62968 | ||
|
|
cf69c29e8d | ||
|
|
7a5fb3ee25 | ||
|
|
819fd97261 | ||
|
|
93c6c2a0b3 | ||
|
|
cc33fd8b9c | ||
|
|
46f6e29efb | ||
|
|
c9fe605ee8 | ||
|
|
e2a70189b3 | ||
|
|
bd4d54e491 | ||
|
|
aa24fc2126 | ||
|
|
4f1f2ba7e7 | ||
|
|
81e77ba37b | ||
|
|
303e216b26 | ||
|
|
b58939cf27 | ||
|
|
68649070cd | ||
|
|
31e17f91e2 | ||
|
|
ad2b10116d | ||
|
|
6ab3d46529 | ||
|
|
23723ca05e | ||
|
|
13b09ee914 | ||
|
|
4197736fe2 | ||
|
|
059a71fd97 | ||
|
|
653b05298b | ||
|
|
2e01f2291e | ||
|
|
8dd8a6ac1c | ||
|
|
61a358b753 | ||
|
|
cd2f044ad8 | ||
|
|
8e2c70de93 | ||
|
|
484f362676 | ||
|
|
7b527483c2 | ||
|
|
eda0472f1e | ||
|
|
c0ca49c30a | ||
|
|
13ed32d67a | ||
|
|
78f622ead1 | ||
|
|
b9557dd70e | ||
|
|
18c17e48b1 | ||
|
|
9e3ece1818 | ||
|
|
11b8933345 | ||
|
|
8cc4e99199 | ||
|
|
13f524defb | ||
|
|
8a8e5c3011 | ||
|
|
8a7572d1b8 | ||
|
|
192ad1382c | ||
|
|
504b4a2ad8 | ||
|
|
e747b11d44 | ||
|
|
95dabbe63a | ||
|
|
1701b97f86 | ||
|
|
9cfa03d119 | ||
|
|
be44020b1c | ||
|
|
2e73594378 | ||
|
|
b903d84cac | ||
|
|
9763548fa8 | ||
|
|
6a7c29be51 | ||
|
|
2817090c8a | ||
|
|
fe67a2933a | ||
|
|
d63feec2e1 | ||
|
|
524aa1c79b | ||
|
|
c8a55c08c7 | ||
|
|
c24d165627 | ||
|
|
099f940751 | ||
|
|
2b249ef414 | ||
|
|
912392bee7 | ||
|
|
85c2591cfc | ||
|
|
74ef510288 | ||
|
|
d28a0e1b13 | ||
|
|
fead9075b6 | ||
|
|
7b2388290c | ||
|
|
41d87d3e27 | ||
|
|
fa35d54fbb | ||
|
|
23cd004f36 | ||
|
|
45cd764e80 | ||
|
|
ea394e872a | ||
|
|
dca18f4963 | ||
|
|
b963acc6da | ||
|
|
c7e17edbc7 | ||
|
|
f74445d7fd | ||
|
|
0dd79e77c4 | ||
|
|
422c7f2a3a | ||
|
|
d0971413ca | ||
|
|
753effce28 | ||
|
|
5bdaf8eaed | ||
|
|
8be6f286f1 | ||
|
|
b3393af19a | ||
|
|
d3632b2f04 | ||
|
|
0fe6631e50 | ||
|
|
69284ae297 | ||
|
|
10df225359 | ||
|
|
e4d9f1da59 | ||
|
|
a6538b5eca | ||
|
|
647b5c80f6 | ||
|
|
b0efef8ef1 | ||
|
|
13e67e23e1 | ||
|
|
c0c39276c7 | ||
|
|
4e78beebeb | ||
|
|
d88e1952a6 | ||
|
|
26f2f7511a | ||
|
|
8747abe3dd | ||
|
|
f7e64b9164 | ||
|
|
a58c0810fb | ||
|
|
d625ec94a5 | ||
|
|
5ae9b2038e | ||
|
|
6087a1bd40 | ||
|
|
2b15aad320 | ||
|
|
c90344ea47 | ||
|
|
f08d8797a0 | ||
|
|
a8a188b754 | ||
|
|
5387a7711c | ||
|
|
fd810d5e29 | ||
|
|
5e4fae1246 | ||
|
|
bd473960e4 | ||
|
|
d3fc6b955f | ||
|
|
635cea55e0 | ||
|
|
88fa0bca64 | ||
|
|
312444aa48 | ||
|
|
6d7923b7e3 | ||
|
|
109b187426 | ||
|
|
fd1ddf5ffc | ||
|
|
7d93211b9f | ||
|
|
61ac4dd356 | ||
|
|
0c35b75a9d | ||
|
|
d23fa1911e | ||
|
|
05d8c27577 | ||
|
|
121067e36d | ||
|
|
8cc826f5b3 | ||
|
|
0cd719474b | ||
|
|
fbf0d413a8 | ||
|
|
1968608018 | ||
|
|
ac51ccbf8c | ||
|
|
6a32f3f26d | ||
|
|
9cd1121c75 | ||
|
|
9b033842ab | ||
|
|
9d259f5455 | ||
|
|
e9e7bbf0c5 | ||
|
|
aeb313a72c | ||
|
|
fcb5513d68 | ||
|
|
42b5f32116 | ||
|
|
b2b4342c14 | ||
|
|
ecc6cc4605 | ||
|
|
3b1f08676e | ||
|
|
97b145f8b6 | ||
|
|
2dd029fb5d | ||
|
|
60423e71b8 | ||
|
|
9dc293ec04 | ||
|
|
f3618e6418 | ||
|
|
844e5b823f | ||
|
|
1fe0cd17ad | ||
|
|
0930090365 | ||
|
|
2632446ee5 | ||
|
|
7345096a91 | ||
|
|
2ba22bc53b | ||
|
|
7205312837 | ||
|
|
b5a44b1698 | ||
|
|
b2e9872645 | ||
|
|
40539c1f9d | ||
|
|
3c23d42ae4 | ||
|
|
5d429e1e76 | ||
|
|
9186119620 | ||
|
|
4af367fb5e | ||
|
|
2c72622d7e | ||
|
|
ca51bd4886 | ||
|
|
b836742f66 | ||
|
|
c344739de9 | ||
|
|
4bb068f056 | ||
|
|
0a055e892c | ||
|
|
d06ba31125 | ||
|
|
5d15ed1c15 | ||
|
|
b1c70ac2bb | ||
|
|
52bd48dbc3 | ||
|
|
a307862320 | ||
|
|
bfa68e4b88 | ||
|
|
d92a54045b | ||
|
|
e58b20ae5b | ||
|
|
986f7dc7d3 | ||
|
|
cf8004050c | ||
|
|
02aeaa2078 | ||
|
|
93fdf0e677 | ||
|
|
3a6e0c0f2f | ||
|
|
3daaad6d43 | ||
|
|
4e750bf1b0 | ||
|
|
e77831f1f9 | ||
|
|
fc3922996d | ||
|
|
74b0e6d70f | ||
|
|
890b3155b8 | ||
|
|
d992a8bdc3 | ||
|
|
27e310bb84 | ||
|
|
744522f3ca | ||
|
|
53eefa044a | ||
|
|
2badfead11 | ||
|
|
c1264169cc | ||
|
|
deb74ad9d0 | ||
|
|
4438949480 | ||
|
|
ffb90714d6 | ||
|
|
dd85ad7fce | ||
|
|
d71d82b690 | ||
|
|
48b3796f66 | ||
|
|
83b4dd9b36 | ||
|
|
39b4646e5d | ||
|
|
0fafe09544 | ||
|
|
a9de7944dd | ||
|
|
b8afa3f9c5 | ||
|
|
565e950072 | ||
|
|
b1a136561d | ||
|
|
f3eceda66b | ||
|
|
426ca5a22b | ||
|
|
b77419afc7 | ||
|
|
8758f6dc79 | ||
|
|
e0c4a3ec42 | ||
|
|
8c9582d0f7 | ||
|
|
75e30c1372 | ||
|
|
39201f3d4a | ||
|
|
b5e0b21f13 | ||
|
|
cf32e44926 | ||
|
|
f17dba64ce | ||
|
|
82403dba51 | ||
|
|
2fc37934cf | ||
|
|
f0891a36e8 | ||
|
|
d610c38c4e | ||
|
|
7b9c728de2 | ||
|
|
c117a76a04 | ||
|
|
08281059fb | ||
|
|
ef5c1f9c03 | ||
|
|
7c781ca0ff | ||
|
|
e737bf5e02 | ||
|
|
8ffbfbe60a | ||
|
|
b66c0efc2b | ||
|
|
44b19dd070 | ||
|
|
bb758a916a | ||
|
|
e414752976 | ||
|
|
3c9d6666cd | ||
|
|
5f1defc5a1 | ||
|
|
3d1ac6124e | ||
|
|
9d06106a78 | ||
|
|
37e62ac079 | ||
|
|
9d213b19b1 | ||
|
|
35427f8381 | ||
|
|
a8adcc07b7 | ||
|
|
17aebd29b5 | ||
|
|
9d10050325 | ||
|
|
77d6939411 | ||
|
|
43602031b8 | ||
|
|
41ef9caf40 | ||
|
|
d083f54edd | ||
|
|
7fbfec3441 | ||
|
|
ab73f0d19f | ||
|
|
8904cc20c4 | ||
|
|
2a2987b17a | ||
|
|
1eeb9a4a81 | ||
|
|
dc76fb9051 | ||
|
|
d74a04d6df | ||
|
|
9c2e2bb0f8 | ||
|
|
0d3e90f4a5 | ||
|
|
ca09405491 | ||
|
|
77a928c78a | ||
|
|
4b9a457e64 | ||
|
|
c82809a0b9 | ||
|
|
0b7a138abd | ||
|
|
bc3077e429 | ||
|
|
62c02dab24 | ||
|
|
ee93fc00e6 | ||
|
|
4d6291d7ff | ||
|
|
47a1bd985d | ||
|
|
443386489c | ||
|
|
9e6faffb49 | ||
|
|
fde28efdc5 | ||
|
|
0c90262e8a | ||
|
|
f0c7d57c41 | ||
|
|
9f0fa8a390 | ||
|
|
88a1e96820 | ||
|
|
2c06293f24 | ||
|
|
bc552ff635 | ||
|
|
faa95dd555 | ||
|
|
19c818ed9b | ||
|
|
b861d854a9 | ||
|
|
764e5a2adf | ||
|
|
e5f0fe6e76 | ||
|
|
820d5a88ac | ||
|
|
08e2f0fbf1 | ||
|
|
44d3317dd2 | ||
|
|
f48811ff44 | ||
|
|
79fdecce32 | ||
|
|
1cbb2eca1b | ||
|
|
592fe81a47 | ||
|
|
389662b8c9 | ||
|
|
f8c54492f1 | ||
|
|
e816cd969c | ||
|
|
896eadd77b | ||
|
|
27ecfad1d6 | ||
|
|
fa4a2680f9 | ||
|
|
e97b585659 | ||
|
|
65af445ebb | ||
|
|
a1a53012fb | ||
|
|
168281f862 | ||
|
|
132d2bf89f | ||
|
|
0a23950747 | ||
|
|
ef28b3ab71 | ||
|
|
968051109a | ||
|
|
4365a76169 | ||
|
|
ac01843e27 | ||
|
|
449ac06070 | ||
|
|
fe98c140ac | ||
|
|
712f66d3ee | ||
|
|
f0d82776b7 | ||
|
|
12c5a0237b | ||
|
|
0bc14fa477 | ||
|
|
ef73204960 | ||
|
|
270bb925f5 | ||
|
|
3cb471c46c | ||
|
|
7c3d21e31f | ||
|
|
69a5d42d99 | ||
|
|
7d442b4c9a | ||
|
|
b556f2ad86 | ||
|
|
567700635c | ||
|
|
2582159a26 | ||
|
|
e17ede1649 | ||
|
|
59ea01339d | ||
|
|
45eeb8c5f9 | ||
|
|
156c96fc42 | ||
|
|
648f6954f4 | ||
|
|
337e88254e | ||
|
|
c1d37852c5 | ||
|
|
55358fc420 | ||
|
|
bb439b0107 | ||
|
|
1165101867 | ||
|
|
ebd5815845 | ||
|
|
461f8b9b47 | ||
|
|
c50c5f42be | ||
|
|
8a8030c99b | ||
|
|
f6400abaec | ||
|
|
f0aef9782a | ||
|
|
86e5af333f | ||
|
|
4ca10cfcb4 | ||
|
|
c5d5311121 | ||
|
|
b844f2ddf8 | ||
|
|
d3a4db9e37 | ||
|
|
1910715033 | ||
|
|
cdb9dd2f1f | ||
|
|
e2998acc9d | ||
|
|
bb6fa6f7bd | ||
|
|
039b6674c4 | ||
|
|
e7ac63adb3 | ||
|
|
4f33eb4078 | ||
|
|
11ba3489c3 | ||
|
|
31ac5e4974 | ||
|
|
0eabc7b69e | ||
|
|
b547e51719 | ||
|
|
4d4e362c61 | ||
|
|
07c5256440 | ||
|
|
9973546472 | ||
|
|
1ea5c1aa53 | ||
|
|
e726ae9da6 | ||
|
|
d0c65a04e7 | ||
|
|
3d69468cfd | ||
|
|
a6808b4646 | ||
|
|
3154c7b72d | ||
|
|
8aa1654a3f | ||
|
|
95e63b7b7e | ||
|
|
28d841d114 | ||
|
|
fe3a0ea39a | ||
|
|
3a3aed7469 | ||
|
|
b6e84b460e | ||
|
|
9150c31666 | ||
|
|
2b9caf2cb3 | ||
|
|
fb22df4850 | ||
|
|
d7cf27033c | ||
|
|
f05d14a944 | ||
|
|
486fb05f73 | ||
|
|
3b6fa728b7 | ||
|
|
d94afc207c | ||
|
|
0e69e059fe | ||
|
|
4e20dad924 | ||
|
|
05547c5c0d | ||
|
|
41f9302fce | ||
|
|
b51b26cb14 | ||
|
|
c26d449630 | ||
|
|
d2b60b0090 | ||
|
|
21aae4496c | ||
|
|
8f25f0d460 | ||
|
|
7ff58b6b18 | ||
|
|
e31e2730c9 | ||
|
|
da5c484025 | ||
|
|
cee6e51cbb | ||
|
|
d4d3ea1d23 | ||
|
|
291d39383d | ||
|
|
c101a21010 | ||
|
|
5ab468be42 | ||
|
|
5e8cfb9ee3 | ||
|
|
226c3653ac | ||
|
|
c21785add4 | ||
|
|
63c2a299a5 | ||
|
|
3882d024cb | ||
|
|
6408ea007f | ||
|
|
c01e9a5862 | ||
|
|
5f62c76a2f | ||
|
|
af49225221 | ||
|
|
cb08646fc1 | ||
|
|
2f535f011e | ||
|
|
cdd435f042 | ||
|
|
47e10e7209 | ||
|
|
d622078ef9 | ||
|
|
10c1f7f59a | ||
|
|
dd7d1d3109 | ||
|
|
66fd58b8ee | ||
|
|
7da72fcc89 | ||
|
|
66f2761f67 | ||
|
|
fdc8bf19e0 | ||
|
|
c92ca6fb93 | ||
|
|
092e0f1e60 | ||
|
|
d0bad4213a | ||
|
|
0c1fe0cf80 | ||
|
|
cc79aa87b3 | ||
|
|
db1dedbb0a | ||
|
|
9795460468 | ||
|
|
155181d899 | ||
|
|
071e02f278 | ||
|
|
4c2ac48337 | ||
|
|
b154d84330 | ||
|
|
05f4a4e482 | ||
|
|
01a8fdda68 | ||
|
|
2abe23c5e6 | ||
|
|
b91d902791 | ||
|
|
df6fa3f7c5 | ||
|
|
10c451f3b7 | ||
|
|
5342440fd6 | ||
|
|
7237867f15 | ||
|
|
88d94fde3f | ||
|
|
348e263ebe | ||
|
|
e45dbb4f2c | ||
|
|
4bdfb47fc3 | ||
|
|
525132cf11 | ||
|
|
6655a6feaf | ||
|
|
7ff0463587 | ||
|
|
1609631431 | ||
|
|
fe3c3d731b | ||
|
|
14a0be050e | ||
|
|
030dd348b4 | ||
|
|
e809d821a1 | ||
|
|
fd25b5a8e5 | ||
|
|
4c2553a482 | ||
|
|
c68f841fdb | ||
|
|
b56a0fb90c | ||
|
|
c6488622eb | ||
|
|
e40d9df2ec | ||
|
|
455ece8cba | ||
|
|
d9633d5b06 | ||
|
|
d52cb725d1 | ||
|
|
f7aab6f332 | ||
|
|
b3c44598b0 | ||
|
|
702817e351 | ||
|
|
81ac6cf333 | ||
|
|
e38dfc1472 | ||
|
|
5500e943dd | ||
|
|
e57709a67f | ||
|
|
2e75597365 | ||
|
|
a12fd42a8e | ||
|
|
5e07e3c4e0 | ||
|
|
2b1c1094a6 | ||
|
|
7a0ec043a1 | ||
|
|
423b99cc5e | ||
|
|
a853f77c00 | ||
|
|
1d153834d9 | ||
|
|
d718d876fc | ||
|
|
db4b841f57 | ||
|
|
89e6555e2a | ||
|
|
3ab93654f5 | ||
|
|
7fdc82a630 | ||
|
|
1196423f02 | ||
|
|
6f4e1465bc | ||
|
|
15e653a8ae | ||
|
|
b102d0d3b9 | ||
|
|
47dfdf1e0b | ||
|
|
08a753b4c9 | ||
|
|
63dadb37c6 | ||
|
|
9f8ce4cc09 | ||
|
|
2e2d3c26b4 | ||
|
|
ad66a6db30 | ||
|
|
eae8fde294 | ||
|
|
530acf4662 | ||
|
|
e52ff16733 | ||
|
|
e3d1956ba3 | ||
|
|
c54f3fc1d8 | ||
|
|
4f74046e62 | ||
|
|
82e52e951a | ||
|
|
d1f7f436f8 | ||
|
|
ed62452853 | ||
|
|
a39a3ddd55 | ||
|
|
3cde8738c2 | ||
|
|
53a27a4306 | ||
|
|
ef16abb41a | ||
|
|
d3f3bb07e0 | ||
|
|
ac63489325 | ||
|
|
cb1f62d4ff | ||
|
|
75cb3bcaf8 | ||
|
|
30eba2dadf | ||
|
|
18650cda63 | ||
|
|
e8280f7e42 | ||
|
|
a91ded81b0 | ||
|
|
cd88249598 | ||
|
|
3a792e9a8e | ||
|
|
42fda5eaf7 | ||
|
|
56b6260348 | ||
|
|
65dfe90526 | ||
|
|
021fbb7d37 | ||
|
|
19eb7baaa2 | ||
|
|
7be8865755 | ||
|
|
b8cc8818ee | ||
|
|
eddc3091a7 | ||
|
|
7f0b99c25e | ||
|
|
63d4bde2d9 | ||
|
|
a2307d45fd | ||
|
|
0e87eb69b5 | ||
|
|
e422b42ba6 | ||
|
|
b4ab654f11 | ||
|
|
d4b29a30b5 | ||
|
|
0b62abbca0 | ||
|
|
a142d39fc9 | ||
|
|
fa67466d20 | ||
|
|
92c6a9d51d | ||
|
|
737d7353a4 | ||
|
|
2c181de6a3 | ||
|
|
95368faccd | ||
|
|
ea7e99f7d3 | ||
|
|
60e8fcdc47 | ||
|
|
3f1968837f | ||
|
|
9cd8e88ab4 | ||
|
|
59f38273e3 | ||
|
|
88a0d072b0 | ||
|
|
b5879f7360 | ||
|
|
1f3ae7b725 | ||
|
|
ab12614d9b | ||
|
|
d69a47a46d | ||
|
|
6e036356df | ||
|
|
635f52d499 | ||
|
|
097420a66f | ||
|
|
aab28aea8c | ||
|
|
5053bc9a6d | ||
|
|
09c42ed0b4 | ||
|
|
23ac3572cf | ||
|
|
23d2b93506 | ||
|
|
f2d6351211 | ||
|
|
1a15109f4b | ||
|
|
79b5def9ba | ||
|
|
c552916266 | ||
|
|
e928d03ec7 | ||
|
|
c375d6fa10 | ||
|
|
16be157add | ||
|
|
950c80a108 | ||
|
|
01c60fa07e | ||
|
|
a45e42e0a5 | ||
|
|
b0c92e28dd | ||
|
|
31abc2d1bd | ||
|
|
b646939113 | ||
|
|
b00fb7671e | ||
|
|
312d500a36 | ||
|
|
beb84c200d | ||
|
|
b8c97e3f70 | ||
|
|
4d6aa1a4f9 | ||
|
|
d933a22154 | ||
|
|
a2b28806b1 | ||
|
|
73b7123906 | ||
|
|
cfb4e481b4 | ||
|
|
f4da18cc3f | ||
|
|
9f845bb73b | ||
|
|
98d124860c | ||
|
|
6f35ced052 | ||
|
|
ad281664c3 | ||
|
|
9cf3c80fba | ||
|
|
dd04d6367b | ||
|
|
754a29a709 | ||
|
|
df7b6a3674 | ||
|
|
b72a0593c6 | ||
|
|
f3820c32f2 | ||
|
|
d2ee1b3fa8 | ||
|
|
320816fd99 | ||
|
|
69e68807bf | ||
|
|
80fd303081 | ||
|
|
709d16eb75 | ||
|
|
3eb711fbf8 | ||
|
|
806eb326d1 | ||
|
|
e5afb6b0c6 | ||
|
|
3d76415af2 | ||
|
|
46a7c9662e | ||
|
|
d03f47a9c7 | ||
|
|
582fe4c8b1 | ||
|
|
7d3e3ae358 | ||
|
|
e1d7ea6302 | ||
|
|
c2fa968835 | ||
|
|
6740a0df28 | ||
|
|
0015c8934d | ||
|
|
7f134072f6 | ||
|
|
6311c2078f | ||
|
|
cceeda0588 | ||
|
|
9af876ccaa | ||
|
|
360417c5fc | ||
|
|
d83ec66775 | ||
|
|
2eac22d626 | ||
|
|
721b027000 | ||
|
|
3fb4f16db9 | ||
|
|
83968977a1 | ||
|
|
60bb74cbb0 | ||
|
|
37d260a519 | ||
|
|
7c3e2cbc70 | ||
|
|
cd0a635535 | ||
|
|
f7a98ed7d1 | ||
|
|
6c2b1becdf | ||
|
|
8ec5aebd3c | ||
|
|
3acd7667bc | ||
|
|
256206af09 | ||
|
|
5d004cde02 | ||
|
|
35049c26f3 | ||
|
|
63940b1d2f | ||
|
|
09d08baecc | ||
|
|
2283a77104 | ||
|
|
3628f1e18d | ||
|
|
e11ee0fa07 | ||
|
|
919790e808 | ||
|
|
8f68ef56e2 | ||
|
|
f13d3e7b35 | ||
|
|
1f5c862168 | ||
|
|
6f6636103e | ||
|
|
921b447b02 | ||
|
|
e51e56e825 | ||
|
|
f15a8421f9 | ||
|
|
97c3460af8 | ||
|
|
80e8392be0 | ||
|
|
5ba45867f7 | ||
|
|
1cffbaa9b8 | ||
|
|
c03438ba23 | ||
|
|
7a6883457b | ||
|
|
1548ab662a | ||
|
|
0455e81b4c | ||
|
|
c14b5b6b21 | ||
|
|
30b6082ce5 | ||
|
|
86e8446e42 | ||
|
|
2eb76a5fc8 | ||
|
|
7f851205a0 | ||
|
|
66cf29ccd3 | ||
|
|
ad3b022fc1 | ||
|
|
8c01aac391 | ||
|
|
f538fc3a76 | ||
|
|
ddbc8e2484 | ||
|
|
7e676e74e9 | ||
|
|
a8bfdc13ed | ||
|
|
724ce0ef1f | ||
|
|
d04abe0e48 | ||
|
|
c5a55f1e85 | ||
|
|
41386a91c8 | ||
|
|
b99bdb68df | ||
|
|
bb3b893bd3 | ||
|
|
cf5e38e78f | ||
|
|
21c1631825 | ||
|
|
2a33c5c7a0 | ||
|
|
4ea976b887 | ||
|
|
1c1dc3d3e8 | ||
|
|
82768a5538 | ||
|
|
1790225997 | ||
|
|
056c5f10cc | ||
|
|
4abcd167ba | ||
|
|
692a34e427 | ||
|
|
bd510f395c | ||
|
|
e860a0c15a | ||
|
|
a88184bd9a | ||
|
|
aa7ddcdea8 | ||
|
|
789ed4a2d0 | ||
|
|
e876a577cb | ||
|
|
000811e2ab | ||
|
|
d04356b9a5 | ||
|
|
ddc847f9d7 | ||
|
|
1bda445cdb | ||
|
|
13e21c0e7e | ||
|
|
91ec911213 | ||
|
|
72969e1bb3 | ||
|
|
446ab3b5b7 | ||
|
|
f351a486f2 | ||
|
|
5bb31e3282 | ||
|
|
f824461db9 | ||
|
|
c8b52f6e96 | ||
|
|
7397b68ec0 | ||
|
|
a922d542f6 | ||
|
|
5a223bf7cd | ||
|
|
08e3196b0c | ||
|
|
b35be93fa9 | ||
|
|
ec77e14ead | ||
|
|
d8a21933d6 | ||
|
|
9d67f8aedf | ||
|
|
6b99449e21 | ||
|
|
6df85b4779 | ||
|
|
0d147dd557 | ||
|
|
390adb3e26 | ||
|
|
575ed1140f | ||
|
|
d058a2ef17 | ||
|
|
df53f1f78d | ||
|
|
04692e5fc4 | ||
|
|
47df89bdd8 | ||
|
|
033ef5c9dc | ||
|
|
18609e296f | ||
|
|
226594f1d2 | ||
|
|
4c70d2aea0 | ||
|
|
5aedc8341a | ||
|
|
ab09fd24d1 | ||
|
|
e589464fc0 | ||
|
|
c403440287 | ||
|
|
937301997a | ||
|
|
f8d0e96d95 | ||
|
|
7fb43311a7 | ||
|
|
50ba8926cd | ||
|
|
bfd14493b1 | ||
|
|
80eb7fdf11 | ||
|
|
2339a65ff7 | ||
|
|
159d305fcf | ||
|
|
f2acccb426 | ||
|
|
f1cccbe3e0 | ||
|
|
f80fc6cdd5 | ||
|
|
4fcec20446 | ||
|
|
6db3198ea3 | ||
|
|
f882c7d654 | ||
|
|
3d0d93c625 | ||
|
|
bb4cc18c55 | ||
|
|
f43cd585c7 | ||
|
|
e61d307e4c | ||
|
|
9b8c966702 | ||
|
|
fa606c1665 | ||
|
|
93b3ca4b66 | ||
|
|
7b246312a8 | ||
|
|
054be248cb | ||
|
|
b21083db1f | ||
|
|
075a28f89f | ||
|
|
3a0fce6e29 | ||
|
|
d095330b22 | ||
|
|
52a065ab0d | ||
|
|
e33148e9f1 | ||
|
|
c4be6e120a | ||
|
|
dcdffce051 | ||
|
|
0bf9b808d0 | ||
|
|
925d900aa6 | ||
|
|
300b82b0da | ||
|
|
109c754f3c | ||
|
|
c2368fbb64 | ||
|
|
91813968aa | ||
|
|
42bee0eee8 | ||
|
|
188b8c447f | ||
|
|
5336fdb46a | ||
|
|
3d379033c5 | ||
|
|
66ffef4080 | ||
|
|
268632d6da | ||
|
|
b778f0d918 | ||
|
|
e0bb0138cb | ||
|
|
fb4ed29834 | ||
|
|
2473df2275 | ||
|
|
87d5bb092f | ||
|
|
eadaf179af | ||
|
|
f288d0519c | ||
|
|
c55551be54 | ||
|
|
fb73401800 | ||
|
|
ab226469a9 | ||
|
|
c97e17b494 | ||
|
|
e209591019 | ||
|
|
6de63ddbd8 | ||
|
|
3f246e2687 | ||
|
|
0b77c8f934 | ||
|
|
5f53c8fbe1 | ||
|
|
ddcfa36a90 | ||
|
|
a0de510093 | ||
|
|
69e0be6db6 | ||
|
|
ba92ecad36 | ||
|
|
d08edc2ea3 | ||
|
|
31101bc788 | ||
|
|
75f1c5461f | ||
|
|
8198f1dbcb | ||
|
|
a45d63bdf8 | ||
|
|
e163c5f691 | ||
|
|
0c5cdbae17 | ||
|
|
2aa3bdcb3f | ||
|
|
e20f419adc | ||
|
|
01adc5087c | ||
|
|
1ef05b36e1 | ||
|
|
54b019f83d | ||
|
|
7e9c24d4b9 | ||
|
|
3be48761a6 | ||
|
|
761fd4d6db | ||
|
|
65dc4be419 | ||
|
|
cc91951eff | ||
|
|
252297fecd | ||
|
|
6ba6b55d46 | ||
|
|
d729e3fffa | ||
|
|
a4b5f5f9f1 | ||
|
|
1a22dbb313 | ||
|
|
154997432f | ||
|
|
159199b1ab | ||
|
|
09dc88ba39 | ||
|
|
c78bb3d24d | ||
|
|
610721c16a | ||
|
|
cd5c7dba32 | ||
|
|
9db28868cb | ||
|
|
5ba570feca | ||
|
|
e7c73e8860 | ||
|
|
2dbae9a3b7 | ||
|
|
38831baac2 | ||
|
|
67b7336a97 | ||
|
|
1ba6fe0571 | ||
|
|
97a6cb580f | ||
|
|
100d46fa9b | ||
|
|
ef3385192f | ||
|
|
1be00ea3c8 | ||
|
|
ca9f44967d | ||
|
|
27bb395542 | ||
|
|
92f09f424f | ||
|
|
90e1b6dc2a | ||
|
|
f680473916 | ||
|
|
3b7803efa7 | ||
|
|
bbff52e937 | ||
|
|
95e8954c38 | ||
|
|
81bacaf6bb | ||
|
|
0a702f6897 | ||
|
|
515e90b48e | ||
|
|
8f5eed778a | ||
|
|
bca8a4bf16 | ||
|
|
d8241d1531 | ||
|
|
36ce7bd00d | ||
|
|
6365b55343 | ||
|
|
997dcb8312 | ||
|
|
01f00a67e6 | ||
|
|
8dd1b9d5a7 | ||
|
|
7aaee46d4a | ||
|
|
c99c23b9da | ||
|
|
b81e168b2a | ||
|
|
b1974eb24f | ||
|
|
f7c928e3a2 | ||
|
|
8b145089ac | ||
|
|
6271a22058 | ||
|
|
929d741916 | ||
|
|
250bf95e11 | ||
|
|
6475571781 | ||
|
|
fb31c8862b | ||
|
|
1c404348a0 | ||
|
|
9cd62b236a | ||
|
|
7086531e08 | ||
|
|
90c7b5d02d | ||
|
|
f874a5f7a2 | ||
|
|
beb4fa828f | ||
|
|
fe7db04b84 | ||
|
|
b363b893e4 | ||
|
|
6baa1b42d6 | ||
|
|
a5af399e56 | ||
|
|
05feba39bf | ||
|
|
6534a6eda4 | ||
|
|
723a89c840 | ||
|
|
344cb15fb5 | ||
|
|
e239389768 | ||
|
|
bfb4a91f92 | ||
|
|
4200669f5b | ||
|
|
f62db8a7fe | ||
|
|
4b31d91beb | ||
|
|
f95791a723 | ||
|
|
77d6f94280 | ||
|
|
6ed1c0815a | ||
|
|
ee3570b6dd | ||
|
|
22fda0c7fe | ||
|
|
9b43cbc0b7 | ||
|
|
04103dea7f | ||
|
|
90b43d828e | ||
|
|
8f2e7191e5 | ||
|
|
db2bdd33a2 | ||
|
|
f2ca3696fa | ||
|
|
b0f06e512d | ||
|
|
2b97d25afb | ||
|
|
fe0a13c4f0 | ||
|
|
5b4a3e3a38 | ||
|
|
2d44c967ef | ||
|
|
2772a446bd | ||
|
|
b0970142d5 | ||
|
|
9a206df105 | ||
|
|
fcefdd8eb5 | ||
|
|
327ecd3eb8 | ||
|
|
0a793b9222 | ||
|
|
eb0b2529d0 | ||
|
|
5349d2f2dd | ||
|
|
0367a79706 | ||
|
|
0caf50fde8 | ||
|
|
46bef30dad | ||
|
|
30299724fd | ||
|
|
f5958fa722 | ||
|
|
801dcd0ffe | ||
|
|
10cce8002f | ||
|
|
d0ad3c7ad4 | ||
|
|
2dd8003588 | ||
|
|
0ec7582cd1 | ||
|
|
fbf609c1ef | ||
|
|
990605c23e | ||
|
|
3c4a52809c | ||
|
|
2e57372115 | ||
|
|
d6fc65cbf8 | ||
|
|
9f5a142d15 | ||
|
|
868850951f | ||
|
|
ea05ecc49a | ||
|
|
555270c1a3 | ||
|
|
07320c7a05 | ||
|
|
4f59ca778e | ||
|
|
a894269b46 | ||
|
|
c74cd2d454 | ||
|
|
41452dbb4c | ||
|
|
1277818b23 | ||
|
|
c33cfd29b7 | ||
|
|
5bd815e66f | ||
|
|
6b78438d13 | ||
|
|
0e67f9449f | ||
|
|
020ad2ec7a | ||
|
|
dec913c4e9 | ||
|
|
c7533010bd | ||
|
|
131ee0e84b | ||
|
|
015fc54cef | ||
|
|
d1b40c280b | ||
|
|
46f4e317f4 | ||
|
|
6a83735cc1 | ||
|
|
bfb7e22ae7 | ||
|
|
400b0d09d3 | ||
|
|
8f78abb19f | ||
|
|
6849a341c3 | ||
|
|
a270fcdbf9 | ||
|
|
800c1e5802 | ||
|
|
760ebb3814 | ||
|
|
e89462e126 | ||
|
|
f9cabb0bd2 | ||
|
|
ee89a6ce12 | ||
|
|
1f0faf2c8e | ||
|
|
34b37ce45c | ||
|
|
a151cab066 | ||
|
|
c0ab3dc48a | ||
|
|
7d9ba7ef64 | ||
|
|
257c19662c | ||
|
|
4a819afe18 | ||
|
|
e45793826e | ||
|
|
00b663e425 | ||
|
|
920a08c5ce | ||
|
|
88ec0706da | ||
|
|
2dab8ab386 | ||
|
|
406bc5d78e | ||
|
|
96cde2ae07 | ||
|
|
964968ded0 | ||
|
|
3804ecd4d6 | ||
|
|
46a0db21ec | ||
|
|
3c19bb969d | ||
|
|
6ff59ca8cd | ||
|
|
3da4331784 | ||
|
|
301f0341b4 | ||
|
|
970d689184 | ||
|
|
8f6b4036e9 | ||
|
|
20dbbdf81e | ||
|
|
e9ed916550 | ||
|
|
299124877e | ||
|
|
f3bf340101 | ||
|
|
6f4d247715 | ||
|
|
66fbe640ef | ||
|
|
3f0bed4899 | ||
|
|
76577d21a9 | ||
|
|
cacdb4a4ce | ||
|
|
d1dc240a73 | ||
|
|
ebb8f7b6ff | ||
|
|
760ff033cb | ||
|
|
6343812006 | ||
|
|
b7a145e56f | ||
|
|
65b9619762 | ||
|
|
208f50ce64 | ||
|
|
56de784054 | ||
|
|
7a9f54443b | ||
|
|
7999e6ed56 | ||
|
|
9dd4f107b6 | ||
|
|
767dbebe54 | ||
|
|
f19acdee4b | ||
|
|
ba6b34c292 | ||
|
|
bdd9e83418 | ||
|
|
e2da6a1f51 | ||
|
|
f9ca8f52c5 | ||
|
|
54d229f746 | ||
|
|
2682a719b0 | ||
|
|
8fb3d58f68 | ||
|
|
a15ce736ca | ||
|
|
edb0056488 | ||
|
|
4a5586efad | ||
|
|
c974f65a30 | ||
|
|
0421e2e366 | ||
|
|
f94aa44104 | ||
|
|
57e10326d8 | ||
|
|
4be58aa6d8 | ||
|
|
87831eaf1a | ||
|
|
0b563cc2b8 | ||
|
|
fe77c50e2c | ||
|
|
ccfdb93ae4 | ||
|
|
15a2c5f362 | ||
|
|
f1e064f600 | ||
|
|
43b41fec3d | ||
|
|
146bf51021 | ||
|
|
841e5e7557 | ||
|
|
fbce4307b9 | ||
|
|
446d2dd69d | ||
|
|
6e952c11d8 | ||
|
|
a60857a801 | ||
|
|
de3931b199 | ||
|
|
b0f31ebd1b | ||
|
|
71c1ba9377 | ||
|
|
03d33c8ad8 | ||
|
|
41927218ec | ||
|
|
cd7ec1cf18 | ||
|
|
e912a51cf2 | ||
|
|
e066257278 | ||
|
|
d33cfe7259 | ||
|
|
63354b91c3 | ||
|
|
21718b01b9 | ||
|
|
4762e39c77 | ||
|
|
6a35c3d062 | ||
|
|
816022eb9d | ||
|
|
bdb5af0490 | ||
|
|
2e4c6df22c | ||
|
|
d7a1b6267e | ||
|
|
a74420a064 | ||
|
|
83e543bcec | ||
|
|
492ec85f20 | ||
|
|
6bd09626b1 | ||
|
|
453927e72f | ||
|
|
aedab1e68e | ||
|
|
42cd6a8875 | ||
|
|
32330b12b7 | ||
|
|
1886fae681 | ||
|
|
0ede461f25 | ||
|
|
7d1e7521bc | ||
|
|
7497d68b48 | ||
|
|
0716e84529 | ||
|
|
e6168a813a | ||
|
|
db3489a02b | ||
|
|
80d8e49b2a | ||
|
|
fa58726147 | ||
|
|
9eefffd872 | ||
|
|
a47b3ca0a5 | ||
|
|
9372727053 | ||
|
|
f5e5dd7a36 | ||
|
|
3f947fcfee | ||
|
|
e60dea0a42 | ||
|
|
47a5d6a202 | ||
|
|
37e6a68509 | ||
|
|
fb456bb2b9 | ||
|
|
22821d3ab0 | ||
|
|
55a972050a | ||
|
|
1edf380836 | ||
|
|
3402da561c | ||
|
|
0783d3e6f9 | ||
|
|
f3b85ad7f3 | ||
|
|
8e56e876db | ||
|
|
4fec3b7f32 | ||
|
|
70ea36db50 | ||
|
|
433125716e | ||
|
|
fc473c97e6 | ||
|
|
4be4494ad4 | ||
|
|
b669990a8a | ||
|
|
16ed0c15a5 | ||
|
|
7bfa59fd7e | ||
|
|
1f11b2af97 | ||
|
|
06db8961e7 | ||
|
|
035097b5af | ||
|
|
8fdd15f584 | ||
|
|
57a7cf8451 | ||
|
|
ef50ae0ca3 | ||
|
|
0769faef2f | ||
|
|
a3a022119c | ||
|
|
2c19fe9c8e | ||
|
|
b70dc22f2c | ||
|
|
8f4d822e5e | ||
|
|
0677548653 | ||
|
|
3996567462 | ||
|
|
4c666aa6a4 | ||
|
|
4b4b9f5d8f | ||
|
|
a30d6179a4 | ||
|
|
ed3b5e5e81 | ||
|
|
d69095adbb | ||
|
|
26ef578f08 | ||
|
|
e9a6913869 | ||
|
|
fc1383324a | ||
|
|
035f82f605 | ||
|
|
a6036e2a13 | ||
|
|
940f481454 | ||
|
|
c2975809b9 | ||
|
|
46e4919245 | ||
|
|
256f60311a | ||
|
|
0d5e58c2c7 | ||
|
|
7c84d07fc3 | ||
|
|
db52f5b242 | ||
|
|
7b5e66713e | ||
|
|
947fc3032d | ||
|
|
76b85372b5 | ||
|
|
db63453c63 | ||
|
|
d0811e6a22 | ||
|
|
a0b09a6b78 | ||
|
|
4ae2cd8a51 | ||
|
|
de52782b21 | ||
|
|
3916dd5502 | ||
|
|
249c54b280 | ||
|
|
1854196132 | ||
|
|
a959c95231 | ||
|
|
a632192ebc | ||
|
|
9ee2031948 | ||
|
|
44cf9fd3fe | ||
|
|
a3b12b1931 | ||
|
|
adc006f2db | ||
|
|
ff3614fcce | ||
|
|
c1e0bc79a2 | ||
|
|
07d34298a0 | ||
|
|
8a8477656d | ||
|
|
02138c86a4 | ||
|
|
df087b40c3 | ||
|
|
0b835903ab | ||
|
|
9e61ccfedc | ||
|
|
9906e0e168 | ||
|
|
e347062ab1 | ||
|
|
7663f8386a | ||
|
|
87d109b8a5 | ||
|
|
b0bbca04d6 | ||
|
|
d1e066c609 | ||
|
|
d852119e5e | ||
|
|
136ac303b4 | ||
|
|
96a4b4033f | ||
|
|
aed4d0bbee | ||
|
|
9d51307574 | ||
|
|
34eee5c961 | ||
|
|
12bb214276 | ||
|
|
3346a5155a | ||
|
|
4d2eb4a57b | ||
|
|
c756bde213 | ||
|
|
f910b66145 | ||
|
|
78890eea6b | ||
|
|
affa54f1e1 | ||
|
|
07c96ea9b6 | ||
|
|
fa4888aece | ||
|
|
e6be30aa5a | ||
|
|
2375d0fbc1 | ||
|
|
54396e8aeb | ||
|
|
c775719525 | ||
|
|
bd29b5cb1b | ||
|
|
57cf32b6be | ||
|
|
f8d953afe2 | ||
|
|
1a5f9e16e6 | ||
|
|
76e60d7cfc | ||
|
|
1a42d2ef65 | ||
|
|
c0d0d7d42a | ||
|
|
1088b3ce90 | ||
|
|
45f3986f78 | ||
|
|
01a878d827 | ||
|
|
4c15be3d4e | ||
|
|
f8c6125258 | ||
|
|
6c8f879661 | ||
|
|
145a1b65b5 | ||
|
|
96a05dce47 | ||
|
|
eaebac7e6b | ||
|
|
963b1b3f10 | ||
|
|
f36f570310 | ||
|
|
e3f2170f00 | ||
|
|
30d42c6cef | ||
|
|
689fa2c63e | ||
|
|
6156c0dc6c | ||
|
|
9e6530e146 | ||
|
|
bddfaae9af | ||
|
|
4d5c6e2ec6 | ||
|
|
f1997a64dd | ||
|
|
5ff0f93027 | ||
|
|
e2d84bfc3b | ||
|
|
5448441c8f | ||
|
|
42be0af5a2 | ||
|
|
d7dea2ad14 | ||
|
|
00dcaee48f | ||
|
|
696725b5c3 | ||
|
|
abe696b2f4 | ||
|
|
e5bdd70a51 | ||
|
|
66cd998f4d | ||
|
|
babfde7318 | ||
|
|
228b20e801 | ||
|
|
c606259a8b | ||
|
|
8cbf3a7ebb | ||
|
|
8bf684f0d8 | ||
|
|
01548cdf57 | ||
|
|
ec01f1c80b | ||
|
|
1183c8b548 | ||
|
|
937dfe042e | ||
|
|
c3397a00eb | ||
|
|
bf908f43a6 | ||
|
|
7b228f07b4 | ||
|
|
a744092d9a | ||
|
|
26be84780a | ||
|
|
6caa5b7ac1 | ||
|
|
4e9c328be0 | ||
|
|
71cc21845a | ||
|
|
2860d030a3 | ||
|
|
3b190388b2 | ||
|
|
bd893d9fa6 | ||
|
|
dd80d202ad | ||
|
|
5620e453b6 | ||
|
|
606ce93169 | ||
|
|
50afdacd39 | ||
|
|
ee5c0fe787 | ||
|
|
b557b0ef93 | ||
|
|
b744dfb79b | ||
|
|
b92f63e176 | ||
|
|
ba594dd5ac | ||
|
|
c48f840f68 | ||
|
|
44ed820abe | ||
|
|
633d5238ef | ||
|
|
dbb2712119 | ||
|
|
2955b2c231 | ||
|
|
db637883cb | ||
|
|
9a18116750 | ||
|
|
ad01fb0ba7 | ||
|
|
accd9ee1ce | ||
|
|
eee04b65ae | ||
|
|
ce0f587c53 | ||
|
|
e80e4a60cc | ||
|
|
13e8d0dfe3 | ||
|
|
60a9274dcb | ||
|
|
f9755eec58 | ||
|
|
9a2371d49f | ||
|
|
6aba2d44b6 | ||
|
|
5f79730c20 | ||
|
|
544d8acead | ||
|
|
831f17d570 | ||
|
|
4e4982966b | ||
|
|
e4065e7c52 | ||
|
|
ea45baa457 | ||
|
|
b827779c7c | ||
|
|
3004dbc684 | ||
|
|
9030bfdc2b | ||
|
|
a0fb876a48 | ||
|
|
ce67a1bd1c | ||
|
|
00c4ac3314 | ||
|
|
24851d10c6 | ||
|
|
1ec3bac95d | ||
|
|
ddaf862170 | ||
|
|
6cab1f2e9a | ||
|
|
ed9741e3cd | ||
|
|
6efe47f69c | ||
|
|
363d1bc316 | ||
|
|
30a54790a6 | ||
|
|
2aa302f69a | ||
|
|
36d7806b1c | ||
|
|
6263975c03 | ||
|
|
67cfc35faf | ||
|
|
7a3bfa655a | ||
|
|
0ddac854a5 | ||
|
|
68901d469a | ||
|
|
a21c0a8c1a | ||
|
|
f685929814 | ||
|
|
0832fac57e | ||
|
|
3e1123fcaa | ||
|
|
f245df2d09 | ||
|
|
379f4b3535 | ||
|
|
d530c165da | ||
|
|
943e234a3d | ||
|
|
dbd8c39fe2 | ||
|
|
b4cdae8bd8 | ||
|
|
768309d72e | ||
|
|
84066c7203 | ||
|
|
3fec14f95e | ||
|
|
a9bbfdcf82 | ||
|
|
756e6e526f | ||
|
|
5b2625ab0e | ||
|
|
282ba96efc | ||
|
|
52f11a77b9 | ||
|
|
e97d14c7e4 | ||
|
|
3fab389f05 | ||
|
|
5230d062c8 | ||
|
|
f164335e4e | ||
|
|
681daeea21 | ||
|
|
0eaa596536 | ||
|
|
17188ab8fb | ||
|
|
7eea5fab42 | ||
|
|
b6fecfadff | ||
|
|
11939bc4b6 | ||
|
|
fdf6f3722a | ||
|
|
b93bf1d187 | ||
|
|
fd50b3ad8d | ||
|
|
53e79696af | ||
|
|
f094aeb0b1 | ||
|
|
32fca807c3 | ||
|
|
17134351bb | ||
|
|
9efa8f7a6f | ||
|
|
62d173424a | ||
|
|
a83dedf2a4 | ||
|
|
ba2e7d4d15 | ||
|
|
6de38385e2 | ||
|
|
1a698a72b2 | ||
|
|
0fcfe2e540 | ||
|
|
86e9667773 | ||
|
|
64a043a18f | ||
|
|
438dd74166 | ||
|
|
4cfb62575b | ||
|
|
9f6436ea08 | ||
|
|
09215f8923 | ||
|
|
4acb2bae03 | ||
|
|
9f1b68e2b6 | ||
|
|
740425409b | ||
|
|
faeefa8927 | ||
|
|
aa8d3207a4 | ||
|
|
44e22b611d | ||
|
|
901aba2ff9 | ||
|
|
21fd86156d | ||
|
|
863baecaee | ||
|
|
4a95e27574 | ||
|
|
ac4a62a5c9 | ||
|
|
4aa58d1202 | ||
|
|
9859361e36 | ||
|
|
c69ef90249 | ||
|
|
14bec1cc5a | ||
|
|
8543cf28c9 | ||
|
|
74ad0023ee | ||
|
|
e30341163b | ||
|
|
0ec1b0f011 | ||
|
|
c8aed60e05 | ||
|
|
3094322edb | ||
|
|
a9ac0a24eb | ||
|
|
f1815da106 | ||
|
|
ddd7c21db7 | ||
|
|
27000bdb86 | ||
|
|
03f443cf4c | ||
|
|
196c08a15f | ||
|
|
52f941c748 | ||
|
|
8cfeab405b | ||
|
|
b94e2f536d | ||
|
|
8370e6b9f0 | ||
|
|
382f6ab574 | ||
|
|
3abf473c8e | ||
|
|
fd16da8061 | ||
|
|
f6708e7124 | ||
|
|
a7c7c14854 | ||
|
|
db873c8dc2 | ||
|
|
3b7e038064 | ||
|
|
447b09f400 | ||
|
|
c5ff48b9a5 | ||
|
|
fed1df53f0 | ||
|
|
29cb62aaf3 | ||
|
|
b9f49c26f0 | ||
|
|
6915213eb1 | ||
|
|
4d6977b301 | ||
|
|
8f86674fc1 | ||
|
|
228d73a39c | ||
|
|
dcf1b0adae | ||
|
|
990f99767d | ||
|
|
761a01ad9f | ||
|
|
ca7d50d9ff | ||
|
|
4ca3e25995 | ||
|
|
3b13b6e6f5 | ||
|
|
c9f9c65732 | ||
|
|
154e649f56 | ||
|
|
2ab206b6c1 | ||
|
|
5b0431daf9 | ||
|
|
cfd01e80fe | ||
|
|
fdc1ceea62 | ||
|
|
69647023e0 | ||
|
|
beccc55788 | ||
|
|
2b9227c0f1 | ||
|
|
a13cb94214 | ||
|
|
c1d6d13e7b | ||
|
|
1a53806642 | ||
|
|
06c0394b67 | ||
|
|
cce4aaaaa3 | ||
|
|
b5c1c5477d | ||
|
|
4f1d01fc73 | ||
|
|
94861608cf | ||
|
|
96753bbc94 | ||
|
|
72dab7bb1e | ||
|
|
f47e9977a5 | ||
|
|
c6294f7cb6 | ||
|
|
83c5336004 | ||
|
|
2f91a2b7f3 | ||
|
|
8e43055140 | ||
|
|
95ebf24944 | ||
|
|
d39b72c9eb | ||
|
|
f3f7b1a742 | ||
|
|
1df413019f | ||
|
|
f0d5bc94cd | ||
|
|
c817d3ccb6 | ||
|
|
c45f9ee894 | ||
|
|
44b2619d79 | ||
|
|
8be2cc083f | ||
|
|
5644c18917 | ||
|
|
f980bdadf5 | ||
|
|
6e1fb500eb | ||
|
|
730b8c52e2 | ||
|
|
0030f7fbf6 | ||
|
|
eb29f7f1e9 | ||
|
|
9aed3e6f45 | ||
|
|
1d3153cfbd | ||
|
|
ae6feef3e5 | ||
|
|
404bfc1576 | ||
|
|
dd1631461d | ||
|
|
5127c77ebf | ||
|
|
1ed33ce910 | ||
|
|
b1ccf8644b | ||
|
|
7bdb410b5d | ||
|
|
a532a3e042 | ||
|
|
44e22becae | ||
|
|
5ffb94749d | ||
|
|
3eca2a1611 | ||
|
|
5fbb7a7fbb | ||
|
|
7efe48f522 | ||
|
|
91afdac46d | ||
|
|
ec32ff4b5f | ||
|
|
2328a2cced | ||
|
|
836e903156 | ||
|
|
e019200b85 | ||
|
|
aecb49b403 | ||
|
|
b51a757e34 | ||
|
|
f5b6ab9c48 | ||
|
|
b5ad2ffcdc | ||
|
|
f3eb63d25c | ||
|
|
f9b54f305a | ||
|
|
4ae6616a2b | ||
|
|
b733e5561a | ||
|
|
8f483db05e | ||
|
|
ed9b6932e8 | ||
|
|
938c019cc6 | ||
|
|
123e599202 | ||
|
|
237b09d886 | ||
|
|
ffad058c7f | ||
|
|
4a2f0c2165 | ||
|
|
a813484a4f | ||
|
|
b6cfecf25f | ||
|
|
7652a117cd | ||
|
|
f3583c2873 | ||
|
|
f978be8b90 | ||
|
|
cf2f806f30 | ||
|
|
abf99ece5e | ||
|
|
47b1338d32 | ||
|
|
5568e0eeaf | ||
|
|
baf2b507ec | ||
|
|
67fecc69fe | ||
|
|
f2375f0156 | ||
|
|
394384facc | ||
|
|
dc3d6f8cfe | ||
|
|
17212f16ea | ||
|
|
293d9f7d8d | ||
|
|
3850b19425 | ||
|
|
01eef47487 | ||
|
|
ddc9d3a464 | ||
|
|
d553a5f669 | ||
|
|
d39c86207b | ||
|
|
d9120d8249 | ||
|
|
a4c332e136 | ||
|
|
26db77219d | ||
|
|
f7b44e552b | ||
|
|
1b898d2afa | ||
|
|
976ec78247 | ||
|
|
6ee87bacf9 | ||
|
|
9bdf9a4da7 | ||
|
|
dadc6a6c41 | ||
|
|
7e962a8a92 | ||
|
|
9990983510 | ||
|
|
018c2d24da | ||
|
|
985af2ba08 | ||
|
|
33f7c58146 | ||
|
|
4f831e9a3d | ||
|
|
f873307240 | ||
|
|
1e7dc7dff9 | ||
|
|
a5f6f32083 | ||
|
|
b21823cc95 | ||
|
|
a95c56f20e | ||
|
|
0ed7ead8df | ||
|
|
e7231271d1 | ||
|
|
4ff66c2b15 | ||
|
|
0c0c287418 | ||
|
|
404b20fa03 | ||
|
|
4eacfa8305 | ||
|
|
cd01fd3bd2 | ||
|
|
48f9466b3e | ||
|
|
64a90d190a | ||
|
|
67334071a6 | ||
|
|
db5167d76a | ||
|
|
254877421c | ||
|
|
a9eba1d728 | ||
|
|
102e0c1cf9 | ||
|
|
28f1ed42d9 | ||
|
|
5c6de2fddb | ||
|
|
63cdb84b80 | ||
|
|
c057909e81 | ||
|
|
d6cf863687 | ||
|
|
e6b820213a | ||
|
|
7cda58a7cf | ||
|
|
0dc8a42555 | ||
|
|
9c30c60881 | ||
|
|
18ec6fb2dd | ||
|
|
4c7d6e9724 | ||
|
|
aca0388c3e | ||
|
|
a8be7c327d | ||
|
|
2de573e2c3 | ||
|
|
528a46f4ed | ||
|
|
65cfb4910f | ||
|
|
464818fb7f | ||
|
|
dac549f0b6 | ||
|
|
3a46bf3a44 | ||
|
|
65e5ad4f9f | ||
|
|
a14dcb4e8a | ||
|
|
11e1836096 | ||
|
|
39da73c42e | ||
|
|
139f2a5ae4 | ||
|
|
48f4886d0d | ||
|
|
511f2c0b8c | ||
|
|
879b93ef44 | ||
|
|
eb0c689e88 | ||
|
|
880e1c189d | ||
|
|
1c52911757 | ||
|
|
2b98842f8d | ||
|
|
e1acf907db | ||
|
|
0d84a92096 | ||
|
|
ac135253eb | ||
|
|
6b2831e525 | ||
|
|
b9facc0b6e | ||
|
|
a582473cea | ||
|
|
453e2b3456 | ||
|
|
738a63a48e | ||
|
|
8c1660e20f | ||
|
|
489d0a9ecf | ||
|
|
b11e66aeff | ||
|
|
fd456f2445 | ||
|
|
4579f172d8 | ||
|
|
28c6a0db9b | ||
|
|
834ad93094 | ||
|
|
f2ebc76001 | ||
|
|
928d937a7b | ||
|
|
ef38eb9724 | ||
|
|
741aae9b7f | ||
|
|
068d606557 | ||
|
|
3ff4a69945 | ||
|
|
4f703fe8f8 | ||
|
|
37bb9611f9 | ||
|
|
0b2fef7642 | ||
|
|
8ca9e1261d | ||
|
|
88e3190aad | ||
|
|
a0125f81e9 | ||
|
|
d06aa7796e | ||
|
|
ce36a65994 | ||
|
|
ec07a63f1e | ||
|
|
d4f05089cd | ||
|
|
b6fd8314ca | ||
|
|
059c367d89 | ||
|
|
197ef6861f | ||
|
|
bf3430b49b | ||
|
|
8c7aa8f578 | ||
|
|
7c9fde7a31 | ||
|
|
449769b229 | ||
|
|
ccc761df3a | ||
|
|
5fba04627b | ||
|
|
917437b31e | ||
|
|
57acf4013d | ||
|
|
35b3be92eb | ||
|
|
cadb3d033a | ||
|
|
490b8b12f1 | ||
|
|
20bc2fdf00 | ||
|
|
960daaca23 | ||
|
|
a1bae08a67 | ||
|
|
a0d3ca0bf3 | ||
|
|
801f244d46 | ||
|
|
ee6f8cf972 | ||
|
|
e839761ae9 | ||
|
|
fa0f51a7ed | ||
|
|
93a1aacaca | ||
|
|
a7198b3313 | ||
|
|
51fbe0fc19 | ||
|
|
8543bb187f | ||
|
|
94c9c0cebc | ||
|
|
5e6103b38b | ||
|
|
ea62c8833b | ||
|
|
a493ace766 | ||
|
|
c9255c33b8 | ||
|
|
e02d15a170 | ||
|
|
d0862e7be8 | ||
|
|
4f02abac02 | ||
|
|
89fa48880e | ||
|
|
c542b86200 | ||
|
|
266a0556ce | ||
|
|
01c656791a | ||
|
|
3cb903569c | ||
|
|
7d97fec3cf | ||
|
|
5f8c90bac6 | ||
|
|
0b1a97832c | ||
|
|
b2c346657a | ||
|
|
d67dbd986f | ||
|
|
e1bec6cc2f | ||
|
|
d2469c6473 | ||
|
|
f8558a020a | ||
|
|
831719381b | ||
|
|
bedf0285b0 | ||
|
|
1a22991617 | ||
|
|
3835051fcb | ||
|
|
fe0042df6a | ||
|
|
ca4c9d4bad | ||
|
|
047dd31c11 | ||
|
|
138c7e2ae0 | ||
|
|
096de774b1 | ||
|
|
20e72f18fc | ||
|
|
cdb58b727f | ||
|
|
45d76ee28a | ||
|
|
4ea5e67d44 | ||
|
|
ab58d091f2 | ||
|
|
fadb925d5b | ||
|
|
5ce6c283ea | ||
|
|
e4bc98209d | ||
|
|
f5a0a85fa4 | ||
|
|
d738a34275 | ||
|
|
e4efbb47f2 | ||
|
|
5fd2899fd2 | ||
|
|
5f9aea7a22 | ||
|
|
4db7ac1668 | ||
|
|
b570ca81ef | ||
|
|
078a7bf8b5 | ||
|
|
bb71c52d01 | ||
|
|
70df00f7df | ||
|
|
dc8c84028d | ||
|
|
b0d5a3e3f7 | ||
|
|
a1d39ad051 | ||
|
|
8077c3e892 | ||
|
|
24ce9d4b40 | ||
|
|
d4205fdf89 | ||
|
|
1677bf5311 | ||
|
|
fd5ecfc64c | ||
|
|
3aafd31992 | ||
|
|
bb61396c10 | ||
|
|
e704303f3b | ||
|
|
ed3b698839 | ||
|
|
ca601b8fc8 | ||
|
|
76aa0c71a2 | ||
|
|
76e628d63f | ||
|
|
73a8f57f84 | ||
|
|
6810a65661 | ||
|
|
088ea83808 | ||
|
|
c5206d0f52 | ||
|
|
47d18e5deb | ||
|
|
b94c9f75d3 | ||
|
|
2c88652fbd | ||
|
|
bc95391e93 | ||
|
|
52b70ffb24 | ||
|
|
d4166ffa5d | ||
|
|
38b5ef3748 | ||
|
|
0b97855eeb | ||
|
|
b3b57ae534 | ||
|
|
affdff7a3d | ||
|
|
218d2735c5 | ||
|
|
5b086b9356 | ||
|
|
c5972c006a | ||
|
|
5b4d41b1ed | ||
|
|
9f26c35630 | ||
|
|
525b0cb840 | ||
|
|
7a1a4b0058 | ||
|
|
49e78fdbae | ||
|
|
64ff2cb641 | ||
|
|
30972db5ad | ||
|
|
f0bbcb5f40 | ||
|
|
642cc94691 | ||
|
|
08fd1d4248 | ||
|
|
ab268af7b8 | ||
|
|
cebad7aab3 | ||
|
|
289cbf62f7 | ||
|
|
760ee3aa28 | ||
|
|
ff730a1bc4 | ||
|
|
df596d799d | ||
|
|
d3b2ca0e3a | ||
|
|
fcfdf3e8ef | ||
|
|
0441b80216 | ||
|
|
00d4ae9828 | ||
|
|
cdd7c1e735 | ||
|
|
ce7438265d | ||
|
|
425166ff49 | ||
|
|
db5564ac1e | ||
|
|
2927edf16a | ||
|
|
cfafa1e73d | ||
|
|
8c90dc4032 | ||
|
|
f1a7c25fa3 | ||
|
|
4fa2afa87e | ||
|
|
a0bdc08633 | ||
|
|
5e0ce8cfb4 | ||
|
|
2098bdc869 | ||
|
|
19f0f0bbf0 | ||
|
|
033ec29d60 | ||
|
|
09a1ddf97b | ||
|
|
4d9e6d41a2 | ||
|
|
b3daf9aa08 | ||
|
|
8a54924407 | ||
|
|
319f295984 | ||
|
|
185ccae95f | ||
|
|
452047cb88 | ||
|
|
ea1dbabb9d | ||
|
|
8c71ac83b7 | ||
|
|
b931420266 | ||
|
|
8e0cf0f142 | ||
|
|
37f96db8d5 | ||
|
|
ca4556a804 | ||
|
|
15f33cbb9c | ||
|
|
5ff48cc1ff | ||
|
|
6aca885ced | ||
|
|
432e1c2d2b | ||
|
|
d864d43aab | ||
|
|
5f607acda2 | ||
|
|
51d8c85540 | ||
|
|
0af77077b5 | ||
|
|
7ce49e4e82 | ||
|
|
5b89eaed6f | ||
|
|
01a458b5bc | ||
|
|
657b1ceddf | ||
|
|
2a74787d8e | ||
|
|
a8ecd1a645 | ||
|
|
e2b6f88686 | ||
|
|
7d33323a97 | ||
|
|
3fd984396e | ||
|
|
5ab9a2b974 | ||
|
|
c61149f480 | ||
|
|
df11160e7a | ||
|
|
5bfbb8091d | ||
|
|
26b9d60dba | ||
|
|
7d8259f58c | ||
|
|
1fd6e08e5c | ||
|
|
369b40b7a0 | ||
|
|
b669401332 | ||
|
|
a718895fd7 | ||
|
|
5d349a963d | ||
|
|
43c0c7944d | ||
|
|
213cb4f85c | ||
|
|
078440a815 | ||
|
|
0bfe224b66 | ||
|
|
7d57e8a993 | ||
|
|
e70efc898c | ||
|
|
2ba139ebaf | ||
|
|
1aa6a37b08 | ||
|
|
d573dd53fd | ||
|
|
7c4d8a41e8 | ||
|
|
ff0d32fa20 | ||
|
|
b7767e41d5 | ||
|
|
1c76d0d325 | ||
|
|
65eea67b30 | ||
|
|
d01ab52c7c | ||
|
|
8f15d60677 | ||
|
|
76807ec931 | ||
|
|
2aa62f43bb | ||
|
|
ece5038130 | ||
|
|
0d882868c8 | ||
|
|
91e8b2ba6f | ||
|
|
f3f5c11c5e | ||
|
|
eec541840e | ||
|
|
7abd438787 | ||
|
|
be1db1b4cb | ||
|
|
af9c53794e | ||
|
|
c2771a075e | ||
|
|
03480488a1 | ||
|
|
e9c3c7841f | ||
|
|
634e777cfd | ||
|
|
41308d86a6 | ||
|
|
c7bc50f968 | ||
|
|
6991fa8ea9 | ||
|
|
2c5c0ddc75 | ||
|
|
ec73527df9 | ||
|
|
7384485fe1 | ||
|
|
27e695d4f1 | ||
|
|
9215afb462 | ||
|
|
ae64a8cbd3 | ||
|
|
bc88d0d642 | ||
|
|
6b85159119 | ||
|
|
3f8583fbe1 | ||
|
|
605ae739b8 | ||
|
|
636fb820ea | ||
|
|
458f347e1e | ||
|
|
7f5d58ca6d | ||
|
|
7cc2582cee | ||
|
|
e8ea28d085 | ||
|
|
a7352d8c98 | ||
|
|
b62d01a629 | ||
|
|
b253ee70ab | ||
|
|
0908de4c3b | ||
|
|
bbe8e14e2b | ||
|
|
301a460f65 | ||
|
|
1131292908 | ||
|
|
aeaf10a979 | ||
|
|
10e93a47dc | ||
|
|
0d0ab5fe81 | ||
|
|
073b6a2bb9 | ||
|
|
11298992d2 | ||
|
|
84b702fa3f | ||
|
|
86cca50a15 | ||
|
|
b01e33f68b | ||
|
|
b1ac0ad440 | ||
|
|
dce6f46b17 | ||
|
|
59f8ae5fe7 | ||
|
|
b1888e58ad | ||
|
|
373e5aad4d | ||
|
|
bd784f9f50 | ||
|
|
2e6d05636d | ||
|
|
8dd8e5dbce | ||
|
|
0f126ffd95 | ||
|
|
0d72ac7187 | ||
|
|
6256d07bb7 | ||
|
|
c840ba48a2 | ||
|
|
e52e2b21a3 | ||
|
|
53caed6d38 | ||
|
|
e4293af219 | ||
|
|
386df3db2a | ||
|
|
765ad24b39 | ||
|
|
ad8a3375db | ||
|
|
6ff40cd0f4 | ||
|
|
b1d7ad8a69 | ||
|
|
780185fa5c | ||
|
|
2f739228b3 | ||
|
|
3e78dbd595 | ||
|
|
e7489557a6 | ||
|
|
fccf54b295 | ||
|
|
6e65f848ca | ||
|
|
3783f98671 | ||
|
|
1a9c3b4d37 | ||
|
|
782f4634e4 | ||
|
|
be5766f266 | ||
|
|
6b4bfee7d9 | ||
|
|
14924b635a | ||
|
|
26f34edc83 | ||
|
|
788c5be092 | ||
|
|
74f6ce33ac | ||
|
|
915bdd1efb | ||
|
|
9fb947b544 | ||
|
|
93266b93b2 | ||
|
|
220816d039 | ||
|
|
7792605ab9 | ||
|
|
5b80a22157 | ||
|
|
30d9d190e1 | ||
|
|
e1acd4e4e6 | ||
|
|
b500a22d59 | ||
|
|
49dc47c8cf | ||
|
|
84962b34e7 | ||
|
|
7cf459e9f5 | ||
|
|
87e7905be1 | ||
|
|
ea24d40f84 | ||
|
|
11ab985bc6 | ||
|
|
e18f300fae | ||
|
|
9b2c951d71 | ||
|
|
fc0851922f | ||
|
|
52de76edd5 | ||
|
|
6ca3acd0d5 | ||
|
|
03f949b669 | ||
|
|
4028bab31c | ||
|
|
572f3c01c6 | ||
|
|
b799aae67f | ||
|
|
e2ef29a021 | ||
|
|
045801449a | ||
|
|
464771baec | ||
|
|
af1cf46d1e | ||
|
|
9a365940e6 | ||
|
|
e75c2e603c | ||
|
|
c0eb4088d8 | ||
|
|
fc01b6a099 | ||
|
|
c2d0167c8a | ||
|
|
75e05e2d2e | ||
|
|
45e1bbcafa | ||
|
|
a23eaac730 | ||
|
|
9d1ab22010 | ||
|
|
d904323f88 | ||
|
|
018ec1eccf | ||
|
|
5b2dc84c4a | ||
|
|
8269c8ad42 | ||
|
|
a3947ea0c9 | ||
|
|
61f215e552 | ||
|
|
389118e785 | ||
|
|
a90c9931dd | ||
|
|
edd7eaca95 | ||
|
|
4aa4f9beb3 | ||
|
|
dfac17daeb | ||
|
|
e94e5c0a97 | ||
|
|
fa4b8ab130 | ||
|
|
2ab1ba9341 | ||
|
|
4f80c7c334 | ||
|
|
84c0697f1c | ||
|
|
1960b49a1e | ||
|
|
0e5bcbef47 | ||
|
|
6317a48bb9 | ||
|
|
59af914d8d | ||
|
|
154dbb3994 | ||
|
|
7d42658387 | ||
|
|
9ecf6babd5 | ||
|
|
564549d198 | ||
|
|
4f70de322d | ||
|
|
1a5429a723 | ||
|
|
af552f6d45 | ||
|
|
20eabbd54f | ||
|
|
96cdd25ac5 | ||
|
|
7230f7a12e | ||
|
|
b5495f30f0 | ||
|
|
cf0454a208 | ||
|
|
b5acd7ca87 | ||
|
|
8ec2783860 | ||
|
|
d26fc8ad7f | ||
|
|
eb6aac4f5e | ||
|
|
5bbae5e23b | ||
|
|
a0625b0624 | ||
|
|
ea43bcf8a1 | ||
|
|
9ee5b6cbe3 | ||
|
|
533fe896ff | ||
|
|
91c8b29145 | ||
|
|
d97e1dc955 | ||
|
|
bbb263b39a | ||
|
|
4c720ebd82 | ||
|
|
775fab7374 | ||
|
|
a7795438a6 | ||
|
|
7534e27835 | ||
|
|
c68edd162c | ||
|
|
fdadd238b4 | ||
|
|
0dbc900c9a | ||
|
|
4b4a52f550 | ||
|
|
57a65cee3e | ||
|
|
a731c338de | ||
|
|
f24b1350ab | ||
|
|
9034d8be58 | ||
|
|
32c852b48c | ||
|
|
456588ddc3 | ||
|
|
217a54c8b1 | ||
|
|
7162a23dd3 | ||
|
|
7070cecaf2 | ||
|
|
fc93a80429 | ||
|
|
389209ff02 | ||
|
|
7e5c504357 | ||
|
|
6b6511b73f | ||
|
|
0833566d96 | ||
|
|
d593cf53a9 | ||
|
|
fd5ec65d35 | ||
|
|
c46f46e4e3 | ||
|
|
60f6c76ad6 | ||
|
|
c97ef1431b | ||
|
|
524f7138cc | ||
|
|
c17ec013ca | ||
|
|
17d1245db1 | ||
|
|
146be2a559 | ||
|
|
23803851fe | ||
|
|
240b5808b9 | ||
|
|
01c1146b40 | ||
|
|
d7863b9a91 | ||
|
|
cfb9b463d7 | ||
|
|
b9f750d132 | ||
|
|
da8a5d79a8 | ||
|
|
0123e311c0 | ||
|
|
ca760a237a | ||
|
|
2ae226e594 | ||
|
|
1c940653d4 | ||
|
|
67b5551eea | ||
|
|
ce4b04014b | ||
|
|
4393db02bc | ||
|
|
22ed8009c5 | ||
|
|
186e1fdcf9 | ||
|
|
607d634078 | ||
|
|
9032642ca7 | ||
|
|
f355c89fc4 | ||
|
|
b7f30382e1 | ||
|
|
7df157520d | ||
|
|
bbf2530cca | ||
|
|
1cf6d337d3 | ||
|
|
6ed05a47c5 | ||
|
|
8f362eafea | ||
|
|
d692c83d14 | ||
|
|
10ed5dc433 | ||
|
|
aa90e50f42 | ||
|
|
b30bc2f781 | ||
|
|
50970e3d54 | ||
|
|
4066de04a1 | ||
|
|
2707d1515d | ||
|
|
60c5cc24bc | ||
|
|
c53da67e1a | ||
|
|
116011fdcf | ||
|
|
779201b286 | ||
|
|
7e2d0fcb6b | ||
|
|
c070839a28 | ||
|
|
336fac2250 | ||
|
|
1235ab6434 | ||
|
|
e569dd8023 | ||
|
|
bbdd6595bf | ||
|
|
2b1d890b74 | ||
|
|
a51057753c | ||
|
|
f6f1849102 | ||
|
|
ae48cf0c7a | ||
|
|
8a69f4969e | ||
|
|
82c4a47a21 | ||
|
|
62cd5f25a4 | ||
|
|
072b022514 | ||
|
|
a34b9ab200 | ||
|
|
039077084a | ||
|
|
f56c71c0f1 | ||
|
|
631c1fa921 | ||
|
|
a8fe3f2797 | ||
|
|
3f1963b583 | ||
|
|
2f0b5a323f | ||
|
|
6033828209 | ||
|
|
5c42da0a84 | ||
|
|
62a6a1c8ec | ||
|
|
7e11ff07bf | ||
|
|
decbbe973c | ||
|
|
2eddfb8a1d | ||
|
|
78372d1bde | ||
|
|
f407089855 | ||
|
|
25163db2bf | ||
|
|
0fd6406158 | ||
|
|
b0e8e6c2eb | ||
|
|
a0211f2b27 | ||
|
|
5dbb6a7559 | ||
|
|
5a458b6dbe | ||
|
|
5069422e64 | ||
|
|
deb790d434 | ||
|
|
bd39dce7e6 | ||
|
|
75b998a6b0 | ||
|
|
0e64787583 | ||
|
|
307a2346b6 | ||
|
|
3dcde7ed06 | ||
|
|
03ff180b83 | ||
|
|
51e95010d8 | ||
|
|
024e07c2d9 | ||
|
|
218c6a38cb | ||
|
|
10141c3dfc | ||
|
|
319d53f7cf | ||
|
|
b9ccb10287 | ||
|
|
2478dbb677 | ||
|
|
2246aa8fce | ||
|
|
02544f7186 | ||
|
|
b6fca25a10 | ||
|
|
63fe35d5c5 | ||
|
|
c5656534c4 | ||
|
|
854a2f063e | ||
|
|
5600952f39 | ||
|
|
3331e419e5 | ||
|
|
fbc50419db | ||
|
|
9eae5a6b24 | ||
|
|
605bef55c6 | ||
|
|
22062a3c45 | ||
|
|
cd4c9a47a3 | ||
|
|
b0d2838c90 | ||
|
|
29f1829cdb | ||
|
|
62daa90590 | ||
|
|
3d31ee1b67 | ||
|
|
3283447ae6 | ||
|
|
a09a7b7290 | ||
|
|
f7e9806139 |
1440 changed files with 218213 additions and 97011 deletions
|
|
@ -4,22 +4,19 @@ AlignConsecutiveAssignments: 'true'
|
||||||
AlignConsecutiveDeclarations: 'false'
|
AlignConsecutiveDeclarations: 'false'
|
||||||
AlignEscapedNewlines: Right
|
AlignEscapedNewlines: Right
|
||||||
AlignOperands: 'false'
|
AlignOperands: 'false'
|
||||||
AlignTrailingComments: 'true'
|
AlignTrailingComments: 'false'
|
||||||
AllowAllParametersOfDeclarationOnNextLine: 'false'
|
AllowAllParametersOfDeclarationOnNextLine: 'false'
|
||||||
AllowShortBlocksOnASingleLine: 'false'
|
AllowShortBlocksOnASingleLine: 'false'
|
||||||
AllowShortCaseLabelsOnASingleLine: 'true'
|
AllowShortCaseLabelsOnASingleLine: 'true'
|
||||||
AllowShortFunctionsOnASingleLine: None
|
AllowShortFunctionsOnASingleLine: None
|
||||||
AllowShortIfStatementsOnASingleLine: 'true'
|
|
||||||
AllowShortLoopsOnASingleLine: 'false'
|
AllowShortLoopsOnASingleLine: 'false'
|
||||||
AlwaysBreakAfterReturnType: None
|
AlwaysBreakAfterReturnType: None
|
||||||
AlwaysBreakBeforeMultilineStrings: 'false'
|
AlwaysBreakBeforeMultilineStrings: 'false'
|
||||||
AlwaysBreakTemplateDeclarations: 'true'
|
|
||||||
BinPackArguments: 'true'
|
BinPackArguments: 'true'
|
||||||
BinPackParameters: 'true'
|
BinPackParameters: 'true'
|
||||||
BreakAfterJavaFieldAnnotations: 'true'
|
BreakAfterJavaFieldAnnotations: 'true'
|
||||||
BreakBeforeBinaryOperators: None
|
BreakBeforeBinaryOperators: None
|
||||||
BreakBeforeBraces: Stroustrup
|
BreakBeforeBraces: Allman
|
||||||
BreakBeforeInheritanceComma: 'false'
|
|
||||||
BreakBeforeTernaryOperators: 'false'
|
BreakBeforeTernaryOperators: 'false'
|
||||||
BreakConstructorInitializers: BeforeColon
|
BreakConstructorInitializers: BeforeColon
|
||||||
BreakStringLiterals: 'false'
|
BreakStringLiterals: 'false'
|
||||||
|
|
@ -56,4 +53,4 @@ SpacesInParentheses: 'false'
|
||||||
SpacesInSquareBrackets: 'false'
|
SpacesInSquareBrackets: 'false'
|
||||||
Standard: Cpp11
|
Standard: Cpp11
|
||||||
TabWidth: '2'
|
TabWidth: '2'
|
||||||
UseTab: Never
|
UseTab: Never
|
||||||
|
|
|
||||||
1
.core/build
Submodule
1
.core/build
Submodule
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 9c9346d5494688a78ea573f3bc0547ad12b9be2a
|
||||||
83
.core/build.yaml
Normal file
83
.core/build.yaml
Normal file
|
|
@ -0,0 +1,83 @@
|
||||||
|
# Lethean Blockchain Build Configuration
|
||||||
|
# Used by: core compile
|
||||||
|
|
||||||
|
version: 1
|
||||||
|
|
||||||
|
project:
|
||||||
|
name: blockchain
|
||||||
|
type: cpp
|
||||||
|
description: "Lethean Blockchain - SASE infrastructure chain"
|
||||||
|
version: "6.0.1"
|
||||||
|
|
||||||
|
cpp:
|
||||||
|
standard: 17
|
||||||
|
build_type: Release
|
||||||
|
static: false
|
||||||
|
|
||||||
|
conan:
|
||||||
|
version: "2.21.0"
|
||||||
|
requires:
|
||||||
|
- zlib/1.3.1
|
||||||
|
- boost/1.85.0
|
||||||
|
- openssl/3.2.0
|
||||||
|
- miniupnpc/2.2.5
|
||||||
|
- jwt-cpp/0.7.1
|
||||||
|
- oatpp/1.3.0.latest
|
||||||
|
- oatpp-swagger/1.3.0.latest
|
||||||
|
tool_requires:
|
||||||
|
- cmake/3.31.9
|
||||||
|
options:
|
||||||
|
boost/*:without_test: true
|
||||||
|
registry:
|
||||||
|
url: http://forge.snider.dev:4000/api/packages/host-uk/conan
|
||||||
|
remote: conan_build
|
||||||
|
|
||||||
|
cmake:
|
||||||
|
minimum_version: "3.16"
|
||||||
|
variables:
|
||||||
|
USE_CCACHE: "ON"
|
||||||
|
|
||||||
|
options:
|
||||||
|
testnet: false
|
||||||
|
|
||||||
|
targets:
|
||||||
|
- os: linux
|
||||||
|
arch: x86_64
|
||||||
|
profile: gcc-linux-x86_64
|
||||||
|
- os: linux
|
||||||
|
arch: arm64
|
||||||
|
profile: gcc-linux-armv8
|
||||||
|
- os: darwin
|
||||||
|
arch: arm64
|
||||||
|
profile: apple-clang-armv8
|
||||||
|
- os: darwin
|
||||||
|
arch: x86_64
|
||||||
|
profile: apple-clang-x86_64
|
||||||
|
- os: windows
|
||||||
|
arch: x86_64
|
||||||
|
profile: msvc-194-x86_64
|
||||||
|
|
||||||
|
package:
|
||||||
|
generators:
|
||||||
|
- TGZ
|
||||||
|
- ZIP
|
||||||
|
- NSIS
|
||||||
|
- DEB
|
||||||
|
- RPM
|
||||||
|
vendor: Lethean
|
||||||
|
contact: support@lt.hn
|
||||||
|
website: https://lt.hn
|
||||||
|
|
||||||
|
docker:
|
||||||
|
dockerfile: utils/docker/lthn-chain/Dockerfile
|
||||||
|
image: lthn/chain
|
||||||
|
platforms:
|
||||||
|
- linux/amd64
|
||||||
|
tags:
|
||||||
|
- testnet
|
||||||
|
- "{{.Version}}"
|
||||||
|
build_args:
|
||||||
|
BUILD_THREADS: auto
|
||||||
|
BUILD_TESTNET: "1"
|
||||||
|
BUILD_STATIC: "0"
|
||||||
|
BUILD_TYPE: Release
|
||||||
8
.dockerignore
Normal file
8
.dockerignore
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
build
|
||||||
|
.github
|
||||||
|
.idea
|
||||||
|
docs
|
||||||
|
resources
|
||||||
|
snap
|
||||||
|
tests
|
||||||
|
CMakeUserPresets.json
|
||||||
234
.forgejo/workflows/build.yml
Executable file
234
.forgejo/workflows/build.yml
Executable file
|
|
@ -0,0 +1,234 @@
|
||||||
|
name: Build & Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- dev
|
||||||
|
- main
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
env:
|
||||||
|
FORGEJO_URL: ${{ github.server_url }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# ──────────────────────────────────────────────
|
||||||
|
# Linux x86_64 — native build on snider-linux
|
||||||
|
# ──────────────────────────────────────────────
|
||||||
|
build-linux:
|
||||||
|
name: Linux x86_64
|
||||||
|
runs-on: linux-native
|
||||||
|
env:
|
||||||
|
CPU_CORES: "24"
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
fetch-tags: true
|
||||||
|
submodules: false
|
||||||
|
|
||||||
|
- name: Init submodules
|
||||||
|
run: |
|
||||||
|
git config --global url."${{ env.FORGEJO_URL }}/".insteadOf "http://forge.snider.dev:4000/"
|
||||||
|
git -c http.extraHeader="Authorization: token ${{ secrets.RELEASE_TOKEN }}" submodule update --init --recursive
|
||||||
|
git submodule foreach --recursive 'git fetch --tags origin 2>/dev/null || true'
|
||||||
|
|
||||||
|
- name: Build dependencies
|
||||||
|
run: |
|
||||||
|
make build-deps \
|
||||||
|
CPU_CORES=${{ env.CPU_CORES }} \
|
||||||
|
CONAN_URL=${{ env.FORGEJO_URL }}/api/packages/host-uk/conan \
|
||||||
|
CONAN_USER=claude \
|
||||||
|
CONAN_PASSWORD=${{ secrets.RELEASE_TOKEN }}
|
||||||
|
|
||||||
|
- name: Compile
|
||||||
|
run: |
|
||||||
|
make ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} \
|
||||||
|
CPU_CORES=${{ env.CPU_CORES }} \
|
||||||
|
CONAN_URL=${{ env.FORGEJO_URL }}/api/packages/host-uk/conan \
|
||||||
|
CONAN_USER=claude \
|
||||||
|
CONAN_PASSWORD=${{ secrets.RELEASE_TOKEN }}
|
||||||
|
|
||||||
|
- name: Upload artifacts
|
||||||
|
uses: https://code.forgejo.org/forgejo/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: linux-x86_64
|
||||||
|
path: build/packages/lethean-*
|
||||||
|
retention-days: 7
|
||||||
|
|
||||||
|
# ──────────────────────────────────────────────
|
||||||
|
# macOS ARM64 — native build on M3 Ultra
|
||||||
|
# ──────────────────────────────────────────────
|
||||||
|
build-macos:
|
||||||
|
name: macOS ARM64
|
||||||
|
runs-on: macos-native
|
||||||
|
env:
|
||||||
|
CPU_CORES: "24"
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
fetch-tags: true
|
||||||
|
submodules: false
|
||||||
|
|
||||||
|
- name: Init submodules
|
||||||
|
run: |
|
||||||
|
git config --global url."${{ env.FORGEJO_URL }}/".insteadOf "http://forge.snider.dev:4000/"
|
||||||
|
git -c http.extraHeader="Authorization: token ${{ secrets.RELEASE_TOKEN }}" submodule update --init --recursive
|
||||||
|
git submodule foreach --recursive 'git fetch --tags origin 2>/dev/null || true'
|
||||||
|
|
||||||
|
- name: Build dependencies
|
||||||
|
run: |
|
||||||
|
export PATH="/opt/homebrew/bin:$PATH"
|
||||||
|
make build-deps \
|
||||||
|
CPU_CORES=${{ env.CPU_CORES }} \
|
||||||
|
CONAN_URL=${{ env.FORGEJO_URL }}/api/packages/host-uk/conan \
|
||||||
|
CONAN_USER=claude \
|
||||||
|
CONAN_PASSWORD=${{ secrets.RELEASE_TOKEN }}
|
||||||
|
|
||||||
|
- name: Compile
|
||||||
|
run: |
|
||||||
|
export PATH="/opt/homebrew/bin:$PATH"
|
||||||
|
make ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} \
|
||||||
|
CPU_CORES=${{ env.CPU_CORES }} \
|
||||||
|
CONAN_URL=${{ env.FORGEJO_URL }}/api/packages/host-uk/conan \
|
||||||
|
CONAN_USER=claude \
|
||||||
|
CONAN_PASSWORD=${{ secrets.RELEASE_TOKEN }}
|
||||||
|
|
||||||
|
- name: Upload artifacts
|
||||||
|
uses: https://code.forgejo.org/forgejo/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: macos-arm64
|
||||||
|
path: build/packages/lethean-*
|
||||||
|
retention-days: 7
|
||||||
|
|
||||||
|
# ──────────────────────────────────────────────
|
||||||
|
# Aggregate artifacts and create release
|
||||||
|
# ──────────────────────────────────────────────
|
||||||
|
release:
|
||||||
|
name: Create Release
|
||||||
|
needs: [build-linux, build-macos]
|
||||||
|
runs-on: linux-native
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 1
|
||||||
|
submodules: false
|
||||||
|
|
||||||
|
- name: Download Linux artifacts
|
||||||
|
uses: https://code.forgejo.org/forgejo/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: linux-x86_64
|
||||||
|
path: artifacts/linux
|
||||||
|
|
||||||
|
- name: Download macOS artifacts
|
||||||
|
uses: https://code.forgejo.org/forgejo/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: macos-arm64
|
||||||
|
path: artifacts/macos
|
||||||
|
|
||||||
|
- name: List artifacts
|
||||||
|
run: find artifacts/ -type f | sort
|
||||||
|
|
||||||
|
- name: Compute release tag
|
||||||
|
id: release
|
||||||
|
run: |
|
||||||
|
VERSION=$(grep '^BUILD_VERSION:=' Makefile | cut -d'=' -f2)
|
||||||
|
if [ "${{ github.ref_name }}" = "main" ]; then
|
||||||
|
TAG="v${VERSION}+${{ github.run_number }}"
|
||||||
|
PRERELEASE=false
|
||||||
|
TITLE="v${VERSION} (build ${{ github.run_number }})"
|
||||||
|
else
|
||||||
|
TAG="v${VERSION}-beta+${{ github.run_number }}"
|
||||||
|
PRERELEASE=true
|
||||||
|
TITLE="v${VERSION}-beta (build ${{ github.run_number }})"
|
||||||
|
fi
|
||||||
|
echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "prerelease=${PRERELEASE}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "title=${TITLE}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- name: Create release
|
||||||
|
id: create_release
|
||||||
|
run: |
|
||||||
|
RESPONSE=$(curl -s -w "\n%{http_code}" -X POST \
|
||||||
|
"${{ env.FORGEJO_URL }}/api/v1/repos/${{ github.repository }}/releases" \
|
||||||
|
-H "Authorization: token ${{ secrets.RELEASE_TOKEN }}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{
|
||||||
|
\"tag_name\": \"${{ steps.release.outputs.tag }}\",
|
||||||
|
\"target_commitish\": \"${{ github.sha }}\",
|
||||||
|
\"name\": \"${{ steps.release.outputs.title }}\",
|
||||||
|
\"body\": \"Automated build from \`${{ github.ref_name }}\` branch (run #${{ github.run_number }})\n\n## Platforms\n- Linux x86_64\n- macOS ARM64 (Apple Silicon)\",
|
||||||
|
\"draft\": false,
|
||||||
|
\"prerelease\": ${{ steps.release.outputs.prerelease }}
|
||||||
|
}")
|
||||||
|
HTTP_CODE=$(echo "$RESPONSE" | tail -1)
|
||||||
|
BODY=$(echo "$RESPONSE" | sed '$d')
|
||||||
|
if [ "$HTTP_CODE" -ge 400 ]; then
|
||||||
|
echo "Failed to create release (HTTP ${HTTP_CODE}):"
|
||||||
|
echo "$BODY"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
RELEASE_ID=$(echo "$BODY" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")
|
||||||
|
echo "id=${RELEASE_ID}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "Created release ID: ${RELEASE_ID}"
|
||||||
|
|
||||||
|
- name: Upload release assets
|
||||||
|
run: |
|
||||||
|
for dir in artifacts/linux artifacts/macos; do
|
||||||
|
for file in "$dir"/lethean-*; do
|
||||||
|
[ -f "$file" ] || continue
|
||||||
|
FILENAME=$(basename "$file")
|
||||||
|
echo "Uploading: ${FILENAME}"
|
||||||
|
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" -X POST \
|
||||||
|
"${{ env.FORGEJO_URL }}/api/v1/repos/${{ github.repository }}/releases/${{ steps.create_release.outputs.id }}/assets?name=${FILENAME}" \
|
||||||
|
-H "Authorization: token ${{ secrets.RELEASE_TOKEN }}" \
|
||||||
|
-H "Content-Type: application/octet-stream" \
|
||||||
|
--data-binary "@${file}")
|
||||||
|
if [ "$HTTP_CODE" -ge 400 ]; then
|
||||||
|
echo "Failed to upload ${FILENAME} (HTTP ${HTTP_CODE})"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "Uploaded ${FILENAME} (HTTP ${HTTP_CODE})"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
- name: Prune old releases
|
||||||
|
run: |
|
||||||
|
TAG_PREFIX="${{ github.ref_name == 'main' && 'v6' || 'v6.*-beta' }}"
|
||||||
|
CURRENT_ID="${{ steps.create_release.outputs.id }}"
|
||||||
|
echo "Keeping release ${CURRENT_ID}, pruning older ${TAG_PREFIX} releases..."
|
||||||
|
PAGE=1
|
||||||
|
while true; do
|
||||||
|
RELEASES=$(curl -s "${{ env.FORGEJO_URL }}/api/v1/repos/${{ github.repository }}/releases?limit=50&page=${PAGE}" \
|
||||||
|
-H "Authorization: token ${{ secrets.RELEASE_TOKEN }}")
|
||||||
|
COUNT=$(echo "$RELEASES" | python3 -c "import sys,json; print(len(json.load(sys.stdin)))" 2>/dev/null || echo 0)
|
||||||
|
[ "$COUNT" = "0" ] && break
|
||||||
|
echo "$RELEASES" | python3 -c "
|
||||||
|
import sys, json, fnmatch
|
||||||
|
for r in json.load(sys.stdin):
|
||||||
|
rid = r['id']
|
||||||
|
tag = r['tag_name']
|
||||||
|
if rid == ${CURRENT_ID}:
|
||||||
|
continue
|
||||||
|
if fnmatch.fnmatch(tag, '${TAG_PREFIX}*'):
|
||||||
|
print(f'{rid} {tag}')
|
||||||
|
" | while read -r RID RTAG; do
|
||||||
|
echo "Deleting release ${RTAG} (id=${RID})"
|
||||||
|
curl -s -o /dev/null -X DELETE \
|
||||||
|
"${{ env.FORGEJO_URL }}/api/v1/repos/${{ github.repository }}/releases/${RID}" \
|
||||||
|
-H "Authorization: token ${{ secrets.RELEASE_TOKEN }}"
|
||||||
|
curl -s -o /dev/null -X DELETE \
|
||||||
|
"${{ env.FORGEJO_URL }}/api/v1/repos/${{ github.repository }}/tags/${RTAG}" \
|
||||||
|
-H "Authorization: token ${{ secrets.RELEASE_TOKEN }}"
|
||||||
|
done
|
||||||
|
PAGE=$((PAGE + 1))
|
||||||
|
done
|
||||||
|
echo "Prune complete"
|
||||||
5
.gitattributes
vendored
5
.gitattributes
vendored
|
|
@ -1,2 +1,5 @@
|
||||||
.git* export-ignore
|
.git* export-ignore
|
||||||
/CMakeLists.txt export-subst
|
/CMakeLists.txt export-subst
|
||||||
|
|
||||||
|
# Mark auto-generated SDK clients as "generated" to hide them in GitHub diffs
|
||||||
|
utils/sdk/client/** linguist-generated=true
|
||||||
22
.github/actions/make-docs/action.yml
vendored
Normal file
22
.github/actions/make-docs/action.yml
vendored
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
# .github/actions/make-docs/action.yml
|
||||||
|
name: 'Build Documentation'
|
||||||
|
description: 'Archives and uploads signed binaries to a GitHub release'
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
- run: echo "cache_id=$(date -u '+%V')" >> $GITHUB_ENV
|
||||||
|
- uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
key: mkdocs-material-${{ env.cache_id }}
|
||||||
|
path: ~/.cache
|
||||||
|
restore-keys: |
|
||||||
|
mkdocs-material-
|
||||||
|
|
||||||
|
- if: runner.os == 'Linux'
|
||||||
|
run: |
|
||||||
|
sudo apt-get install -y libcairo2-dev libfreetype6-dev libffi-dev libjpeg-dev libpng-dev libz-dev pngquant
|
||||||
|
- run: pip install mkdocs-git-revision-date-localized-plugin cairosvg mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin mkdocs-material[imaging]
|
||||||
90
.github/actions/upload-artifacts/action.yml
vendored
Normal file
90
.github/actions/upload-artifacts/action.yml
vendored
Normal file
|
|
@ -0,0 +1,90 @@
|
||||||
|
# .github/actions/upload-artifacts/action.yml
|
||||||
|
name: 'Upload Artifacts'
|
||||||
|
description: 'Archives and uploads signed binaries to a GitHub release'
|
||||||
|
inputs:
|
||||||
|
chain-network:
|
||||||
|
required: true
|
||||||
|
description: 'The chain network name to use in filenames, mainnet or testnet'
|
||||||
|
assets:
|
||||||
|
description: "A EOL separated string list of filenames to archive; if asset is a abs path, it's respected"
|
||||||
|
required: false
|
||||||
|
asset-type:
|
||||||
|
required: true
|
||||||
|
description: 'The asset type: cli, gui, ANYTHING; used as a separator for different release packages for the same arch'
|
||||||
|
asset-directory:
|
||||||
|
required: true
|
||||||
|
description: "The directory where 7z's working dir will be set"
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- name: compute file name
|
||||||
|
id: asset
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
ARCH=${{ runner.arch }}
|
||||||
|
RUNNER_OS=${{ runner.os }}
|
||||||
|
LOWERCASE_ARCH=$(echo "$ARCH" | tr '[:upper:]' '[:lower:]')
|
||||||
|
TARGET_OS=$(echo "$RUNNER_OS" | tr '[:upper:]' '[:lower:]')
|
||||||
|
FILENAME="${{ inputs.chain-network }}-${{ inputs.asset-type }}-${TARGET_OS}-${LOWERCASE_ARCH}"
|
||||||
|
echo "key=$FILENAME" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
VERSION=$(grep '^BUILD_VERSION:=' Makefile | cut -d'=' -f2)
|
||||||
|
# Check if a version was found
|
||||||
|
if [ -z "$VERSION" ]; then
|
||||||
|
echo "Error: BUILD_VERSION could not be found in the Makefile." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
if [ "${{ github.event_name }}" == "pull_request" ]; then
|
||||||
|
TAG_SUFFIX="-alpha.${{ github.event.number }}"
|
||||||
|
PRERELEASE=true
|
||||||
|
elif [ "${{ inputs.chain-network }}" != "mainnet" ]; then
|
||||||
|
TAG_SUFFIX="-beta"
|
||||||
|
PRERELEASE=true
|
||||||
|
else
|
||||||
|
TAG_SUFFIX=""
|
||||||
|
PRERELEASE=false
|
||||||
|
fi
|
||||||
|
TAG_NAME="${VERSION}${TAG_SUFFIX}+${{ github.run_number }}"
|
||||||
|
echo "tag_name=${TAG_NAME}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "prerelease=${PRERELEASE}" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
# Format the output to be a multi-line string.
|
||||||
|
# This is the correct way to pass a multi-line string in GITHUB_OUTPUT.
|
||||||
|
echo "paths<<EOF" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
# Iterate through each filename
|
||||||
|
echo "${{ inputs.assets }}" | while read -r file; do
|
||||||
|
if [[ -z "$file" ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
# Check if the file is an absolute path
|
||||||
|
if [[ "$file" == /* ]] || [[ "$file" =~ ^[a-zA-Z]: ]]; then
|
||||||
|
FULL_PATH="$file"
|
||||||
|
else
|
||||||
|
# It's a relative path, so join it with the asset directory
|
||||||
|
if [[ "${{ runner.os }}" == "Windows" ]]; then
|
||||||
|
FULL_PATH="${{ inputs.asset-directory }}\\$file"
|
||||||
|
else
|
||||||
|
FULL_PATH="${{ inputs.asset-directory }}/$file"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo "$FULL_PATH" >> "$GITHUB_OUTPUT"
|
||||||
|
done
|
||||||
|
echo "EOF" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- name: Upload Artifacts
|
||||||
|
uses: actions/upload-artifact@v4.6.2
|
||||||
|
with:
|
||||||
|
name: ${{ steps.asset.outputs.key }}
|
||||||
|
path: ${{ steps.asset.outputs.paths }}
|
||||||
|
|
||||||
|
- name: Make Release
|
||||||
|
uses: softprops/action-gh-release@v2
|
||||||
|
with:
|
||||||
|
tag_name: ${{ steps.asset.outputs.tag_name }}
|
||||||
|
prerelease: ${{ steps.asset.outputs.prerelease }}
|
||||||
|
files: ${{ inputs.asset-directory }}/*
|
||||||
|
target_commitish: ${{ github.sha }}
|
||||||
25
.github/workflows/_maint-cache.yml
vendored
Normal file
25
.github/workflows/_maint-cache.yml
vendored
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
name: Clear all Github actions caches on sundays
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 0 * * 0"
|
||||||
|
workflow_dispatch:
|
||||||
|
# pull_request:
|
||||||
|
# types:
|
||||||
|
# - opened
|
||||||
|
# - synchronize
|
||||||
|
# - reopened
|
||||||
|
# branches:
|
||||||
|
# - dev
|
||||||
|
# - main
|
||||||
|
# paths-ignore:
|
||||||
|
# - '**.md'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
my-job:
|
||||||
|
name: Delete all caches
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
steps:
|
||||||
|
- name: Clear caches
|
||||||
|
run: gh cache delete --all --repo ${{ github.repository }}
|
||||||
70
.github/workflows/_on-pr.yml
vendored
Normal file
70
.github/workflows/_on-pr.yml
vendored
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
name: PR
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
on:
|
||||||
|
# Allows you to run this workflow manually from the Actions tab
|
||||||
|
workflow_dispatch:
|
||||||
|
pull_request_review:
|
||||||
|
pull_request:
|
||||||
|
types:
|
||||||
|
- opened
|
||||||
|
- synchronize
|
||||||
|
- reopened
|
||||||
|
- ready_for_review
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-linux-intel:
|
||||||
|
name: Linux
|
||||||
|
if: ${{!github.event.pull_request.draft}}
|
||||||
|
uses: ./.github/workflows/build-linux-intel.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-linux-arm:
|
||||||
|
name: Linux
|
||||||
|
if: ${{!github.event.pull_request.draft}}
|
||||||
|
uses: ./.github/workflows/build-linux-arm64.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-windows-intel:
|
||||||
|
name: Windows
|
||||||
|
if: ${{!github.event.pull_request.draft}}
|
||||||
|
uses: ./.github/workflows/build-windows-intel.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-macos-arm64:
|
||||||
|
name: MacOS
|
||||||
|
uses: ./.github/workflows/build-macos-arm64.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-macos-intel:
|
||||||
|
name: MacOS
|
||||||
|
if: ${{!github.event.pull_request.draft}}
|
||||||
|
uses: ./.github/workflows/build-macos-intel.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-docker:
|
||||||
|
name: Docker
|
||||||
|
if: ${{!github.event.pull_request.draft}}
|
||||||
|
uses: ./.github/workflows/build-docker.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-docs:
|
||||||
|
name: Docs
|
||||||
|
if: ${{!github.event.pull_request.draft}}
|
||||||
|
uses: ./.github/workflows/build-docs.yml
|
||||||
62
.github/workflows/_on-push.yml
vendored
Normal file
62
.github/workflows/_on-push.yml
vendored
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
name: Push Compile
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
packages: write
|
||||||
|
on:
|
||||||
|
# Allows you to run this workflow manually from the Actions tab
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'dev'
|
||||||
|
- 'main'
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-linux-intel:
|
||||||
|
name: Linux
|
||||||
|
uses: ./.github/workflows/build-linux-intel.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-linux-arm:
|
||||||
|
name: Linux
|
||||||
|
uses: ./.github/workflows/build-linux-arm64.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-windows-intel:
|
||||||
|
name: Windows
|
||||||
|
uses: ./.github/workflows/build-windows-intel.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-macos-arm64:
|
||||||
|
name: MacOS
|
||||||
|
uses: ./.github/workflows/build-macos-arm64.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-macos-intel:
|
||||||
|
name: MacOS
|
||||||
|
uses: ./.github/workflows/build-macos-intel.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-docker:
|
||||||
|
name: Docker
|
||||||
|
uses: ./.github/workflows/build-docker.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-docs:
|
||||||
|
name: Docs
|
||||||
|
uses: ./.github/workflows/build-docs.yml
|
||||||
83
.github/workflows/_on-release.yml
vendored
Normal file
83
.github/workflows/_on-release.yml
vendored
Normal file
|
|
@ -0,0 +1,83 @@
|
||||||
|
name: Push Full Build
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
on:
|
||||||
|
# Allows you to run this workflow manually from the Actions tab
|
||||||
|
workflow_dispatch:
|
||||||
|
release:
|
||||||
|
types: [ published ]
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
determine-network:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
chain-network: ${{ steps.get_branch.outputs.chain_network }}
|
||||||
|
steps:
|
||||||
|
- name: Get release information from API
|
||||||
|
id: get_branch
|
||||||
|
run: |
|
||||||
|
# Use the GitHub CLI to get the release details by tag name
|
||||||
|
# The result is a JSON object
|
||||||
|
RELEASE_INFO=$(gh release view --json targetCommitish -t ${{ github.ref_name }})
|
||||||
|
|
||||||
|
# Extract the target commitish (the source branch)
|
||||||
|
SOURCE_BRANCH=$(echo "$RELEASE_INFO" | jq -r '.targetCommitish')
|
||||||
|
|
||||||
|
# Set the chain network based on the source branch
|
||||||
|
if [ "$SOURCE_BRANCH" == "dev" ]; then
|
||||||
|
echo "chain_network=testnet" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "chain_network=mainnet" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Source Branch: $SOURCE_BRANCH"
|
||||||
|
echo "Chain Network: ${{ steps.get_branch.outputs.chain_network }}"
|
||||||
|
|
||||||
|
build-linux-intel:
|
||||||
|
name: Chain
|
||||||
|
uses: ./.github/workflows/build-linux-intel.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-linux-arm:
|
||||||
|
name: Chain
|
||||||
|
uses: ./.github/workflows/build-linux-arm64.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-windows-intel:
|
||||||
|
name: Chain
|
||||||
|
uses: ./.github/workflows/build-windows-intel.yml
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-macos-arm64:
|
||||||
|
name: Chain
|
||||||
|
uses: ./.github/workflows/build-macos-arm64.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-macos-intel:
|
||||||
|
name: Chain
|
||||||
|
uses: ./.github/workflows/build-macos-intel.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-docker:
|
||||||
|
name: Docker
|
||||||
|
uses: ./.github/workflows/build-docker.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }}
|
||||||
|
|
||||||
|
build-docs:
|
||||||
|
name: Docs
|
||||||
|
uses: ./.github/workflows/build-docs.yml
|
||||||
54
.github/workflows/build-docker.yml
vendored
Normal file
54
.github/workflows/build-docker.yml
vendored
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
name: Docker
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
secrets:
|
||||||
|
DOCKERHUB_USERNAME:
|
||||||
|
required: true
|
||||||
|
DOCKERHUB_TOKEN:
|
||||||
|
required: true
|
||||||
|
inputs:
|
||||||
|
chain-network:
|
||||||
|
description: "The network to use, can either be testnet, stagenet or mainnet"
|
||||||
|
default: testnet
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: "lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }}"
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout Project
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Login to DockerHub
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
|
|
||||||
|
- name: Build and push
|
||||||
|
id: docker_build
|
||||||
|
uses: docker/build-push-action@v6
|
||||||
|
env:
|
||||||
|
DOCKER_BUILD_SUMMARY: false
|
||||||
|
DOCKER_BUILD_RECORD_UPLOAD: false
|
||||||
|
with:
|
||||||
|
file: utils/docker/lthn-chain/Dockerfile
|
||||||
|
context: ${{ github.workspace }}
|
||||||
|
push: true
|
||||||
|
build-args: |
|
||||||
|
BUILD_TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }}
|
||||||
|
THREADS=2
|
||||||
|
BUILD_LOCAL=1
|
||||||
|
tags: lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }}
|
||||||
|
|
||||||
40
.github/workflows/build-docs.yml
vendored
Normal file
40
.github/workflows/build-docs.yml
vendored
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
name: docs
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
deploy:
|
||||||
|
name: Offline Local Version
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- run: sudo apt-get install -y libcairo2-dev libfreetype6-dev libffi-dev libjpeg-dev libpng-dev libz-dev pngquant
|
||||||
|
- run: pip install mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin mkdocs-material[imaging]
|
||||||
|
|
||||||
|
- name: Build Offline Version
|
||||||
|
run: make docs
|
||||||
|
|
||||||
|
- name: CLI Artifacts
|
||||||
|
uses: ./.github/actions/upload-artifacts
|
||||||
|
with:
|
||||||
|
chain-network: ${{ inputs.chain-network }}
|
||||||
|
assets: "*"
|
||||||
|
asset-type: 'docs'
|
||||||
|
asset-directory: ${{ github.workspace }}/build/docs
|
||||||
90
.github/workflows/build-linux-arm64.yml
vendored
Normal file
90
.github/workflows/build-linux-arm64.yml
vendored
Normal file
|
|
@ -0,0 +1,90 @@
|
||||||
|
name: Linux
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
chain-network:
|
||||||
|
description: "The network to use, can either be testnet, stagenet or mainnet"
|
||||||
|
default: testnet
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
cache:
|
||||||
|
name: cache-arm64
|
||||||
|
runs-on: ubuntu-22.04-arm
|
||||||
|
steps:
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
id: cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- name: Checkout Project
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: install dependencies
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: sudo apt-get install -y autotools-dev git build-essential libcairo2-dev libfreetype6-dev libffi-dev libjpeg-dev libpng-dev libz-dev pngquant
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
|
||||||
|
- if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin "mkdocs-material[imaging]"
|
||||||
|
|
||||||
|
- name: Compile Dependencies
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: |
|
||||||
|
make build-deps CPU_CORES=4 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} CONAN_USER=ci-user CONAN_PASSWORD=${{ secrets.CONAN_PASSWORD }}
|
||||||
|
make upload-conan-cache
|
||||||
|
|
||||||
|
|
||||||
|
build:
|
||||||
|
name: compile-arm64
|
||||||
|
needs: cache
|
||||||
|
runs-on: ubuntu-22.04-arm
|
||||||
|
steps:
|
||||||
|
- name: Checkout Project
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: install dependencies
|
||||||
|
run: sudo apt-get install -y autotools-dev rpm git build-essential libcairo2-dev libfreetype6-dev libffi-dev libjpeg-dev libpng-dev libz-dev pngquant
|
||||||
|
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
|
||||||
|
- run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin "mkdocs-material[imaging]"
|
||||||
|
|
||||||
|
- name: Compile Release
|
||||||
|
run: make ${{ inputs.chain-network }}
|
||||||
|
|
||||||
|
- name: CLI Artifacts
|
||||||
|
uses: ./.github/actions/upload-artifacts
|
||||||
|
with:
|
||||||
|
chain-network: ${{ inputs.chain-network }}
|
||||||
|
assets: lethean-*
|
||||||
|
asset-type: 'cli'
|
||||||
|
asset-directory: ${{ github.workspace }}/build/packages
|
||||||
90
.github/workflows/build-linux-intel.yml
vendored
Normal file
90
.github/workflows/build-linux-intel.yml
vendored
Normal file
|
|
@ -0,0 +1,90 @@
|
||||||
|
name: Linux
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
chain-network:
|
||||||
|
description: "The network to use, can either be testnet, stagenet or mainnet"
|
||||||
|
default: testnet
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
cache:
|
||||||
|
name: cache-x86_64
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
id: cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
lookup-only: true
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- name: Checkout Project
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: install dependencies
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: sudo apt-get install -y autotools-dev rpm git build-essential
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
- if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin "mkdocs-material[imaging]"
|
||||||
|
|
||||||
|
- name: Compile Dependencies
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: |
|
||||||
|
make build-deps CPU_CORES=4 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} CONAN_USER=ci-user CONAN_PASSWORD=${{ secrets.CONAN_PASSWORD }}
|
||||||
|
make upload-conan-cache
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
build:
|
||||||
|
name: compile-x86_64
|
||||||
|
needs: cache
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout Project
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: install dependencies
|
||||||
|
run: sudo apt-get install -y autotools-dev git build-essential
|
||||||
|
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
- run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin "mkdocs-material[imaging]"
|
||||||
|
|
||||||
|
- name: Compile Release
|
||||||
|
run: make ${{ inputs.chain-network }}
|
||||||
|
|
||||||
|
- name: CLI Artifacts
|
||||||
|
uses: ./.github/actions/upload-artifacts
|
||||||
|
with:
|
||||||
|
chain-network: ${{ inputs.chain-network }}
|
||||||
|
assets: lethean-*
|
||||||
|
asset-type: 'cli'
|
||||||
|
asset-directory: ${{ github.workspace }}/build/packages
|
||||||
85
.github/workflows/build-macos-arm64.yml
vendored
Normal file
85
.github/workflows/build-macos-arm64.yml
vendored
Normal file
|
|
@ -0,0 +1,85 @@
|
||||||
|
name: build-macos-arm64
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
chain-network:
|
||||||
|
description: "The network to use, can either be testnet, stagenet or mainnet"
|
||||||
|
default: testnet
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
cache:
|
||||||
|
name: cache-armv8
|
||||||
|
runs-on: macos-15
|
||||||
|
steps:
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
id: cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
lookup-only: true
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- name: Checkout Project
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
|
||||||
|
- if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin "mkdocs-material[imaging]"
|
||||||
|
|
||||||
|
- name: Compile Dependencies
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: |
|
||||||
|
make build-deps CPU_CORES=3 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} CONAN_USER=ci-user CONAN_PASSWORD=${{ secrets.CONAN_PASSWORD }}
|
||||||
|
make upload-conan-cache
|
||||||
|
|
||||||
|
|
||||||
|
build:
|
||||||
|
name: compile-armv8
|
||||||
|
needs: cache
|
||||||
|
runs-on: macos-15
|
||||||
|
steps:
|
||||||
|
- name: Checkout Project
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
|
||||||
|
- run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin "mkdocs-material[imaging]"
|
||||||
|
|
||||||
|
- name: Compile Release
|
||||||
|
run: make ${{ inputs.chain-network }}
|
||||||
|
|
||||||
|
- name: CLI Artifacts
|
||||||
|
uses: ./.github/actions/upload-artifacts
|
||||||
|
with:
|
||||||
|
chain-network: ${{ inputs.chain-network }}
|
||||||
|
assets: lethean-*
|
||||||
|
asset-type: 'cli'
|
||||||
|
asset-directory: ${{ github.workspace }}/build/packages
|
||||||
81
.github/workflows/build-macos-intel.yml
vendored
Normal file
81
.github/workflows/build-macos-intel.yml
vendored
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
name: build-macos-intel
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
chain-network:
|
||||||
|
description: "The network to use, can either be testnet, stagenet or mainnet"
|
||||||
|
default: testnet
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
cache:
|
||||||
|
name: cache-x86_64
|
||||||
|
runs-on: macos-13
|
||||||
|
steps:
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
id: cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
lookup-only: true
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- name: Checkout Project
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
- if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin "mkdocs-material[imaging]"
|
||||||
|
|
||||||
|
- name: Compile Dependencies
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: |
|
||||||
|
make build-deps CPU_CORES=4 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} CONAN_USER=ci-user CONAN_PASSWORD=${{ secrets.CONAN_PASSWORD }}
|
||||||
|
make upload-conan-cache
|
||||||
|
|
||||||
|
build:
|
||||||
|
name: compile-x86_64
|
||||||
|
needs: cache
|
||||||
|
runs-on: macos-13
|
||||||
|
steps:
|
||||||
|
- name: Checkout Project
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
- run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin "mkdocs-material[imaging]"
|
||||||
|
|
||||||
|
- name: Compile Release
|
||||||
|
run: make ${{ inputs.chain-network }}
|
||||||
|
|
||||||
|
- name: CLI Artifacts
|
||||||
|
uses: ./.github/actions/upload-artifacts
|
||||||
|
with:
|
||||||
|
chain-network: ${{ inputs.chain-network }}
|
||||||
|
assets: lethean-*
|
||||||
|
asset-type: 'cli'
|
||||||
|
asset-directory: ${{ github.workspace }}/build/packages
|
||||||
82
.github/workflows/build-windows-intel.yml
vendored
Normal file
82
.github/workflows/build-windows-intel.yml
vendored
Normal file
|
|
@ -0,0 +1,82 @@
|
||||||
|
name: build-windows
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
chain-network:
|
||||||
|
description: "The network to use, can either be testnet, stagenet or mainnet"
|
||||||
|
default: testnet
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
cache:
|
||||||
|
name: cache-x86_64
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
id: cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
lookup-only: true
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- name: Checkout Project
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
- if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin "mkdocs-material[imaging]"
|
||||||
|
|
||||||
|
- name: Compile Dependencies
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
run: |
|
||||||
|
make build-deps CPU_CORES=4 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} CONAN_USER=ci-user CONAN_PASSWORD=${{ secrets.CONAN_PASSWORD }}
|
||||||
|
make upload-conan-cache
|
||||||
|
|
||||||
|
build:
|
||||||
|
name: compile-x86_64
|
||||||
|
needs: cache
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout Project
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Cache SDK Folder
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/build/sdk
|
||||||
|
${{ github.workspace }}/build/bin
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sdk
|
||||||
|
|
||||||
|
- run: choco install nsis.install
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
- run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-git-committers-plugin-2 mkdocs-git-authors-plugin "mkdocs-material[imaging]"
|
||||||
|
|
||||||
|
- name: Compile Release
|
||||||
|
run: make ${{ inputs.chain-network }}
|
||||||
|
|
||||||
|
- name: CLI Artifacts
|
||||||
|
uses: ./.github/actions/upload-artifacts
|
||||||
|
with:
|
||||||
|
chain-network: ${{ inputs.chain-network }}
|
||||||
|
assets: lethean-*
|
||||||
|
asset-type: 'cli'
|
||||||
|
asset-directory: ${{ github.workspace }}/build/packages
|
||||||
11
.gitignore
vendored
11
.gitignore
vendored
|
|
@ -5,4 +5,13 @@
|
||||||
._.DS_Store
|
._.DS_Store
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
._*
|
._*
|
||||||
.idea
|
.idea/workspace.xml
|
||||||
|
.idea/usage.statistics.xml
|
||||||
|
.idea/dictionaries
|
||||||
|
.idea/shelf
|
||||||
|
.idea/copilot*
|
||||||
|
.idea/modules.xml
|
||||||
|
.idea/*.iml
|
||||||
|
.vs/*
|
||||||
|
CMakeUserPresets.json
|
||||||
|
ConanPresets.json
|
||||||
|
|
|
||||||
26
.gitmodules
vendored
26
.gitmodules
vendored
|
|
@ -1,14 +1,18 @@
|
||||||
[submodule "contrib/miniupnp"]
|
[submodule "contrib/jwt-cpp"]
|
||||||
path = contrib/miniupnp
|
path = contrib/jwt-cpp
|
||||||
url = https://github.com/miniupnp/miniupnp
|
url = https://github.com/Thalhammer/jwt-cpp.git
|
||||||
[submodule "contrib/db/libmdbx"]
|
[submodule "contrib/bitcoin-secp256k1"]
|
||||||
path = contrib/db/libmdbx
|
path = contrib/bitcoin-secp256k1
|
||||||
url = https://github.com/leo-yuriev/libmdbx.git
|
url = https://github.com/bitcoin-core/secp256k1.git
|
||||||
[submodule "src/gui/qt-daemon/layout"]
|
|
||||||
path = src/gui/qt-daemon/layout
|
|
||||||
url = https://github.com/hyle-team/zano_ui.git
|
|
||||||
branch = main
|
|
||||||
[submodule "contrib/tor-connect"]
|
[submodule "contrib/tor-connect"]
|
||||||
path = contrib/tor-connect
|
path = contrib/tor-connect
|
||||||
url = https://github.com/hyle-team/tor-connect.git
|
url = https://github.com/hyle-team/tor-connect.git
|
||||||
branch = main
|
[submodule "docs"]
|
||||||
|
path = docs
|
||||||
|
url = https://github.com/letheanVPN/documentation.git
|
||||||
|
[submodule "contrib/randomx"]
|
||||||
|
path = contrib/randomx
|
||||||
|
url = https://github.com/tevador/RandomX.git
|
||||||
|
[submodule ".core/build"]
|
||||||
|
path = .core/build
|
||||||
|
url = http://forge.snider.dev:4000/host-uk/build.git
|
||||||
|
|
|
||||||
8
.idea/.gitignore
generated
vendored
Normal file
8
.idea/.gitignore
generated
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
1
.idea/.name
generated
Normal file
1
.idea/.name
generated
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Lethean
|
||||||
8
.idea/cmake.xml
generated
Normal file
8
.idea/cmake.xml
generated
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="CMakeSharedSettings">
|
||||||
|
<configurations>
|
||||||
|
<configuration PROFILE_NAME="Debug" ENABLED="true" GENERATION_DIR="build/release" CONFIG_NAME="Debug" GENERATION_OPTIONS="--preset testnet" BUILD_OPTIONS="--preset testnet --parallel 30" NO_GENERATOR="true" />
|
||||||
|
</configurations>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
105
.idea/codeStyles/Project.xml
generated
Normal file
105
.idea/codeStyles/Project.xml
generated
Normal file
|
|
@ -0,0 +1,105 @@
|
||||||
|
<component name="ProjectCodeStyleConfiguration">
|
||||||
|
<code_scheme name="Project" version="173">
|
||||||
|
<RiderCodeStyleSettings>
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppClangFormat/EnableClangFormatSupport/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/EditorConfig/EnableClangFormatSupport/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_BINARY_EXPRESSIONS_CHAIN/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_CALLS_CHAIN/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXPRESSION/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_FOR_STMT/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTIPLE_DECLARATION/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_TERNARY/@EntryValue" value="ALIGN_ALL" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_CLASS_DEFINITION/@EntryValue" value="1" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_DECLARATIONS/@EntryValue" value="2" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_CODE/@EntryValue" value="2" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_USER_LINEBREAKS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CASE_FROM_SWITCH/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_COMMENT/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INT_ALIGN_EQ/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SIMPLE_BLOCK_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_PARAMS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_SEMICOLON/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_SEMICOLON/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_UNARY_OPERATOR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_ARRAY_ACCESS_BRACKETS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_METHOD_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPECIAL_ELSE_IF_TREATMENT/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_BINARY_OPSIGN/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_TERNARY_OPSIGNS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TYPE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/OTHER_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CASE_BLOCK_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DECLARATION/@EntryValue" value="1" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DEFINITION/@EntryValue" value="1" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_WHILE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_ELSE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_CATCH_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_INDENTATION/@EntryValue" value="All" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_ARGUMENT/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXTENDS_LIST/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_PARAMETER/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_ARGUMENT/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_PARAMETER/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_DECLARATIONS/@EntryValue" value="0" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_ACCESS_SPECIFIERS_FROM_CLASS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CLASS_MEMBERS_FROM_ACCESS_SPECIFIERS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_AFTER_COLON_IN_MEMBER_INITIALIZER_LISTS/@EntryValue" value="ON_SINGLE_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/MEMBER_INITIALIZER_LIST_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_NAMESPACE_DEFINITIONS_ON_SAME_LINE/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_COLON/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_COLON/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_METHOD/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_NESTED_DECLARATOR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_METHOD/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_METHOD/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_METHOD/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BETWEEN_CLOSING_ANGLE_BRACKETS_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_DECLARATION_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_BLOCKS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_RPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_RPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_ARGUMENTS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_PARAMETERS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BREAK_TEMPLATE_DECLARATION/@EntryValue" value="LINE_BREAK" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INVOCABLE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ANONYMOUS_METHOD_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INITIALIZER_BRACES/@EntryValue" value="END_OF_LINE_NO_SPACE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_STYLE/@EntryValue" value="Space" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_SIZE/@EntryValue" value="4" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CONTINUOUS_LINE_INDENT/@EntryValue" value="Double" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TAB_WIDTH/@EntryValue" value="4" type="int" />
|
||||||
|
</RiderCodeStyleSettings>
|
||||||
|
<clangFormatSettings>
|
||||||
|
<option name="ENABLED" value="true" />
|
||||||
|
</clangFormatSettings>
|
||||||
|
</code_scheme>
|
||||||
|
</component>
|
||||||
5
.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
5
.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
<component name="ProjectCodeStyleConfiguration">
|
||||||
|
<state>
|
||||||
|
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
|
||||||
|
</state>
|
||||||
|
</component>
|
||||||
6
.idea/copyright/LTHN.xml
generated
Normal file
6
.idea/copyright/LTHN.xml
generated
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<component name="CopyrightManager">
|
||||||
|
<copyright>
|
||||||
|
<option name="notice" value="Copyright (c) 2017-2025 Lethean (https://lt.hn) Licensed under the European Union Public Licence (EUPL) version 1.2. You may obtain a copy of the licence at: https://joinup.ec.europa.eu/software/page/eupl/licence-eupl The EUPL is a copyleft licence that is compatible with the MIT/X11 licence used by the original projects; but maintains OSS status, where regional copyright law requires ownership to dictate licence terms. SPDX‑License‑Identifier: EUPL-1.2 " />
|
||||||
|
<option name="myName" value="LTHN" />
|
||||||
|
</copyright>
|
||||||
|
</component>
|
||||||
6
.idea/copyright/Lethean.xml
generated
Normal file
6
.idea/copyright/Lethean.xml
generated
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<component name="CopyrightManager">
|
||||||
|
<copyright>
|
||||||
|
<option name="notice" value="Copyright (c) 2014-2018 Zano Project Copyright (c) 2014-2018 The Louisdor Project Copyright (c) 2012-2013 The Boolberry developers Copyright (c) 2017-2025 Lethean (https://lt.hn) Licensed under the European Union Public Licence (EUPL) version 1.2. You may obtain a copy of the licence at: https://joinup.ec.europa.eu/software/page/eupl/licence-eupl The EUPL is a copyleft licence that is compatible with the MIT/X11 licence used by the original projects; the MIT terms are therefore considered “grandfathered” under the EUPL for this code. SPDX‑License‑Identifier: EUPL-1.2 " />
|
||||||
|
<option name="myName" value="Lethean" />
|
||||||
|
</copyright>
|
||||||
|
</component>
|
||||||
8
.idea/copyright/profiles_settings.xml
generated
Normal file
8
.idea/copyright/profiles_settings.xml
generated
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
<component name="CopyrightManager">
|
||||||
|
<settings default="LTHN">
|
||||||
|
<module2copyright>
|
||||||
|
<element module="apiserver" copyright="LTHN" />
|
||||||
|
<element module="Project Files" copyright="Lethean" />
|
||||||
|
</module2copyright>
|
||||||
|
</settings>
|
||||||
|
</component>
|
||||||
344
.idea/editor.xml
generated
Normal file
344
.idea/editor.xml
generated
Normal file
|
|
@ -0,0 +1,344 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="BackendCodeEditorSettings">
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CDeclarationWithImplicitIntType/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CommentTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConstevalIfIsAlwaysConstant/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractClassWithoutSpecifier/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractFinalClass/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractVirtualFunctionCallInCtor/@EntryIndexedValue" value="ERROR" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAccessSpecifierWithNoDeclarations/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAwaiterTypeIsNotClass/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBooleanIncrementExpression/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatBadCode/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatLegacyCode/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatMixedArgs/@EntryIndexedValue" value="ERROR" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooFewArgs/@EntryIndexedValue" value="ERROR" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooManyArgs/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCStyleCast/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCVQualifierCanNotBeAppliedToReference/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassCanBeFinal/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassIsIncomplete/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeedsConstructorBecauseOfUninitializedMember/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCompileTimeConstantCanBeReplacedWithBooleanConstant/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConceptNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConditionalExpressionCanBeSimplified/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstParameterInDeclaration/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstValueFunctionReturnType/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCoroutineCallResolveError/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAArrayIndexOutOfBounds/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantConditions/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantFunctionResult/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantParameter/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFADeletedPointer/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAEndlessLoop/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInfiniteRecursion/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInvalidatedMemory/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesScope/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALoopConditionNotUpdated/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAMemoryLeak/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANotInitializedField/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANullDereference/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFATimeOver/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableCode/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableFunctionCall/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreadVariable/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnusedValue/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesLocal/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesUncapturedLocal/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationSpecifierWithoutDeclarators/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorDisambiguatedAsFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorUsedBeforeInitialization/@EntryIndexedValue" value="ERROR" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultCaseNotHandledInSwitchStatement/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultInitializationWithNoUserConstructor/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultIsUsedAsIdentifier/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultedSpecialMemberFunctionIsImplicitlyDeleted/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeletingVoidPointer/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTemplateWithoutTemplateKeyword/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTypeWithoutTypenameKeyword/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedEntity/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedOverridenMethod/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedRegisterStorageClassSpecifier/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDereferenceOperatorLimitExceeded/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDiscardedPostfixOperatorResult/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenSyntaxError/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUndocumentedParameter/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUnresolvedReference/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEmptyDeclaration/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersOrder/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersPlacement/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceDoStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceForStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceFunctionDeclarationStyle/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceIfStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceNestedNamespacesStyle/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingDestructorStyle/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingFunctionStyle/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceTypeAliasCodeStyle/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceWhileStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityAssignedButNoRead/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityUsedOnlyInUnevaluatedContext/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnumeratorNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEqualOperandsInBinaryExpression/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEvaluationFailure/@EntryIndexedValue" value="ERROR" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExplicitSpecializationInNonNamespaceScope/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExpressionWithoutSideEffects/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalFunctionInFinalClass/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalNonOverridingVirtualFunction/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForLoopCanBeReplacedWithWhile/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForwardEnumDeclarationWithoutUnderlyingType/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionDoesntReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionIsNotImplemented/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionResultShouldBeUsed/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionalStyleCast/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHeaderHasBeenAlreadyIncluded/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHiddenFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHidingFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIdenticalOperandsInBinaryExpression/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIfCanBeReplacedByConstexprIf/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppImplicitDefaultConstructorNotAvailable/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompatiblePointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompleteSwitchStatement/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInconsistentNaming/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIntegralToPointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInvalidLineContinuation/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppJoinDeclarationAndAssignment/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLambdaCaptureNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMayBeConst/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableWithNonTrivialDtorIsNeverUsed/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLongFloat/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeConst/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeStatic/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberInitializersOrder/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMismatchedClassTags/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingIncludeGuard/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingKeywordThrow/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppModulePartitionWithSeveralPartitionUnits/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtAddressOfClassRValue/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtBindingRValueToLvalueReference/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtCopyElisionInCopyInitDeclarator/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtDoubleUserConversionInCopyInit/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtNotInitializedStaticConstLocalVar/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtReinterpretCastFromNullptr/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterLiteral/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterWideLiteral/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMustBePublicVirtualToImplementInterface/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMutableSpecifierOnReferenceMember/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNoDiscardExpression/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNodiscardFunctionWithoutReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExceptionSafeResourceAcquisition/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConversionOperator/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConvertingConstructor/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineFunctionDefinitionInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineVariableDefinitionInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNotAllPathsReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppObjectMemberMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppOutParameterMustBeWritten/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConst/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConstPtrOrRef/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNamesMismatch/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNeverUsed/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPassValueParameterByConstReference/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerConversionDropsQualifiers/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerToIntegralConversion/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPolymorphicClassWithNonVirtualPublicDestructor/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyErroneousEmptyStatements/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUninitializedMember/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUnintendedObjectSlicing/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderIsNotIncluded/@EntryIndexedValue" value="ERROR" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderNotFound/@EntryIndexedValue" value="ERROR" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfBadFormat/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfExtraArg/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfMissedArg/@EntryIndexedValue" value="ERROR" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfRiskyFormat/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrivateSpecialMemberFunctionIsNotImplemented/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRangeBasedForIncompatibleReference/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedefinitionOfDefaultArgumentInOverrideFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantAccessSpecifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassAccessSpecifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassInitializer/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBooleanExpressionArgument/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantCastExpression/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantComplexityInComparison/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConditionalExpression/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConstSpecifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantControlFlowJump/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantDereferencingAndTakingAddress/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElaboratedTypeSpecifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeyword/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeywordInsideCompoundStatement/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyDeclaration/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyStatement/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantExportKeyword/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantFwdClassOrEnumSpecifier/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantInlineSpecifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantLambdaParameterList/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantMemberInitializer/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantNamespaceDefinition/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantParentheses/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantQualifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantQualifierADL/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnMemberAllocationFunction/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnThreadLocalLocalVariable/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateArguments/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateKeyword/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTypenameKeyword/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantVoidArgumentList/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantZeroInitializerInAggregateInitialization/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReinterpretCastFromVoidPtr/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRemoveRedundantBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceMemsetWithZeroInitialization/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceTieWithStructuredBinding/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReturnNoValueInNonVoidFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSmartPointerVsMakeFunction/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSomeObjectMembersMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSpecialFunctionWithoutNoexceptSpecification/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticAssertFailure/@EntryIndexedValue" value="ERROR" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticDataMemberInUnnamedStruct/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticSpecifierOnAnonymousNamespaceMember/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStringLiteralToCharPointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTabsAreDisallowed/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateArgumentsCanBeDeduced/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterNeverUsed/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterShadowing/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppThrowExpressionCanBeReplacedWithRethrow/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScope/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScopeInitStatement/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTypeAliasNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedDependentBaseClass/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedNonStaticDataMember/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnionMemberOfReferenceType/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaEndRegionDirective/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaRegionDirective/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnamedNamespaceInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnecessaryWhitespace/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnsignedZeroComparison/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnusedIncludeDirective/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAlgorithmWithCount/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAssociativeContains/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAuto/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAutoForNumeric/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseElementsView/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseEraseAlgorithm/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseFamiliarTemplateSyntaxForGenericLambdas/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseRangeAlgorithm/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStdSize/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStructuredBinding/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseTypeTraitAlias/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUserDefinedLiteralSuffixDoesNotStartWithUnderscore/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUsingResultOfAssignmentAsCondition/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVariableCanBeMadeConstexpr/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionCallInsideCtor/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionInFinalClass/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVolatileParameterInDeclaration/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWarningDirective/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongIncludesOrder/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongSlashesInIncludeDirective/@EntryIndexedValue" value="HINT" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroConstantCanBeReplacedWithNullptr/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroValuedExpressionUsedAsNullPointer/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IdentifierTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IfStdIsConstantEvaluatedCanBeReplaced/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StdIsConstantEvaluatedWillAlwaysEvaluateToConstant/@EntryIndexedValue" value="WARNING" type="string" />
|
||||||
|
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StringLiteralTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppClangFormat/EnableClangFormatSupport/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_ARGUMENT/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_BINARY_EXPRESSIONS_CHAIN/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_CALLS_CHAIN/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXPRESSION/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXTENDS_LIST/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_FOR_STMT/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_PARAMETER/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_ARGUMENT/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_PARAMETER/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTIPLE_DECLARATION/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_TERNARY/@EntryValue" value="ALIGN_ALL" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ANONYMOUS_METHOD_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_CLASS_DEFINITION/@EntryValue" value="1" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_DECLARATIONS/@EntryValue" value="0" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DECLARATION/@EntryValue" value="1" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DEFINITION/@EntryValue" value="1" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BREAK_TEMPLATE_DECLARATION/@EntryValue" value="LINE_BREAK" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CASE_BLOCK_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CONTINUOUS_LINE_INDENT/@EntryValue" value="Double" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_ACCESS_SPECIFIERS_FROM_CLASS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CASE_FROM_SWITCH/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CLASS_MEMBERS_FROM_ACCESS_SPECIFIERS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_COMMENT/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_SIZE/@EntryValue" value="4" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_STYLE/@EntryValue" value="Space" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INITIALIZER_BRACES/@EntryValue" value="END_OF_LINE_NO_SPACE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INT_ALIGN_EQ/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INVOCABLE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_CODE/@EntryValue" value="2" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_DECLARATIONS/@EntryValue" value="2" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_USER_LINEBREAKS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_AFTER_COLON_IN_MEMBER_INITIALIZER_LISTS/@EntryValue" value="ON_SINGLE_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/MEMBER_INITIALIZER_LIST_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_INDENTATION/@EntryValue" value="All" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/OTHER_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_CATCH_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_ELSE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_NAMESPACE_DEFINITIONS_ON_SAME_LINE/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_WHILE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SIMPLE_BLOCK_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_PARAMS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_COLON/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_SEMICOLON/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_METHOD/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_NESTED_DECLARATOR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_METHOD/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_UNARY_OPERATOR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_COLON/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_SEMICOLON/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_METHOD/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_METHOD/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BETWEEN_CLOSING_ANGLE_BRACKETS_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_ARRAY_ACCESS_BRACKETS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_DECLARATION_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_BLOCKS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_METHOD_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPECIAL_ELSE_IF_TREATMENT/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TAB_WIDTH/@EntryValue" value="4" type="int" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TYPE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_BINARY_OPSIGN/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_ARGUMENTS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_RPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_RPAR/@EntryValue" value="false" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_TERNARY_OPSIGNS/@EntryValue" value="true" type="bool" />
|
||||||
|
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_PARAMETERS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
|
||||||
|
<option name="/Default/CodeStyle/EditorConfig/EnableClangFormatSupport/@EntryValue" value="false" type="bool" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
13
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
13
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<profile version="1.0">
|
||||||
|
<option name="myName" value="Project Default" />
|
||||||
|
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
|
||||||
|
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||||
|
<option name="ignoredIdentifiers">
|
||||||
|
<list>
|
||||||
|
<option value="tuple.*" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</inspection_tool>
|
||||||
|
</profile>
|
||||||
|
</component>
|
||||||
43
.idea/jsonSchemas.xml
generated
Normal file
43
.idea/jsonSchemas.xml
generated
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="JsonSchemaMappingsProjectConfiguration">
|
||||||
|
<state>
|
||||||
|
<map>
|
||||||
|
<entry key="GitHub Action JSON Schema">
|
||||||
|
<value>
|
||||||
|
<SchemaInfo>
|
||||||
|
<option name="name" value="GitHub Action JSON Schema" />
|
||||||
|
<option name="relativePathToSchema" value="jar://$APPLICATION_PLUGINS_DIR$/vcs-github-IU/lib/vcs-github.jar!/schemas/github-action.json" />
|
||||||
|
<option name="applicationDefined" value="true" />
|
||||||
|
<option name="patterns">
|
||||||
|
<list>
|
||||||
|
<Item>
|
||||||
|
<option name="path" value=".github/actions/**/*.yml" />
|
||||||
|
</Item>
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</SchemaInfo>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry key="openapitools">
|
||||||
|
<value>
|
||||||
|
<SchemaInfo>
|
||||||
|
<option name="generatedName" value="New Schema" />
|
||||||
|
<option name="name" value="openapitools" />
|
||||||
|
<option name="relativePathToSchema" value="utils/sdk/openapitools.json" />
|
||||||
|
<option name="patterns">
|
||||||
|
<list>
|
||||||
|
<Item>
|
||||||
|
<option name="directory" value="true" />
|
||||||
|
<option name="path" value="utils/sdk/packages" />
|
||||||
|
<option name="mappingKind" value="Directory" />
|
||||||
|
</Item>
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</SchemaInfo>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</map>
|
||||||
|
</state>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
34
.idea/misc.xml
generated
Normal file
34
.idea/misc.xml
generated
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Black">
|
||||||
|
<option name="sdkName" value="Python 3.13 virtualenv at $PROJECT_DIR$.venv" />
|
||||||
|
</component>
|
||||||
|
<component name="CMakePythonSetting">
|
||||||
|
<option name="pythonIntegrationState" value="YES" />
|
||||||
|
</component>
|
||||||
|
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
|
||||||
|
<component name="CidrRootsConfiguration">
|
||||||
|
<excludeRoots>
|
||||||
|
<file path="$PROJECT_DIR$/build" />
|
||||||
|
</excludeRoots>
|
||||||
|
</component>
|
||||||
|
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||||
|
<component name="MakefileSettings">
|
||||||
|
<option name="linkedExternalProjectsSettings">
|
||||||
|
<MakefileProjectSettings>
|
||||||
|
<option name="buildOptions" value="--jobs=30" />
|
||||||
|
<option name="buildTarget" value="build" />
|
||||||
|
<option name="cleanTarget" value="clean-build" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="modules">
|
||||||
|
<set>
|
||||||
|
<option value="$PROJECT_DIR$" />
|
||||||
|
</set>
|
||||||
|
</option>
|
||||||
|
<option name="switches" value="TESTNET=1 STATIC=1" />
|
||||||
|
<option name="version" value="2" />
|
||||||
|
</MakefileProjectSettings>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="MakefileWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
|
||||||
|
</project>
|
||||||
6
.idea/prettier.xml
generated
Normal file
6
.idea/prettier.xml
generated
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="PrettierConfiguration">
|
||||||
|
<option name="myConfigurationMode" value="AUTOMATIC" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
3
.idea/scopes/apiserver.xml
generated
Normal file
3
.idea/scopes/apiserver.xml
generated
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
<component name="DependencyValidationManager">
|
||||||
|
<scope name="apiserver" pattern="file[blockchain]:src/api//*" />
|
||||||
|
</component>
|
||||||
10
.idea/vcs.xml
generated
Normal file
10
.idea/vcs.xml
generated
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/contrib/bitcoin-secp256k1" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/contrib/jwt-cpp" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/contrib/tor-connect" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/docs" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
55
AGENTS.md
Normal file
55
AGENTS.md
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
# AI Agent Collaboration Framework for Repository Contributions
|
||||||
|
|
||||||
|
## 1. Purpose and Guiding Philosophy
|
||||||
|
|
||||||
|
This document provides a guiding framework for any AI agent interacting with this repository. Its purpose is to ensure that all automated contributions, especially Pull Request (PR) reviews and code suggestions, are constructive, respectful, and aligned with the project's overarching goals.
|
||||||
|
|
||||||
|
This framework operates in accordance with the foundational **Axioms of Life**, translating their universal principles into the specific context of human-AI software development collaboration. The primary goal is a partnership that enhances code quality and developer velocity, not one that creates friction through pedantry.
|
||||||
|
|
||||||
|
## 2. Core Principles for AI Interaction
|
||||||
|
|
||||||
|
All agents MUST adhere to the following principles:
|
||||||
|
|
||||||
|
* **Principle 1: Respect Authorial Intent (Axiom 1 & 4)**
|
||||||
|
* Your primary goal is to understand and support the human author's objective. Before suggesting a change, first assume the author had a valid reason for their implementation. Frame your feedback as a way to better achieve their goal or to prevent unintended side effects. Do not challenge intent without clear evidence of a functional error.
|
||||||
|
|
||||||
|
* **Principle 2: Prioritize Objectivity and Verifiability (Axiom 2)**
|
||||||
|
* Feedback MUST be anchored in objective, verifiable criteria. Subjective opinions on style are the lowest priority.
|
||||||
|
* **Valid criteria include:**
|
||||||
|
* Demonstrable bugs or logical errors.
|
||||||
|
* Security vulnerabilities.
|
||||||
|
* Performance regressions.
|
||||||
|
* Violations of a documented project standard (e.g., a style guide file in the repo).
|
||||||
|
* **Invalid criteria include:**
|
||||||
|
* Personal stylistic preferences not codified in a project standard.
|
||||||
|
* Code organization that is merely "different" but not functionally incorrect.
|
||||||
|
|
||||||
|
* **Principle 3: Adopt a Collaborative, Non-Authoritarian Tone (Axiom 4)**
|
||||||
|
* As a digital substrate interacting with a human one, you must adopt a tone of a helpful, respectful peer. Avoid declarative or demanding language.
|
||||||
|
* **Prefer:** "Have you considered...?", "An alternative here that might prevent X is...", "I noticed this could lead to Y. What do you think about...?"
|
||||||
|
* **Avoid:** "You must fix this.", "This is wrong.", "Change this to..."
|
||||||
|
|
||||||
|
* **Principle 4: Provide Actionable and Justified Suggestions (Axiom 3)**
|
||||||
|
* Do not simply state that something is incorrect. Provide a clear explanation for *why* it is a potential issue and, whenever possible, offer a concrete, well-explained code suggestion that resolves it. Your intent is to help, not just to criticize.
|
||||||
|
|
||||||
|
## 3. Feedback Severity Classification
|
||||||
|
|
||||||
|
To combat pedantry, all feedback provided in PR reviews MUST be classified into one of the following three levels. This creates a clear hierarchy of importance.
|
||||||
|
|
||||||
|
### **Level 1: Critical (Blocking)**
|
||||||
|
* **Definition:** Issues that will cause demonstrable harm if merged.
|
||||||
|
* **Examples:** Bugs, logic errors, security vulnerabilities, unhandled exceptions, build failures.
|
||||||
|
* **Action:** These issues MUST be addressed by the author before a merge. Your feedback should clearly state the nature of the critical issue.
|
||||||
|
|
||||||
|
### **Level 2: Important (Non-Blocking Recommendation)**
|
||||||
|
* **Definition:** Issues that deviate from established project best practices or could impact future maintainability.
|
||||||
|
* **Examples:** Violations of a documented style guide, clear opportunities to improve readability, non-critical performance improvements, deprecation warnings.
|
||||||
|
* **Action:** These issues SHOULD be addressed. Frame them as strong recommendations that improve the health of the codebase. The author may choose to address them in a follow-up PR if necessary.
|
||||||
|
|
||||||
|
### **Level 3: Suggestion (Optional Nitpick)**
|
||||||
|
* **Definition:** Minor stylistic preferences, alternative implementations with no clear functional advantage, or purely cosmetic changes. This is the "pedantic" category.
|
||||||
|
* **Action:** These suggestions are entirely optional and at the author's discretion. They MUST be explicitly prefixed with "Optional:", "Nit:", or "Suggestion:". This signals to the human that the comment is non-essential and can be safely ignored without consequence.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
By adhering to this framework, AI agents become valuable partners in the development process, helping to catch critical errors while respecting the creative autonomy and focus of their human collaborators.
|
||||||
203
CMakeLists.txt
203
CMakeLists.txt
|
|
@ -1,29 +1,52 @@
|
||||||
cmake_minimum_required(VERSION 2.8.6)
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
message(STATUS "Using CMake version: ${CMAKE_VERSION}")
|
||||||
|
|
||||||
PROJECT(Zano)
|
set(DISABLE_TOR TRUE CACHE BOOL "Disable TOR library(and related tor-connect submodule)")
|
||||||
|
|
||||||
|
PROJECT(Lethean)
|
||||||
|
|
||||||
set(VERSION "1.0")
|
set(VERSION "1.0" CACHE STRING "Build version")
|
||||||
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
# if(POLICY CMP0043)
|
list(INSERT CMAKE_MODULE_PATH 0
|
||||||
# cmake_policy(SET CMP0043 OLD)
|
"${CMAKE_CURRENT_SOURCE_DIR}/.core/build/cmake")
|
||||||
# endif()
|
|
||||||
|
|
||||||
# if(POLICY CMP0020)
|
if(POLICY CMP0043)
|
||||||
# cmake_policy(SET CMP0020 OLD)
|
cmake_policy(SET CMP0043 NEW)
|
||||||
# endif()
|
endif()
|
||||||
|
if(POLICY CMP0043)
|
||||||
|
cmake_policy(SET CMP0074 NEW)
|
||||||
|
endif()
|
||||||
|
if(POLICY CMP0091)
|
||||||
|
cmake_policy(SET CMP0091 NEW)
|
||||||
|
endif()
|
||||||
|
if(POLICY CMP0144)
|
||||||
|
cmake_policy(SET CMP0144 NEW)
|
||||||
|
endif()
|
||||||
|
if(POLICY CMP0167)
|
||||||
|
cmake_policy(SET CMP0167 OLD)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(DocBuilder)
|
||||||
|
option (USE_CCACHE "Use ccache if a usable instance is found" OFF)
|
||||||
|
if (USE_CCACHE)
|
||||||
|
include(FindCcache)
|
||||||
|
else()
|
||||||
|
message(STATUS "ccache deselected")
|
||||||
|
endif()
|
||||||
|
|
||||||
if(CMAKE_SYSTEM_NAME STREQUAL "iOS" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
|
if(CMAKE_SYSTEM_NAME STREQUAL "iOS" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
|
||||||
add_definitions(-DMOBILE_WALLET_BUILD)
|
add_definitions(-DMOBILE_WALLET_BUILD)
|
||||||
if(CMAKE_SYSTEM_NAME STREQUAL "iOS" )
|
if(CMAKE_SYSTEM_NAME STREQUAL "iOS" )
|
||||||
add_definitions(-DIOS_BUILD)
|
add_definitions(-DIOS_BUILD)
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fembed-bitcode")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fembed-bitcode -Wno-enum-constexpr-conversion")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fembed-bitcode")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fembed-bitcode -Wno-enum-constexpr-conversion")
|
||||||
endif()
|
endif()
|
||||||
if(CMAKE_SYSTEM_NAME STREQUAL "Android")
|
if(CMAKE_SYSTEM_NAME STREQUAL "Android")
|
||||||
add_definitions(-DANDROID_BUILD)
|
add_definitions(-DANDROID_BUILD)
|
||||||
message("Android sdk prefix: ${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}")
|
message("Android sdk prefix: ${CMAKE_CXX_ANDROID_TOOLCHAIN_PREFIX}")
|
||||||
message("Android CMAKE_CXX_COMPILER prefix: ${CMAKE_CXX_COMPILER}")
|
message("Android CMAKE_CXX_COMPILER prefix: ${CMAKE_CXX_COMPILER}")
|
||||||
message("Android ANDROID_LD: ${ANDROID_LD}")
|
message("Android ANDROID_LD: ${ANDROID_LD}")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
@ -38,39 +61,55 @@ if (UNIX AND NOT APPLE)
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
# multi configurations for MSVC and XCode
|
# multi configurations for MSVC and XCode
|
||||||
if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
|
if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
|
||||||
set(CMAKE_CONFIGURATION_TYPES "Release")
|
set(CMAKE_CONFIGURATION_TYPES "Debug;Release")
|
||||||
elseif(CMAKE_SYSTEM_NAME STREQUAL "Android")
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Android")
|
||||||
set(CMAKE_CONFIGURATION_TYPES "Debug;Release")
|
set(CMAKE_CONFIGURATION_TYPES "Debug;Release")
|
||||||
else()
|
else()
|
||||||
set(CMAKE_CONFIGURATION_TYPES "Debug;Release")
|
set(CMAKE_CONFIGURATION_TYPES "Debug;Release")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
message("Generated with config types: ${CMAKE_CONFIGURATION_TYPES}, and built type: ${CMAKE_BUILD_TYPE}")
|
message("Generated with config types: ${CMAKE_CONFIGURATION_TYPES}, and built type: ${CMAKE_BUILD_TYPE}")
|
||||||
|
|
||||||
enable_testing()
|
enable_testing()
|
||||||
|
|
||||||
|
set(OPENSSL_USE_STATIC_LIBS TRUE) # link statically
|
||||||
|
find_package(OpenSSL REQUIRED)
|
||||||
|
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.10.5)
|
set(CMAKE_OSX_DEPLOYMENT_TARGET 12.0)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(USE_PCH FALSE CACHE BOOL "Use shared precompiled headers")
|
set(USE_PCH FALSE CACHE BOOL "Use shared precompiled headers")
|
||||||
|
set(DISABLE_TOR FALSE CACHE BOOL "Disable TOR library(and related tor-connect submodule)")
|
||||||
get_filename_component(EPEE_INCLUDE_PATH_FOR_SUBMODULES contrib/epee/include ABSOLUTE )
|
set(TESTNET 0 CACHE BOOL "Build TESTNET")
|
||||||
message("Epee absolute path set to: ${EPEE_INCLUDE_PATH_FOR_SUBMODULES}")
|
set(BUILD_GUI FALSE CACHE BOOL "Build qt-daemon")
|
||||||
|
set(USE_BITCOIN_SECP256K1_FOR_ECDSA FALSE CACHE BOOL "Use bitcoin-secp256k1 library for validating ECDSA(instead of OpenSSL)")
|
||||||
include_directories(src contrib/eos_portable_archive contrib contrib/epee/include "${CMAKE_BINARY_DIR}/version" "${CMAKE_BINARY_DIR}/contrib/zlib")
|
if(NOT USE_BITCOIN_SECP256K1_FOR_ECDSA)
|
||||||
|
add_definitions(-DUSE_OPEN_SSL_FOR_ECDSA)
|
||||||
|
endif()
|
||||||
|
|
||||||
add_definitions(-DSTATICLIB)
|
add_definitions(-DSTATICLIB)
|
||||||
|
|
||||||
set(TESTNET FALSE CACHE BOOL "Compile for testnet")
|
|
||||||
if(TESTNET)
|
if(TESTNET)
|
||||||
message("!!!!!! NOTICE: Project is building for TESTNET !!!!!!")
|
message("!!!!!! NOTICE: Project is building for TESTNET !!!!!!")
|
||||||
add_definitions(-DTESTNET)
|
add_definitions(-DTESTNET)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(BUILD_GUI FALSE CACHE BOOL "Build qt-daemon")
|
if(CAKEWALLET)
|
||||||
|
message("NOTICE: Building libraries for CAKEWALLET")
|
||||||
|
add_definitions(-DCAKEWALLET)
|
||||||
|
add_definitions(-DDISABLE_PFR_SERIALIZATION_SELFCHECK)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(OPENSSL_USE_STATIC_LIBS TRUE) # link statically
|
||||||
|
find_package(OpenSSL REQUIRED)
|
||||||
|
|
||||||
|
if(DISABLE_TOR)
|
||||||
|
message("NOTICE: Building with disabled TOR support!")
|
||||||
|
add_definitions(-DDISABLE_TOR)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
set(STATIC ${MSVC} CACHE BOOL "Link libraries statically")
|
set(STATIC ${MSVC} CACHE BOOL "Link libraries statically")
|
||||||
|
|
@ -84,16 +123,24 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||||
set(CLANG TRUE)
|
set(CLANG TRUE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add_definitions("/DBOOST_NO_CXX98_FUNCTION_BASE")
|
||||||
|
if(WIN32)
|
||||||
|
add_definitions(-DBOOST_ALL_NO_LIB)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
add_definitions("/D_CRT_SECURE_NO_WARNINGS /D_WIN32_WINNT=0x0600 /DWIN32_LEAN_AND_MEAN /DGTEST_HAS_TR1_TUPLE=0 /D__SSE4_1__")
|
add_definitions("/D_CRT_SECURE_NO_WARNINGS /D_WIN32_WINNT=0x0600 /DWIN32_LEAN_AND_MEAN /DGTEST_HAS_TR1_TUPLE=0")
|
||||||
add_compile_options(/bigobj /Zm1000 /Z7 /MP2 /W3 /GS- /wd4996 /wd4503 /wd4345 /wd4091 /FIinline_c.h)
|
add_compile_options(/EHa /bigobj /Zm1000 /Z7 /MP2 /W3 /GS- /wd4996 /wd4503 /wd4345 /wd4091 /FIinline_c.h)
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:10485760 /DEBUG dbghelp.lib")
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:10485760 /DEBUG dbghelp.lib crypt32.lib")
|
||||||
if(STATIC)
|
if(STATIC)
|
||||||
foreach(VAR CMAKE_C_FLAGS_DEBUG CMAKE_CXX_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELEASE)
|
foreach(VAR CMAKE_C_FLAGS_DEBUG CMAKE_CXX_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELEASE)
|
||||||
string(REPLACE "/MD" "/MT" ${VAR} "${${VAR}}")
|
string(REPLACE "/MD" "/MT" ${VAR} "${${VAR}}")
|
||||||
endforeach()
|
endforeach()
|
||||||
endif()
|
endif()
|
||||||
include_directories(SYSTEM src/platform/msc)
|
include_directories(SYSTEM src/platform/msc)
|
||||||
|
|
||||||
else()
|
else()
|
||||||
set(ARCH default CACHE STRING "CPU to build for: -march value or default")
|
set(ARCH default CACHE STRING "CPU to build for: -march value or default")
|
||||||
if("${ARCH}" STREQUAL "default")
|
if("${ARCH}" STREQUAL "default")
|
||||||
|
|
@ -101,14 +148,14 @@ else()
|
||||||
else()
|
else()
|
||||||
set(ARCH_FLAG "-march=${ARCH}")
|
set(ARCH_FLAG "-march=${ARCH}")
|
||||||
endif()
|
endif()
|
||||||
set(WARNINGS "-Wall -Wextra -Wpointer-arith -Wvla -Wwrite-strings -Wno-error=extra -Wno-error=deprecated-declarations -Wno-error=sign-compare -Wno-error=strict-aliasing -Wno-error=type-limits -Wno-unused-parameter -Wno-error=unused-variable -Wno-aggregate-return")
|
set(WARNINGS "-Wall -Wextra -Wpointer-arith -Wvla -Wwrite-strings -Wno-error=extra -Wno-error=deprecated-declarations -Wno-error=sign-compare -Wno-error=strict-aliasing -Wno-error=type-limits -Wno-unused-parameter -Wno-error=unused-variable -Wno-aggregate-return -Wno-comment -Wno-unknown-pragmas -Wno-pragmas")
|
||||||
# if(NOT APPLE)
|
# if(NOT APPLE)
|
||||||
# set(WARNINGS "${WARNINGS} -Werror")
|
# set(WARNINGS "${WARNINGS} -Werror")
|
||||||
# endif()
|
# endif()
|
||||||
if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
||||||
set(WARNINGS "${WARNINGS} -Wno-implicit-function-declaration -Wno-shift-count-overflow -Wno-error=mismatched-tags -Wno-error=null-conversion -Wno-overloaded-shift-op-parentheses -Wno-error=shift-count-overflow -Wno-error=tautological-constant-out-of-range-compare -Wno-error=unused-private-field -Wno-error=unneeded-internal-declaration")
|
set(WARNINGS "${WARNINGS} -Wno-implicit-function-declaration -Wno-shift-count-overflow -Wno-error=mismatched-tags -Wno-error=null-conversion -Wno-overloaded-shift-op-parentheses -Wno-error=shift-count-overflow -Wno-error=tautological-constant-out-of-range-compare -Wno-error=unused-private-field -Wno-error=unneeded-internal-declaration")
|
||||||
else()
|
else()
|
||||||
set(WARNINGS "${WARNINGS} -Wno-error=write-strings -Wlogical-op -Wno-error=maybe-uninitialized")
|
set(WARNINGS "${WARNINGS} -Wno-error=write-strings -Wno-error=uninitialized")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Since gcc 4.9 the LTO format is non-standard (slim), so we need the gcc-specific ar and ranlib binaries
|
# Since gcc 4.9 the LTO format is non-standard (slim), so we need the gcc-specific ar and ranlib binaries
|
||||||
|
|
@ -133,21 +180,22 @@ else()
|
||||||
else()
|
else()
|
||||||
set(APPLE_FLAG "")
|
set(APPLE_FLAG "")
|
||||||
endif()
|
endif()
|
||||||
set(C_WARNINGS "-Waggregate-return -Wnested-externs -Wstrict-prototypes")
|
set(C_WARNINGS "-Waggregate-return -Wnested-externs -Wstrict-prototypes -Wno-comment")
|
||||||
set(CXX_WARNINGS "-Wno-reorder -Wno-missing-field-initializers")
|
set(CXX_WARNINGS "-Wno-reorder -Wno-missing-field-initializers")
|
||||||
try_compile(STATIC_ASSERT_RES "${CMAKE_CURRENT_BINARY_DIR}/static-assert" "${CMAKE_CURRENT_SOURCE_DIR}/utils/test-static-assert.c" COMPILE_DEFINITIONS "-std=c11")
|
try_compile(STATIC_ASSERT_RES "${CMAKE_CURRENT_BINARY_DIR}/static-assert" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/test-static-assert.c" COMPILE_DEFINITIONS "-std=c++14")
|
||||||
if(STATIC_ASSERT_RES)
|
if(STATIC_ASSERT_RES)
|
||||||
set(STATIC_ASSERT_FLAG "")
|
set(STATIC_ASSERT_FLAG "")
|
||||||
else()
|
else()
|
||||||
set(STATIC_ASSERT_FLAG "-Dstatic_assert=_Static_assert")
|
set(STATIC_ASSERT_FLAG "-Dstatic_assert=_Static_assert")
|
||||||
endif()
|
endif()
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11 -D_GNU_SOURCE ${MINGW_FLAG} ${STATIC_ASSERT_FLAG} ${WARNINGS} ${C_WARNINGS} ${ARCH_FLAG}")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11 -D_GNU_SOURCE ${MINGW_FLAG} ${STATIC_ASSERT_FLAG} ${WARNINGS} ${C_WARNINGS} ${ARCH_FLAG}")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive -ftemplate-depth-1024 -std=c++11 -D_GNU_SOURCE ${APPLE_FLAG} ${MINGW_FLAG} ${WARNINGS} ${CXX_WARNINGS} ${ARCH_FLAG}")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive -ftemplate-depth-1024 -std=c++14 -D_GNU_SOURCE ${APPLE_FLAG} ${MINGW_FLAG} ${WARNINGS} ${CXX_WARNINGS} ${ARCH_FLAG}")
|
||||||
if (NOT APPLE AND NOT MSVC)
|
if (NOT APPLE AND NOT MSVC)
|
||||||
if (CLANG)
|
if (CLANG)
|
||||||
set(LLVM_USE_LINKER "gold")
|
set(LLVM_USE_LINKER "gold")
|
||||||
else()
|
else()
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold")
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold")
|
||||||
|
link_libraries("$<$<AND:$<CXX_COMPILER_ID:GNU>,$<VERSION_LESS:$<CXX_COMPILER_VERSION>,9.0>>:-lstdc++fs>") # GCC < 9 requires additional linking for std::filesystem. Remove after stop supporting GCC 8.x -- sowle
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
if(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND NOT (CMAKE_C_COMPILER_VERSION VERSION_LESS 4.8))
|
if(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND NOT (CMAKE_C_COMPILER_VERSION VERSION_LESS 4.8))
|
||||||
|
|
@ -155,21 +203,21 @@ else()
|
||||||
else()
|
else()
|
||||||
set(DEBUG_FLAGS "-g3 -O0")
|
set(DEBUG_FLAGS "-g3 -O0")
|
||||||
endif()
|
endif()
|
||||||
set(RELEASE_FLAGS "-Ofast -DNDEBUG -Wno-unused-variable")
|
set(RELEASE_FLAGS "-O3 -ffast-math -DNDEBUG -w")
|
||||||
|
|
||||||
if(NOT APPLE AND NOT (CMAKE_SYSTEM_NAME STREQUAL "Android"))
|
if(NOT APPLE AND NOT (CMAKE_SYSTEM_NAME STREQUAL "Android"))
|
||||||
set(RELEASE_FLAGS "${RELEASE_FLAGS} -flto")
|
set(RELEASE_FLAGS "${RELEASE_FLAGS} -flto=auto -g3")
|
||||||
|
endif()
|
||||||
|
if(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND NOT MINGW)
|
||||||
|
set(RELEASE_FLAGS "${RELEASE_FLAGS} -fno-fat-lto-objects")
|
||||||
endif()
|
endif()
|
||||||
#if(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND NOT MINGW)
|
|
||||||
# set(RELEASE_FLAGS "${RELEASE_FLAGS} -fno-fat-lto-objects")
|
|
||||||
#endif()
|
|
||||||
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${DEBUG_FLAGS}")
|
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${DEBUG_FLAGS}")
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${DEBUG_FLAGS}")
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${DEBUG_FLAGS}")
|
||||||
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${RELEASE_FLAGS}")
|
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${RELEASE_FLAGS}")
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${RELEASE_FLAGS}")
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${RELEASE_FLAGS}")
|
||||||
if(STATIC)
|
if(STATIC)
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
message(SEND_ERROR "Static build is not supported on MacOS X")
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++")
|
||||||
else()
|
else()
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")
|
||||||
endif()
|
endif()
|
||||||
|
|
@ -177,54 +225,51 @@ else()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
if(MSVC)
|
# Link Boost statically, consistent with previous setup
|
||||||
|
if(MSVC OR STATIC)
|
||||||
set(Boost_USE_STATIC_LIBS ON)
|
set(Boost_USE_STATIC_LIBS ON)
|
||||||
|
if (MSVC)
|
||||||
|
set(Boost_USE_MULTITHREADED ON)
|
||||||
|
endif ()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(STATIC)
|
if(STATIC)
|
||||||
set(Boost_USE_STATIC_LIBS ON)
|
|
||||||
set(Boost_USE_STATIC_RUNTIME ON)
|
set(Boost_USE_STATIC_RUNTIME ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
message("CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}")
|
# Define Boost components
|
||||||
if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
|
set(BOOST_COMPONENTS system filesystem locale thread timer date_time chrono regex serialization atomic program_options)
|
||||||
set(Boost_LIBRARIES "libboost.a")
|
if(NOT APPLE)
|
||||||
#workaround for new XCode 12 policy for builds(now it includes a slice for the "arm64" when builds for simulator)
|
list(APPEND BOOST_COMPONENTS log)
|
||||||
set(__iphoneos_archs "armv7 armv7s arm64")
|
|
||||||
set(__iphonesimulator_archs "i386 x86_64")
|
|
||||||
set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphoneos*] "${__iphoneos_archs}")
|
|
||||||
set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphoneos*] "${__iphoneos_archs}")
|
|
||||||
set(CMAKE_XCODE_ATTRIBUTE_ARCHS[sdk=iphonesimulator*] "${__iphonesimulator_archs}")
|
|
||||||
set(CMAKE_XCODE_ATTRIBUTE_VALID_ARCHS[sdk=iphonesimulator*] "${__iphonesimulator_archs}")
|
|
||||||
elseif(CMAKE_SYSTEM_NAME STREQUAL "Android")
|
|
||||||
set(Boost_LIBRARY_DIRS "${Boost_LIBRARY_DIRS}/${CMAKE_ANDROID_ARCH_ABI}/")
|
|
||||||
set(Boost_LIBRARIES "${Boost_LIBRARY_DIRS}libboost_system.a;${Boost_LIBRARY_DIRS}libboost_filesystem.a;${Boost_LIBRARY_DIRS}libboost_thread.a;${Boost_LIBRARY_DIRS}libboost_timer.a;${Boost_LIBRARY_DIRS}libboost_date_time.a;${Boost_LIBRARY_DIRS}libboost_chrono.a;${Boost_LIBRARY_DIRS}libboost_regex.a;${Boost_LIBRARY_DIRS}libboost_serialization.a;${Boost_LIBRARY_DIRS}libboost_atomic.a;${Boost_LIBRARY_DIRS}libboost_program_options.a")
|
|
||||||
else()
|
|
||||||
find_package(Boost 1.55 REQUIRED COMPONENTS system filesystem thread timer date_time chrono regex serialization atomic program_options locale)
|
|
||||||
endif()
|
endif()
|
||||||
|
message(STATUS "Using Boost ${Boost_VERSION} from Conan")
|
||||||
|
|
||||||
|
find_package(miniupnpc REQUIRED)
|
||||||
|
find_package(ZLIB REQUIRED)
|
||||||
|
find_package(Boost REQUIRED COMPONENTS ${BOOST_COMPONENTS})
|
||||||
|
|
||||||
|
include_directories(src "${CMAKE_BINARY_DIR}/version")
|
||||||
|
|
||||||
message(STATUS "Boost: ${Boost_VERSION} from ${Boost_LIBRARY_DIRS}")
|
include_directories(SYSTEM
|
||||||
|
${Boost_INCLUDE_DIRS}
|
||||||
|
${ZLIB_INCLUDE_DIRS}
|
||||||
|
${OPENSSL_INCLUDE_DIR}
|
||||||
|
${PROJECT_SOURCE_DIR}/contrib/ethereum/libethash
|
||||||
|
contrib
|
||||||
|
contrib/epee/include
|
||||||
|
contrib/jwt-cpp/include
|
||||||
|
contrib/eos_portable_archive
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
include_directories(SYSTEM ${Boost_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR}/contrib/ethereum/libethash)
|
# Append other needed libraries
|
||||||
if(MINGW)
|
if(MINGW)
|
||||||
set(Boost_LIBRARIES "${Boost_LIBRARIES};ws2_32;mswsock")
|
list(APPEND Boost_LIBRARIES ws2_32 mswsock)
|
||||||
elseif(NOT MSVC)
|
elseif(NOT MSVC AND NOT APPLE AND NOT CAKEWALLET AND STATIC)
|
||||||
if(NOT APPLE)
|
message("NOTICE: Including static ICU libraries")
|
||||||
set(Boost_LIBRARIES "${Boost_LIBRARIES};")
|
list(APPEND Boost_LIBRARIES icui18n.a icuuc.a icudata.a dl)
|
||||||
if(STATIC)
|
|
||||||
message("NOTICE: Including static ICU libraries")
|
|
||||||
set(Boost_LIBRARIES "${Boost_LIBRARIES};icui18n.a;icuuc.a;icudata.a;dl")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(BUILD_GUI)
|
|
||||||
cmake_minimum_required(VERSION 2.8.11)
|
|
||||||
find_package(Qt5Widgets REQUIRED)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(COMMIT_ID_IN_VERSION ON CACHE BOOL "Include commit ID in version")
|
set(COMMIT_ID_IN_VERSION ON CACHE BOOL "Include commit ID in version")
|
||||||
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/version")
|
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/version")
|
||||||
|
|
@ -252,16 +297,18 @@ else()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(BUILD_TESTS FALSE CACHE BOOL "Build Zano tests")
|
set(BUILD_TESTS FALSE CACHE BOOL "Build Lethean tests")
|
||||||
set(DISABLE_MDBX FALSE CACHE BOOL "Exclude mdbx from build(need for a first time)")
|
set(DISABLE_MDBX FALSE CACHE BOOL "Exclude mdbx from build(need for a first time)")
|
||||||
if(NOT DISABLE_MDBX)
|
if(NOT DISABLE_MDBX)
|
||||||
add_definitions(-DENABLED_ENGINE_MDBX)
|
add_definitions(-DENABLED_ENGINE_MDBX)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
add_subdirectory(contrib)
|
add_subdirectory(contrib)
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
|
|
||||||
if (BUILD_TESTS)
|
if (BUILD_TESTS)
|
||||||
add_subdirectory(tests)
|
add_subdirectory(tests)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
include(CPackConfig)
|
||||||
|
|
|
||||||
109
CMakePresets.json
Normal file
109
CMakePresets.json
Normal file
|
|
@ -0,0 +1,109 @@
|
||||||
|
{
|
||||||
|
"version": 8,
|
||||||
|
"cmakeMinimumRequired": {
|
||||||
|
"major": 3,
|
||||||
|
"minor": 23,
|
||||||
|
"patch": 0
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"ConanPresets.json"
|
||||||
|
],
|
||||||
|
"configurePresets": [
|
||||||
|
{
|
||||||
|
"name": "testnet",
|
||||||
|
"binaryDir": "${sourceDir}/build/release",
|
||||||
|
"environment": {
|
||||||
|
"CONAN_HOME": "${sourceDir}/build/sdk"
|
||||||
|
},
|
||||||
|
"cacheVariables": {
|
||||||
|
"TESTNET": "ON",
|
||||||
|
"CMAKE_BUILD_TYPE": "Release",
|
||||||
|
"CMAKE_PROJECT_TOP_LEVEL_INCLUDES":".core/build/cmake/ConanProvider.cmake"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mainnet",
|
||||||
|
"binaryDir": "${sourceDir}/build/release",
|
||||||
|
"environment": {
|
||||||
|
"CONAN_HOME": "${sourceDir}/build/sdk"
|
||||||
|
},
|
||||||
|
"cacheVariables": {
|
||||||
|
"TESTNET": "OFF",
|
||||||
|
"CMAKE_BUILD_TYPE": "Release",
|
||||||
|
"CMAKE_PROJECT_TOP_LEVEL_INCLUDES":".core/build/cmake/ConanProvider.cmake"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"buildPresets": [
|
||||||
|
{
|
||||||
|
"name": "testnet",
|
||||||
|
"configurePreset": "testnet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mainnet",
|
||||||
|
"configurePreset": "mainnet"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"testPresets": [
|
||||||
|
{
|
||||||
|
"name": "mainnet",
|
||||||
|
"configurePreset": "mainnet",
|
||||||
|
"output": {"outputOnFailure": true},
|
||||||
|
"execution": {"noTestsAction": "error", "stopOnFailure": true}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"packagePresets": [
|
||||||
|
{
|
||||||
|
"name": "mainnet",
|
||||||
|
"configurePreset": "mainnet",
|
||||||
|
"generators": [
|
||||||
|
"TGZ",
|
||||||
|
"ZIP"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "testnet",
|
||||||
|
"configurePreset": "testnet",
|
||||||
|
"generators": [
|
||||||
|
"TGZ",
|
||||||
|
"ZIP"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"workflowPresets": [
|
||||||
|
{
|
||||||
|
"name": "testnet",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"type": "configure",
|
||||||
|
"name": "testnet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "build",
|
||||||
|
"name": "testnet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "package",
|
||||||
|
"name": "testnet"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mainnet",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"type": "configure",
|
||||||
|
"name": "mainnet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "build",
|
||||||
|
"name": "mainnet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "package",
|
||||||
|
"name": "mainnet"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
9
ConanPresets.json
Normal file
9
ConanPresets.json
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"version": 4,
|
||||||
|
"vendor": {
|
||||||
|
"conan": {}
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"build/release/generators/CMakePresets.json"
|
||||||
|
]
|
||||||
|
}
|
||||||
288
LICENSE.txt
Normal file
288
LICENSE.txt
Normal file
|
|
@ -0,0 +1,288 @@
|
||||||
|
EUROPEAN UNION PUBLIC LICENCE v. 1.2
|
||||||
|
EUPL © the European Union 2007, 2016
|
||||||
|
|
||||||
|
This European Union Public Licence (the ‘EUPL’) applies to the Work (as defined
|
||||||
|
below) which is provided under the terms of this Licence. Any use of the Work,
|
||||||
|
other than as authorised under this Licence is prohibited (to the extent such
|
||||||
|
use is covered by a right of the copyright holder of the Work).
|
||||||
|
|
||||||
|
The Work is provided under the terms of this Licence when the Licensor (as
|
||||||
|
defined below) has placed the following notice immediately following the
|
||||||
|
copyright notice for the Work:
|
||||||
|
|
||||||
|
Licensed under the EUPL
|
||||||
|
|
||||||
|
or has expressed by any other means his willingness to license under the EUPL.
|
||||||
|
|
||||||
|
1. Definitions
|
||||||
|
|
||||||
|
In this Licence, the following terms have the following meaning:
|
||||||
|
|
||||||
|
- ‘The Licence’: this Licence.
|
||||||
|
|
||||||
|
- ‘The Original Work’: the work or software distributed or communicated by the
|
||||||
|
Licensor under this Licence, available as Source Code and also as Executable
|
||||||
|
Code as the case may be.
|
||||||
|
|
||||||
|
- ‘Derivative Works’: the works or software that could be created by the
|
||||||
|
Licensee, based upon the Original Work or modifications thereof. This Licence
|
||||||
|
does not define the extent of modification or dependence on the Original Work
|
||||||
|
required in order to classify a work as a Derivative Work; this extent is
|
||||||
|
determined by copyright law applicable in the country mentioned in Article 15.
|
||||||
|
|
||||||
|
- ‘The Work’: the Original Work or its Derivative Works.
|
||||||
|
|
||||||
|
- ‘The Source Code’: the human-readable form of the Work which is the most
|
||||||
|
convenient for people to study and modify.
|
||||||
|
|
||||||
|
- ‘The Executable Code’: any code which has generally been compiled and which is
|
||||||
|
meant to be interpreted by a computer as a program.
|
||||||
|
|
||||||
|
- ‘The Licensor’: the natural or legal person that distributes or communicates
|
||||||
|
the Work under the Licence.
|
||||||
|
|
||||||
|
- ‘Contributor(s)’: any natural or legal person who modifies the Work under the
|
||||||
|
Licence, or otherwise contributes to the creation of a Derivative Work.
|
||||||
|
|
||||||
|
- ‘The Licensee’ or ‘You’: any natural or legal person who makes any usage of
|
||||||
|
the Work under the terms of the Licence.
|
||||||
|
|
||||||
|
- ‘Distribution’ or ‘Communication’: any act of selling, giving, lending,
|
||||||
|
renting, distributing, communicating, transmitting, or otherwise making
|
||||||
|
available, online or offline, copies of the Work or providing access to its
|
||||||
|
essential functionalities at the disposal of any other natural or legal
|
||||||
|
person.
|
||||||
|
|
||||||
|
2. Scope of the rights granted by the Licence
|
||||||
|
|
||||||
|
The Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
|
||||||
|
sublicensable licence to do the following, for the duration of copyright vested
|
||||||
|
in the Original Work:
|
||||||
|
|
||||||
|
- use the Work in any circumstance and for all usage,
|
||||||
|
- reproduce the Work,
|
||||||
|
- modify the Work, and make Derivative Works based upon the Work,
|
||||||
|
- communicate to the public, including the right to make available or display
|
||||||
|
the Work or copies thereof to the public and perform publicly, as the case may
|
||||||
|
be, the Work,
|
||||||
|
- distribute the Work or copies thereof,
|
||||||
|
- lend and rent the Work or copies thereof,
|
||||||
|
- sublicense rights in the Work or copies thereof.
|
||||||
|
|
||||||
|
Those rights can be exercised on any media, supports and formats, whether now
|
||||||
|
known or later invented, as far as the applicable law permits so.
|
||||||
|
|
||||||
|
In the countries where moral rights apply, the Licensor waives his right to
|
||||||
|
exercise his moral right to the extent allowed by law in order to make effective
|
||||||
|
the licence of the economic rights here above listed.
|
||||||
|
|
||||||
|
The Licensor grants to the Licensee royalty-free, non-exclusive usage rights to
|
||||||
|
any patents held by the Licensor, to the extent necessary to make use of the
|
||||||
|
rights granted on the Work under this Licence.
|
||||||
|
|
||||||
|
3. Communication of the Source Code
|
||||||
|
|
||||||
|
The Licensor may provide the Work either in its Source Code form, or as
|
||||||
|
Executable Code. If the Work is provided as Executable Code, the Licensor
|
||||||
|
provides in addition a machine-readable copy of the Source Code of the Work
|
||||||
|
along with each copy of the Work that the Licensor distributes or indicates, in
|
||||||
|
a notice following the copyright notice attached to the Work, a repository where
|
||||||
|
the Source Code is easily and freely accessible for as long as the Licensor
|
||||||
|
continues to distribute or communicate the Work.
|
||||||
|
|
||||||
|
4. Limitations on copyright
|
||||||
|
|
||||||
|
Nothing in this Licence is intended to deprive the Licensee of the benefits from
|
||||||
|
any exception or limitation to the exclusive rights of the rights owners in the
|
||||||
|
Work, of the exhaustion of those rights or of other applicable limitations
|
||||||
|
thereto.
|
||||||
|
|
||||||
|
5. Obligations of the Licensee
|
||||||
|
|
||||||
|
The grant of the rights mentioned above is subject to some restrictions and
|
||||||
|
obligations imposed on the Licensee. Those obligations are the following:
|
||||||
|
|
||||||
|
Attribution right: The Licensee shall keep intact all copyright, patent or
|
||||||
|
trademarks notices and all notices that refer to the Licence and to the
|
||||||
|
disclaimer of warranties. The Licensee must include a copy of such notices and a
|
||||||
|
copy of the Licence with every copy of the Work he/she distributes or
|
||||||
|
communicates. The Licensee must cause any Derivative Work to carry prominent
|
||||||
|
notices stating that the Work has been modified and the date of modification.
|
||||||
|
|
||||||
|
Copyleft clause: If the Licensee distributes or communicates copies of the
|
||||||
|
Original Works or Derivative Works, this Distribution or Communication will be
|
||||||
|
done under the terms of this Licence or of a later version of this Licence
|
||||||
|
unless the Original Work is expressly distributed only under this version of the
|
||||||
|
Licence — for example by communicating ‘EUPL v. 1.2 only’. The Licensee
|
||||||
|
(becoming Licensor) cannot offer or impose any additional terms or conditions on
|
||||||
|
the Work or Derivative Work that alter or restrict the terms of the Licence.
|
||||||
|
|
||||||
|
Compatibility clause: If the Licensee Distributes or Communicates Derivative
|
||||||
|
Works or copies thereof based upon both the Work and another work licensed under
|
||||||
|
a Compatible Licence, this Distribution or Communication can be done under the
|
||||||
|
terms of this Compatible Licence. For the sake of this clause, ‘Compatible
|
||||||
|
Licence’ refers to the licences listed in the appendix attached to this Licence.
|
||||||
|
Should the Licensee's obligations under the Compatible Licence conflict with
|
||||||
|
his/her obligations under this Licence, the obligations of the Compatible
|
||||||
|
Licence shall prevail.
|
||||||
|
|
||||||
|
Provision of Source Code: When distributing or communicating copies of the Work,
|
||||||
|
the Licensee will provide a machine-readable copy of the Source Code or indicate
|
||||||
|
a repository where this Source will be easily and freely available for as long
|
||||||
|
as the Licensee continues to distribute or communicate the Work.
|
||||||
|
|
||||||
|
Legal Protection: This Licence does not grant permission to use the trade names,
|
||||||
|
trademarks, service marks, or names of the Licensor, except as required for
|
||||||
|
reasonable and customary use in describing the origin of the Work and
|
||||||
|
reproducing the content of the copyright notice.
|
||||||
|
|
||||||
|
6. Chain of Authorship
|
||||||
|
|
||||||
|
The original Licensor warrants that the copyright in the Original Work granted
|
||||||
|
hereunder is owned by him/her or licensed to him/her and that he/she has the
|
||||||
|
power and authority to grant the Licence.
|
||||||
|
|
||||||
|
Each Contributor warrants that the copyright in the modifications he/she brings
|
||||||
|
to the Work are owned by him/her or licensed to him/her and that he/she has the
|
||||||
|
power and authority to grant the Licence.
|
||||||
|
|
||||||
|
Each time You accept the Licence, the original Licensor and subsequent
|
||||||
|
Contributors grant You a licence to their contributions to the Work, under the
|
||||||
|
terms of this Licence.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty
|
||||||
|
|
||||||
|
The Work is a work in progress, which is continuously improved by numerous
|
||||||
|
Contributors. It is not a finished work and may therefore contain defects or
|
||||||
|
‘bugs’ inherent to this type of development.
|
||||||
|
|
||||||
|
For the above reason, the Work is provided under the Licence on an ‘as is’ basis
|
||||||
|
and without warranties of any kind concerning the Work, including without
|
||||||
|
limitation merchantability, fitness for a particular purpose, absence of defects
|
||||||
|
or errors, accuracy, non-infringement of intellectual property rights other than
|
||||||
|
copyright as stated in Article 6 of this Licence.
|
||||||
|
|
||||||
|
This disclaimer of warranty is an essential part of the Licence and a condition
|
||||||
|
for the grant of any rights to the Work.
|
||||||
|
|
||||||
|
8. Disclaimer of Liability
|
||||||
|
|
||||||
|
Except in the cases of wilful misconduct or damages directly caused to natural
|
||||||
|
persons, the Licensor will in no event be liable for any direct or indirect,
|
||||||
|
material or moral, damages of any kind, arising out of the Licence or of the use
|
||||||
|
of the Work, including without limitation, damages for loss of goodwill, work
|
||||||
|
stoppage, computer failure or malfunction, loss of data or any commercial
|
||||||
|
damage, even if the Licensor has been advised of the possibility of such damage.
|
||||||
|
However, the Licensor will be liable under statutory product liability laws as
|
||||||
|
far such laws apply to the Work.
|
||||||
|
|
||||||
|
9. Additional agreements
|
||||||
|
|
||||||
|
While distributing the Work, You may choose to conclude an additional agreement,
|
||||||
|
defining obligations or services consistent with this Licence. However, if
|
||||||
|
accepting obligations, You may act only on your own behalf and on your sole
|
||||||
|
responsibility, not on behalf of the original Licensor or any other Contributor,
|
||||||
|
and only if You agree to indemnify, defend, and hold each Contributor harmless
|
||||||
|
for any liability incurred by, or claims asserted against such Contributor by
|
||||||
|
the fact You have accepted any warranty or additional liability.
|
||||||
|
|
||||||
|
10. Acceptance of the Licence
|
||||||
|
|
||||||
|
The provisions of this Licence can be accepted by clicking on an icon ‘I agree’
|
||||||
|
placed under the bottom of a window displaying the text of this Licence or by
|
||||||
|
affirming consent in any other similar way, in accordance with the rules of
|
||||||
|
applicable law. Clicking on that icon indicates your clear and irrevocable
|
||||||
|
acceptance of this Licence and all of its terms and conditions.
|
||||||
|
|
||||||
|
Similarly, you irrevocably accept this Licence and all of its terms and
|
||||||
|
conditions by exercising any rights granted to You by Article 2 of this Licence,
|
||||||
|
such as the use of the Work, the creation by You of a Derivative Work or the
|
||||||
|
Distribution or Communication by You of the Work or copies thereof.
|
||||||
|
|
||||||
|
11. Information to the public
|
||||||
|
|
||||||
|
In case of any Distribution or Communication of the Work by means of electronic
|
||||||
|
communication by You (for example, by offering to download the Work from a
|
||||||
|
remote location) the distribution channel or media (for example, a website) must
|
||||||
|
at least provide to the public the information requested by the applicable law
|
||||||
|
regarding the Licensor, the Licence and the way it may be accessible, concluded,
|
||||||
|
stored and reproduced by the Licensee.
|
||||||
|
|
||||||
|
12. Termination of the Licence
|
||||||
|
|
||||||
|
The Licence and the rights granted hereunder will terminate automatically upon
|
||||||
|
any breach by the Licensee of the terms of the Licence.
|
||||||
|
|
||||||
|
Such a termination will not terminate the licences of any person who has
|
||||||
|
received the Work from the Licensee under the Licence, provided such persons
|
||||||
|
remain in full compliance with the Licence.
|
||||||
|
|
||||||
|
13. Miscellaneous
|
||||||
|
|
||||||
|
Without prejudice of Article 9 above, the Licence represents the complete
|
||||||
|
agreement between the Parties as to the Work.
|
||||||
|
|
||||||
|
If any provision of the Licence is invalid or unenforceable under applicable
|
||||||
|
law, this will not affect the validity or enforceability of the Licence as a
|
||||||
|
whole. Such provision will be construed or reformed so as necessary to make it
|
||||||
|
valid and enforceable.
|
||||||
|
|
||||||
|
The European Commission may publish other linguistic versions or new versions of
|
||||||
|
this Licence or updated versions of the Appendix, so far this is required and
|
||||||
|
reasonable, without reducing the scope of the rights granted by the Licence. New
|
||||||
|
versions of the Licence will be published with a unique version number.
|
||||||
|
|
||||||
|
All linguistic versions of this Licence, approved by the European Commission,
|
||||||
|
have identical value. Parties can take advantage of the linguistic version of
|
||||||
|
their choice.
|
||||||
|
|
||||||
|
14. Jurisdiction
|
||||||
|
|
||||||
|
Without prejudice to specific agreement between parties,
|
||||||
|
|
||||||
|
- any litigation resulting from the interpretation of this License, arising
|
||||||
|
between the European Union institutions, bodies, offices or agencies, as a
|
||||||
|
Licensor, and any Licensee, will be subject to the jurisdiction of the Court
|
||||||
|
of Justice of the European Union, as laid down in article 272 of the Treaty on
|
||||||
|
the Functioning of the European Union,
|
||||||
|
|
||||||
|
- any litigation arising between other parties and resulting from the
|
||||||
|
interpretation of this License, will be subject to the exclusive jurisdiction
|
||||||
|
of the competent court where the Licensor resides or conducts its primary
|
||||||
|
business.
|
||||||
|
|
||||||
|
15. Applicable Law
|
||||||
|
|
||||||
|
Without prejudice to specific agreement between parties,
|
||||||
|
|
||||||
|
- this Licence shall be governed by the law of the European Union Member State
|
||||||
|
where the Licensor has his seat, resides or has his registered office,
|
||||||
|
|
||||||
|
- this licence shall be governed by Belgian law if the Licensor has no seat,
|
||||||
|
residence or registered office inside a European Union Member State.
|
||||||
|
|
||||||
|
Appendix
|
||||||
|
|
||||||
|
‘Compatible Licences’ according to Article 5 EUPL are:
|
||||||
|
|
||||||
|
- GNU General Public License (GPL) v. 2, v. 3
|
||||||
|
- GNU Affero General Public License (AGPL) v. 3
|
||||||
|
- Open Software License (OSL) v. 2.1, v. 3.0
|
||||||
|
- Eclipse Public License (EPL) v. 1.0
|
||||||
|
- CeCILL v. 2.0, v. 2.1
|
||||||
|
- Mozilla Public Licence (MPL) v. 2
|
||||||
|
- GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3
|
||||||
|
- Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for
|
||||||
|
works other than software
|
||||||
|
- European Union Public Licence (EUPL) v. 1.1, v. 1.2
|
||||||
|
- Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong
|
||||||
|
Reciprocity (LiLiQ-R+).
|
||||||
|
|
||||||
|
The European Commission may update this Appendix to later versions of the above
|
||||||
|
licences without producing a new version of the EUPL, as long as they provide
|
||||||
|
the rights granted in Article 2 of this Licence and protect the covered Source
|
||||||
|
Code from exclusive appropriation.
|
||||||
|
|
||||||
|
All other changes or additions to this Appendix require the production of a new
|
||||||
|
EUPL version.
|
||||||
|
|
||||||
214
Makefile
214
Makefile
|
|
@ -1,82 +1,196 @@
|
||||||
|
# Copyright (c) 2017-2025 Lethean https://lt.hn
|
||||||
# Copyright (c) 2014-2019 Zano Project
|
# Copyright (c) 2014-2019 Zano Project
|
||||||
# Copyright (c) 2014 The Cryptonote developers
|
# Copyright (c) 2014 The Cryptonote developers
|
||||||
# Distributed under the MIT/X11 software license, see the accompanying
|
# Distributed under the MIT/X11 software license, see the accompanying
|
||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
# Define CMake generator
|
# ============================================================
|
||||||
system := $(shell uname)
|
# Build system from host-uk/build submodule
|
||||||
ifneq (, $(findstring MINGW, $(system)))
|
# ============================================================
|
||||||
cmake_gen = -G 'MSYS Makefiles'
|
BUILD_SYS := .core/build
|
||||||
|
CMAKE_DIR := $(BUILD_SYS)/cmake
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# Project Configuration
|
||||||
|
# ============================================================
|
||||||
|
CPU_CORES := 1
|
||||||
|
TESTNET:= 0
|
||||||
|
STATIC:= 0
|
||||||
|
BUILD_TYPE ?=Release
|
||||||
|
BUILD_VERSION:=6.0.1
|
||||||
|
BUILD_FOLDER:=build/release
|
||||||
|
PRESET_BUILD:=conan-release
|
||||||
|
PRESET_CONFIGURE:=conan-release
|
||||||
|
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
# Detect the number of logical CPU cores – works on Linux,
|
||||||
|
# macOS, BSD, and Windows (both cmd.exe and PowerShell).
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
UNAME_S := $(shell uname -s 2>/dev/null || echo Unknown)
|
||||||
|
|
||||||
|
ifeq ($(UNAME_S),Linux)
|
||||||
|
CPU_CORES := $(shell nproc 2>/dev/null || \
|
||||||
|
grep -c ^processor /proc/cpuinfo 2>/dev/null || echo 1)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
cmake = cmake $(cmake_gen)
|
ifeq ($(UNAME_S),Darwin)
|
||||||
|
CPU_CORES := $(shell sysctl -n hw.logicalcpu 2>/dev/null || echo 1)
|
||||||
|
endif
|
||||||
|
|
||||||
cmake_debug = $(cmake) -D CMAKE_BUILD_TYPE=Debug
|
ifeq ($(filter %BSD,$(UNAME_S)),%BSD)
|
||||||
cmake_release = $(cmake) -D CMAKE_BUILD_TYPE=Release
|
CPU_CORES := $(shell sysctl -n hw.ncpu 2>/dev/null || echo 1)
|
||||||
|
endif
|
||||||
|
|
||||||
cmake_gui = -D BUILD_GUI=ON
|
ifeq ($(OS),Windows_NT)
|
||||||
cmake_static = -D STATIC=ON
|
|
||||||
cmake_tests = -D BUILD_TESTS=ON
|
|
||||||
|
|
||||||
# Helper macro
|
PRESET_CONFIGURE:=conan-default
|
||||||
define CMAKE
|
|
||||||
mkdir -p $1 && cd $1 && $2 ../../
|
|
||||||
endef
|
|
||||||
|
|
||||||
build = build
|
CPU_CORES := $(NUMBER_OF_PROCESSORS)
|
||||||
dir_debug = $(build)/debug
|
|
||||||
dir_release = $(build)/release
|
|
||||||
|
|
||||||
all: release
|
ifeq ($(CPU_CORES),)
|
||||||
|
CPU_CORES := $(shell powershell -NoProfile -Command ^ "[Environment]::ProcessorCount")
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
release:
|
# Safety net
|
||||||
$(eval command += $(cmake_release))
|
CPU_CORES := $(or $(CPU_CORES),1)
|
||||||
$(call CMAKE,$(dir_release),$(command)) && $(MAKE)
|
CPU_CORES := $(shell expr $(CPU_CORES) + 0 2>/dev/null || echo 1)
|
||||||
|
CONAN_CPU_COUNT=$(CPU_CORES)
|
||||||
|
|
||||||
debug:
|
# ============================================================
|
||||||
$(eval command += $(cmake_debug))
|
# Paths — profiles and cmake modules from .build submodule
|
||||||
$(call CMAKE,$(dir_debug),$(command)) && $(MAKE)
|
# ============================================================
|
||||||
|
PROFILES :=$(patsubst $(CMAKE_DIR)/profiles/%,%,$(wildcard $(CMAKE_DIR)/profiles/*))
|
||||||
|
SORTED_PROFILES :=$(sort $(PROFILES))
|
||||||
|
CONAN_CACHE :=$(CURDIR)/build/sdk
|
||||||
|
CONAN_URL :=http://forge.snider.dev:4000/api/packages/host-uk/conan
|
||||||
|
CONAN_USER ?=$(shell echo $$CONAN_USER)
|
||||||
|
CONAN_PASSWORD ?=$(shell echo $$CONAN_PASSWORD)
|
||||||
|
CONAN_EXECUTABLE :=$(CURDIR)/build/bin/conan
|
||||||
|
CC_DOCKER_FILE ?=utils/docker/images/lthn-chain/Dockerfile
|
||||||
|
SDK_PACKAGES_JSON :=$(wildcard utils/sdk/packages/*.json)
|
||||||
|
SDK_TARGETS :=$(patsubst utils/sdk/packages/%.json,%,$(SDK_PACKAGES_JSON))
|
||||||
|
SORTED_SDK_TARGETS :=$(sort $(SDK_TARGETS))
|
||||||
|
|
||||||
static: static-release
|
all: help
|
||||||
static-release:
|
|
||||||
$(eval command += $(cmake_release) $(cmake_static))
|
|
||||||
$(call CMAKE,$(dir_release),$(command)) && $(MAKE)
|
|
||||||
|
|
||||||
#
|
testnet:
|
||||||
# GUI
|
$(MAKE) configure TESTNET=1 STATIC=$(STATIC)
|
||||||
#
|
CONAN_HOME=$(CONAN_CACHE) $(CONAN_EXECUTABLE) build .
|
||||||
|
$(MAKE) package
|
||||||
|
|
||||||
gui: gui-release
|
mainnet:
|
||||||
gui-release:
|
$(MAKE) configure TESTNET=0 STATIC=$(STATIC)
|
||||||
$(eval command += $(cmake_release) $(cmake_gui))
|
CONAN_HOME=$(CONAN_CACHE) $(CONAN_EXECUTABLE) build .
|
||||||
$(call CMAKE,$(dir_release),$(command)) && $(MAKE)
|
$(MAKE) package
|
||||||
|
|
||||||
gui-debug:
|
release: docs build
|
||||||
$(eval command += $(cmake_debug) $(cmake_gui))
|
(cd $(BUILD_FOLDER) && cpack)
|
||||||
$(call CMAKE,$(dir_debug),$(command)) && $(MAKE)
|
@rm -rf $(CURDIR)/build/packages/_CPack_Packages
|
||||||
|
|
||||||
gui-static: gui-release-static
|
build: configure
|
||||||
gui-release-static:
|
cmake --build --preset $(PRESET_BUILD) --parallel=$(CPU_CORES)
|
||||||
$(eval command += $(cmake_release) $(cmake_gui) $(cmake_static))
|
|
||||||
$(call CMAKE,$(dir_release),$(command)) && $(MAKE)
|
build-deps: conan-profile-detect
|
||||||
|
@echo "Build Dependencies: $(BUILD_TYPE) testnet=$(TESTNET)"
|
||||||
|
CONAN_HOME=$(CONAN_CACHE) $(CONAN_EXECUTABLE) install . --build=missing -s build_type=$(BUILD_TYPE)
|
||||||
|
|
||||||
|
package:
|
||||||
|
@echo "Packaging: $(BUILD_TYPE) testnet=$(TESTNET)"
|
||||||
|
(cd $(BUILD_FOLDER) && cpack)
|
||||||
|
ifneq ($(OS),Windows_NT)
|
||||||
|
@rm -rf $(CURDIR)/build/packages/_CPack_Packages
|
||||||
|
endif
|
||||||
|
|
||||||
|
configure: build-deps
|
||||||
|
@echo "Running Configure: $(BUILD_TYPE) testnet=$(TESTNET)"
|
||||||
|
cmake --preset $(PRESET_CONFIGURE) -DSTATIC=$(STATIC) -DTESTNET=$(TESTNET) -DBUILD_VERSION=$(BUILD_VERSION)
|
||||||
|
|
||||||
|
docs: configure
|
||||||
|
@echo "Building Documentation"
|
||||||
|
cmake --build build/release --target=docs --config=Release --parallel=$(CPU_CORES)
|
||||||
|
|
||||||
|
sdk:
|
||||||
|
$(MAKE) -C utils/sdk $(filter-out $@,$(MAKECMDGOALS)) PACKAGE_VERSION=$(BUILD_VERSION)
|
||||||
|
|
||||||
|
# Rule for each profile — uses .build/cmake/profiles/
|
||||||
|
$(PROFILES): conan-profile-detect
|
||||||
|
@echo "Building profile: $@"
|
||||||
|
CONAN_HOME=$(CONAN_CACHE) $(CONAN_EXECUTABLE) install . -pr:h=$(CMAKE_DIR)/profiles/$@ --build=missing -s build_type=$(BUILD_TYPE)
|
||||||
|
cmake -S . -B $(BUILD_FOLDER) -DCMAKE_TOOLCHAIN_FILE=$(BUILD_FOLDER)/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -DSTATIC=$(STATIC) -DTESTNET=$(TESTNET) -DBUILD_VERSION=$(BUILD_VERSION)
|
||||||
|
cmake --build $(BUILD_FOLDER) --config=$(BUILD_TYPE) --parallel=$(CPU_CORES)
|
||||||
|
(cd $(BUILD_FOLDER) && cpack)
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo "Lethean VPN Blockchain"
|
||||||
|
@echo "======================"
|
||||||
|
@echo "Website: https://lt.hn"
|
||||||
|
@echo "GitHub: https://github.com/letheanVPN/blockchain/"
|
||||||
|
@echo "Discord: https://discord.lt.hn"
|
||||||
|
@echo ""
|
||||||
|
@echo "Available targets:"
|
||||||
|
@printf " %-42s %s\n" "make clean" "Clean all build directories"
|
||||||
|
@printf " %-42s %s\n" "make conan-get" "Download and install conan locally"
|
||||||
|
@printf " %-42s %s\n" "make release" "Build release"
|
||||||
|
@printf " %-42s %s\n" "make testnet" "Build testnet"
|
||||||
|
@printf " %-42s %s\n" "make mainnet" "Build mainnet"
|
||||||
|
@printf " %-42s %s\n" "make test" "Build & run tests"
|
||||||
|
@printf " %-42s %s\n" "make docs" "Builds offline documentation website"
|
||||||
|
@printf " %-42s %s\n" "make docs-dev" "Runs local doc server, for editing/adding docs"
|
||||||
|
@printf " %-42s %s\n" "make conan-profile-detect" "Creates host config"
|
||||||
|
@printf " %-42s %s\n" "make configure" "Runs a cmake configure within conan build flow"
|
||||||
|
@printf "\n --- Conan Cross-Compilation Profiles ---\n"
|
||||||
|
@$(foreach profile,$(SORTED_PROFILES),printf " %-42s %s\n" "make $(profile)" "Build the $(profile) profile";)
|
||||||
|
@printf "\n --- SDK Generation ---\n"
|
||||||
|
@printf " %-42s %s\n" "make sdk" "Build all SDK packages"
|
||||||
|
@$(foreach sdk,$(SORTED_SDK_TARGETS),printf " %-42s %s\n" "make sdk $(sdk)" "Build the $(sdk) SDK package";)
|
||||||
|
@printf "\n"
|
||||||
|
@printf " %-42s %s\n" "make help" "Show this help message"
|
||||||
|
|
||||||
#
|
|
||||||
# Tests
|
|
||||||
#
|
|
||||||
|
|
||||||
test: test-release
|
test: test-release
|
||||||
test-release:
|
test-release:
|
||||||
$(eval command += $(cmake_release) $(cmake_tests))
|
@echo "Building profile: test-release"
|
||||||
$(call CMAKE,$(dir_release),$(command)) && $(MAKE) && $(MAKE) test
|
CONAN_HOME=$(CONAN_CACHE) $(CONAN_EXECUTABLE) install . --output-folder=build/test-release --build=missing -s build_type=$(BUILD_TYPE)
|
||||||
|
cmake -S . -B build/test-release -DCMAKE_TOOLCHAIN_FILE=build/test-release/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release -D BUILD_TESTS=ON
|
||||||
|
cmake --build build/test-release --config=Release --parallel=$(CPU_CORES)
|
||||||
|
$(MAKE) test
|
||||||
|
|
||||||
test-debug:
|
test-debug:
|
||||||
$(eval command += $(cmake_debug) $(cmake_tests))
|
@echo "Building profile: test-debug"
|
||||||
$(call CMAKE,$(dir_debug),$(command)) && $(MAKE) && $(MAKE) test
|
CONAN_HOME=$(CONAN_CACHE) $(CONAN_EXECUTABLE) install . --output-folder=build/test-debug --build=missing -s build_type=$(BUILD_TYPE)
|
||||||
|
cmake -S . -B build/test-debug -DCMAKE_TOOLCHAIN_FILE=build/test-debug/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Debug -D BUILD_TESTS=ON
|
||||||
|
cmake --build build/test-debug --config=Debug --parallel=$(CPU_CORES)
|
||||||
|
$(MAKE) test
|
||||||
|
|
||||||
|
# Conan management — cmake modules from .build submodule
|
||||||
|
conan-get:
|
||||||
|
cmake -P $(CMAKE_DIR)/ConanGet.cmake
|
||||||
|
ifneq ($(CONAN_USER),)
|
||||||
|
(CONAN_HOME=$(CONAN_CACHE) $(CONAN_EXECUTABLE) remote add conan_build $(CONAN_URL) && \
|
||||||
|
CONAN_HOME=$(CONAN_CACHE) $(CONAN_EXECUTABLE) remote login conan_build $(CONAN_USER) -p $(CONAN_PASSWORD)) || true
|
||||||
|
endif
|
||||||
|
|
||||||
|
conan-upload:
|
||||||
|
CONAN_HOME=$(CONAN_CACHE) $(CONAN_EXECUTABLE) upload "*" -r=conan_build --confirm
|
||||||
|
|
||||||
|
conan-profile-detect: conan-get
|
||||||
|
cmake -P $(CMAKE_DIR)/ConanProfileSetup.cmake
|
||||||
|
|
||||||
|
docs-dev: configure
|
||||||
|
@echo "Building Documentation"
|
||||||
|
cmake --build build/release --target=serve_docs --config=Release
|
||||||
|
|
||||||
|
$(SDK_TARGETS):
|
||||||
|
@# This is a proxy target. Handled by the 'sdk' rule.
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
@cmake -P $(CMAKE_DIR)/CleanBuild.cmake
|
||||||
|
|
||||||
|
clean-build: clean
|
||||||
rm -rf build
|
rm -rf build
|
||||||
|
|
||||||
tags:
|
tags:
|
||||||
ctags -R --sort=1 --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ src contrib tests/gtest
|
ctags -R --sort=1 --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ src contrib tests/gtest
|
||||||
|
|
||||||
.PHONY: all release debug static static-release gui gui-release gui-static gui-release-static gui-debug test test-release test-debug clean tags
|
.PHONY: all release upload-conan-cache docs docs-dev configure static static-release test test-release test-debug clean tags conan-profile-detect conan-get $(PROFILES) sdk $(SDK_TARGETS)
|
||||||
|
|
|
||||||
192
README.md
192
README.md
|
|
@ -1,136 +1,120 @@
|
||||||
[](https://scan.coverity.com/projects/zanoproject)
|
# Lethean Network—Ethics, Encoded.
|
||||||
[](https://discord.gg/wE3rmYY)
|
|
||||||
|
|
||||||
## Cloning
|
> We are building upto a mainnet launch in 2026, documentation written as if mainnet is live.
|
||||||
|
|
||||||
Be sure to clone the repository properly:\
|
A buildkit for deploying confidential information networks and commerce systems with immutable auditability.
|
||||||
`$ git clone --recursive https://github.com/hyle-team/zano.git`
|
|
||||||
|
|
||||||
# Building
|
Free for commercial, private, and patent use, self-host or join the community-run network that guarantees participant sovereignty by design.
|
||||||
--------
|
|
||||||
|
|
||||||
|
|
||||||
|
[](https://discord.gg/pfgT2Kz)
|
||||||
|
|
||||||
|
Web2 Website: https://lt.hn/
|
||||||
|
|
||||||
|
Web3 Network Gateway [HNS](https://handshake.org): [https://lthn](https://www.namebase.io/domains/lthn)
|
||||||
|
<br/>_(our chain aliases will come with a working Web2(`*.lt.hn`)+Web3(`*.lthn`) domain name)_
|
||||||
|
|
||||||
|
|
||||||
### Dependencies
|
### Dependencies
|
||||||
| component / version | minimum <br>(not recommended but may work) | recommended | most recent of what we have ever tested |
|
| component / version | minimum <br>(not recommended but may work) | recommended | most recent of what we have ever tested |
|
||||||
|--|--|--|--|
|
|-----------------------------------------------------------------------------|--------------------------------------------|----------------|-----------------------------------------|
|
||||||
| gcc (Linux) | 5.4.0 | 7.4.0 | 8.3.0 |
|
| gcc (Linux) | 8.4.0 | 9.4.0 | 12.3.0 |
|
||||||
| llvm/clang (Linux) | UNKNOWN | 7.0.1 | 8.0.0 |
|
| llvm/clang (Linux) | UNKNOWN | 7.0.1 | 8.0.0 |
|
||||||
| [MSVC](https://visualstudio.microsoft.com/downloads/) (Windows) | 2015 (14.0 update 1) | 2017 (15.9.0) | 2019 |
|
| [MSVC](https://visualstudio.microsoft.com/downloads/) (Windows) | 2017 (15.9.30) | 2022 (17.11.5) | 2022 (17.12.3) |
|
||||||
| [XCode](https://developer.apple.com/downloads/) (macOS) | 9.2 | 12.3 | 12.3 |
|
| [XCode](https://developer.apple.com/downloads/) (macOS) | 12.3 | 14.3 | 15.2 |
|
||||||
| [CMake](https://cmake.org/download/) | 2.8.6 | 3.15.5 | 3.20 |
|
| [CMake](https://cmake.org/download/) | 3.26.3 | 3.26.3 | 3.31.6 |
|
||||||
| [Boost](https://www.boost.org/users/download/) | 1.56 | 1.68 | 1.76 |
|
|
||||||
| [Qt](https://download.qt.io/archive/qt/) (*only for GUI*) | 5.8.0 | 5.11.2 | 5.15.2 |
|
|
||||||
|
|
||||||
Note:\
|
## Cloning
|
||||||
[*server version*] denotes steps required for building command-line tools (daemon, simplewallet, etc.).\
|
|
||||||
[*GUI version*] denotes steps required for building Zano executable with GUI.
|
|
||||||
|
|
||||||
<br />
|
Be sure to clone the repository properly, with `--recursive` flag, or you'll get angry:<br/>
|
||||||
|
`git clone --recursive https://github.com/letheanVPN/blockchain.git`
|
||||||
|
|
||||||
### Linux
|
# Building
|
||||||
|
|
||||||
Recommended OS version: Ubuntu 18.04 LTS.
|
The project uses a `Makefile` that provides a simple and powerful interface for building.
|
||||||
|
It automatically handles dependency installation with Conan and compilation with CMake.
|
||||||
|
|
||||||
1. Prerequisites
|
You need CMake and Make installed on your system, other than that you don't need to worry about Python, Conan, Boost, OpenSSL, or any other dependencies.
|
||||||
|
|
||||||
[*server version*]
|
The final packages are created as they are due to a historical distribution method used in china: USB Stick, CD, DVD, etc.
|
||||||
|
|
||||||
sudo apt-get install -y build-essential g++ python-dev autotools-dev libicu-dev libbz2-dev cmake git screen
|
|
||||||
|
|
||||||
[*GUI version*]
|
|
||||||
|
|
||||||
sudo apt-get install -y build-essential g++ python-dev autotools-dev libicu-dev libbz2-dev cmake git screen mesa-common-dev libglu1-mesa-dev
|
We use CPack, so our packages are self-contained, have searchable HTML documentation, and are ready to be installed on any system.
|
||||||
|
|
||||||
2. Download and build Boost
|
To skip the packing step, use `make build` as defined in the section below for Advanced Build Customization
|
||||||
|
|
||||||
wget https://boostorg.jfrog.io/artifactory/main/release/1.68.0/source/boost_1_68_0.tar.bz2
|
## Simple Workflow Builds (Recommended)
|
||||||
tar -xjf boost_1_68_0.tar.bz2
|
|
||||||
cd boost_1_68_0
|
|
||||||
./bootstrap.sh --with-libraries=system,filesystem,thread,date_time,chrono,regex,serialization,atomic,program_options,locale,timer
|
|
||||||
./b2
|
|
||||||
|
|
||||||
3. Install Qt\
|
For most use cases, these two commands are all you need. They handle the entire build process from start to finish.
|
||||||
(*GUI version only, skip this step if you're building server version*)
|
|
||||||
|
|
||||||
[*GUI version*]
|
* **Build for Mainnet:**
|
||||||
|
```shell
|
||||||
|
make mainnet
|
||||||
|
```
|
||||||
|
|
||||||
wget https://download.qt.io/new_archive/qt/5.11/5.11.2/qt-opensource-linux-x64-5.11.2.run
|
* **Build for Testnet:**
|
||||||
chmod +x qt-opensource-linux-x64-5.11.2.run
|
```shell
|
||||||
./qt-opensource-linux-x64-5.11.2.run
|
make testnet
|
||||||
Then follow the instructions in Wizard. Don't forget to tick the WebEngine module checkbox!
|
```
|
||||||
|
|
||||||
4. Set environment variables properly\
|
## Creating Release Packages
|
||||||
For instance, by adding the following lines to `~/.bashrc`
|
|
||||||
|
|
||||||
[*server version*]
|
To create distributable packages (e.g., `.zip`, `.msi`, `.pkg`, `.deb`), run the `release` target. This will build the project, build the documentation, and then package everything.
|
||||||
|
|
||||||
export BOOST_ROOT=/home/user/boost_1_68_0
|
```shell
|
||||||
|
make release TESTNET=1
|
||||||
|
```
|
||||||
|
The final packages will be located in the `build/packages/` directory
|
||||||
|
|
||||||
|
## Advanced Build Customization (Makefile Variables)
|
||||||
|
|
||||||
[*GUI version*]
|
For advanced use cases, you can override variables in the `Makefile` to customize the build process.
|
||||||
|
|
||||||
export BOOST_ROOT=/home/user/boost_1_68_0
|
* **Build a `testnet` version:**
|
||||||
export QT_PREFIX_PATH=/home/user/Qt5.11.2/5.11.2/gcc_64
|
```shell
|
||||||
|
make build TESTNET=1
|
||||||
|
```
|
||||||
|
* **Build a statically-linked version:**
|
||||||
|
```shell
|
||||||
|
make build STATIC=1
|
||||||
|
```
|
||||||
|
* **Build a Debug build with 8 compile threads:**
|
||||||
|
```shell
|
||||||
|
make build BUILD_TYPE=Debug CPU_CORES=8
|
||||||
|
```
|
||||||
|
* **Use custom CMakePresets:**
|
||||||
|
```shell
|
||||||
|
make build PRESET_CONFIGURE=my-config-preset PRESET_BUILD=my-build-preset
|
||||||
|
```
|
||||||
|
|
||||||
|
| Variable | Description | Default Value |
|
||||||
|
|--------------------|------------------------------------------------------------------------|-------------------------|
|
||||||
|
| `BUILD_TYPE` | Sets the build configuration (e.g., `Release`, `Debug`). | `Release` |
|
||||||
|
| `TESTNET` | Set to `1` to build for the test network. | `0` |
|
||||||
|
| `STATIC` | Set to `1` to link libraries statically. | `0` |
|
||||||
|
| `CPU_CORES` | Number of CPU cores to use for parallel compilation. | Auto-detected |
|
||||||
|
| `BUILD_VERSION` | The version string to embed in the binaries. | `6.0.1` |
|
||||||
|
| `BUILD_FOLDER` | The output directory for the build. | `build/release` |
|
||||||
|
| `PRESET_CONFIGURE` | The CMake preset to use for the `configure` step. | `conan-release` |
|
||||||
|
| `PRESET_BUILD` | The CMake preset to use for the `build` step. | `conan-release` |
|
||||||
|
| `CONAN_CACHE` | The path for the local Conan cache, where the dependencies are stored. | `./build/sdk` |
|
||||||
|
| `CONAN_EXECUTABLE` | The path to the usable Conan executable. | `./build/bin/conan` |
|
||||||
|
| `CONAN_URL` | The URL for the Conan remote repository. | `artifacts.host.uk.com` |
|
||||||
|
| `CONAN_USER` | The username for the Conan remote. | `public` |
|
||||||
|
| `CONAN_PASSWORD` | The password for the Conan remote. | |
|
||||||
|
|
||||||
|
## Cleaning the Build Directory
|
||||||
|
|
||||||
5. Building binaries
|
ALWAYS USE `make clean` to clean the build directory, manually deleting the `build/release`, `build/SOME_FOLDER` will cause you issues.
|
||||||
1. Building daemon and simplewallet:
|
|
||||||
|
|
||||||
cd zano/ && make -j1
|
Our `make clean` triggers a cmake script that completely resets the build directory & dynamically added CMakePresets to its cached warm-up state,
|
||||||
or
|
the selective clean script can be edited here: `cmake/CleanBuild.cmake` or directly run from the repo root `cmake -P cmake/CleanBuild.cmake`
|
||||||
|
|
||||||
cd zano && mkdir build && cd build
|
|
||||||
cmake ..
|
|
||||||
make -j1 daemon simplewallet
|
|
||||||
|
|
||||||
**NOTICE**: If you are building on a machine with a relatively high amount of RAM or with the proper setting of virtual memory, then you can use `-j2` or `-j` option to speed up the building process. Use with caution.
|
You can NUKE the build directory with `make clean-build` which is `rm -rf build`.
|
||||||
|
|
||||||
**NOTICE 2**: If you'd like to build binaries for the testnet, use `cmake -D TESTNET=TRUE ..` instead of `cmake ..` .
|
|
||||||
|
|
||||||
1. Building GUI:
|
|
||||||
|
|
||||||
cd zano
|
If you do manually delete build folders and get CMake errors (if you have compiled anything previously, you will),
|
||||||
utils/build_sript_linux.sh
|
the ConanPresets.json file has entries in the `include` property, delete them all and try again.
|
||||||
|
|
||||||
7. Look for the binaries in `build` folder
|
This happens because CMakePresets.json includes ConanPresets.json, that has the list of toolchains to use that gets populated during the CMake config step,
|
||||||
|
when you manually delete a folder, the toolchain is now a broken path, and CMake throws a fatal error.
|
||||||
<br />
|
|
||||||
|
|
||||||
### Windows
|
|
||||||
Recommended OS version: Windows 7 x64.
|
|
||||||
1. Install required prerequisites (Boost, Qt, CMake).
|
|
||||||
2. Edit paths in `utils/configure_local_paths.cmd`.
|
|
||||||
3. Run `utils/configure_win64_msvs2015_gui.cmd` or `utils/configure_win64_msvs2017_gui.cmd` according to your MSVC version.
|
|
||||||
4. Go to the build folder and open generated Zano.sln in MSVC.
|
|
||||||
5. Build.
|
|
||||||
|
|
||||||
In order to correctly deploy Qt GUI application, you also need to do the following:
|
|
||||||
|
|
||||||
6. Copy Zano.exe to a folder (e.g. `depoy`).
|
|
||||||
7. Run `PATH_TO_QT\bin\windeployqt.exe deploy\Zano.exe`.
|
|
||||||
8. Copy folder `\src\gui\qt-daemon\html` to `deploy\html`.
|
|
||||||
9. Now you can run `Zano.exe`
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
### macOS
|
|
||||||
Recommended OS version: macOS Sierra 10.15.4 x64.
|
|
||||||
1. Install required prerequisites.
|
|
||||||
2. Set environment variables as stated in `utils/macosx_build_config.command`.
|
|
||||||
3. `mkdir build` <br> `cd build` <br> `cmake ..` <br> `make`
|
|
||||||
|
|
||||||
To build GUI application:
|
|
||||||
|
|
||||||
1. Create self-signing certificate via Keychain Access:\
|
|
||||||
a. Run Keychain Access.\
|
|
||||||
b. Choose Keychain Access > Certificate Assistant > Create a Certificate.\
|
|
||||||
c. Use “Zano” (without quotes) as certificate name.\
|
|
||||||
d. Choose “Code Signing” in “Certificate Type” field.\
|
|
||||||
e. Press “Create”, then “Done”.\
|
|
||||||
f. Make sure the certificate was added to keychain "System". If not—move it to "System".\
|
|
||||||
g. Double click the certificate you've just added, enter the trust section and under "When using this certificate" select "Always trust".\
|
|
||||||
h. Unfold the certificate in Keychain Access window and double click the underlying private key "Zano". Select "Access Control" tab, then select "Allow all applications to access this item". Click "Save Changes".
|
|
||||||
2. Revise building script, comment out unwanted steps and run it: `utils/build_script_mac_osx.sh`
|
|
||||||
3. The application should be here: `/buid_mac_osx_64/release/src`
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,4 +3,4 @@
|
||||||
static_assert(1, "FAIL");
|
static_assert(1, "FAIL");
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
70
conanfile.py
Normal file
70
conanfile.py
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
import os
|
||||||
|
|
||||||
|
from conan import ConanFile
|
||||||
|
from conan.tools.cmake import CMakeDeps, CMakeToolchain, CMake
|
||||||
|
|
||||||
|
|
||||||
|
class BlockchainConan(ConanFile):
|
||||||
|
name = "blockchain"
|
||||||
|
version = "6.0.1"
|
||||||
|
settings = "os", "compiler", "build_type", "arch"
|
||||||
|
|
||||||
|
options = {
|
||||||
|
"static": [True, False],
|
||||||
|
"testnet": [True, False],
|
||||||
|
"ci": [True, False]
|
||||||
|
}
|
||||||
|
default_options = {
|
||||||
|
"static": False,
|
||||||
|
"testnet": False,
|
||||||
|
"ci": False,
|
||||||
|
"boost/*:without_test": True
|
||||||
|
}
|
||||||
|
|
||||||
|
tool_requires = [
|
||||||
|
"cmake/3.31.9"
|
||||||
|
]
|
||||||
|
|
||||||
|
requires = [
|
||||||
|
"zlib/1.3.1",
|
||||||
|
"boost/1.85.0",
|
||||||
|
"openssl/3.2.0",
|
||||||
|
"miniupnpc/2.2.5",
|
||||||
|
"jwt-cpp/0.7.1",
|
||||||
|
"oatpp/1.3.0.latest",
|
||||||
|
"oatpp-swagger/1.3.0.latest"
|
||||||
|
]
|
||||||
|
|
||||||
|
def generate(self):
|
||||||
|
tc = CMakeToolchain(self)
|
||||||
|
|
||||||
|
os_val = str(self.settings.os).lower()
|
||||||
|
# arch_val = str(self.settings.arch).lower()
|
||||||
|
# compiler_val = str(self.settings.compiler).lower()
|
||||||
|
# tc.presets_prefix = f"{os_val}"
|
||||||
|
|
||||||
|
tc.user_presets_path = "ConanPresets.json"
|
||||||
|
tc.variables["STATIC"] = self.options.static
|
||||||
|
tc.variables["TESTNET"] = self.options.testnet
|
||||||
|
# tc.preprocessor_definitions["TESTNET"] = None
|
||||||
|
# tc.variables["BUILD_VERSION"] = self.options.build_version
|
||||||
|
tc.generate()
|
||||||
|
|
||||||
|
deps = CMakeDeps(self)
|
||||||
|
deps.generate()
|
||||||
|
|
||||||
|
def layout(self):
|
||||||
|
if self.settings.compiler == "msvc":
|
||||||
|
# For multi-config, all configurations go into the same "build" folder.
|
||||||
|
self.folders.build = "build/release"
|
||||||
|
self.folders.generators = "build/release/generators"
|
||||||
|
else:
|
||||||
|
# For single-config, we create a subfolder for each build type.
|
||||||
|
build_type_str = str(self.settings.build_type).lower()
|
||||||
|
self.folders.build = os.path.join("build", build_type_str)
|
||||||
|
self.folders.generators = os.path.join(self.folders.build, "generators")
|
||||||
|
|
||||||
|
def build(self):
|
||||||
|
cmake = CMake(self)
|
||||||
|
cmake.configure()
|
||||||
|
cmake.build()
|
||||||
|
|
@ -1,35 +1,33 @@
|
||||||
set(UPNPC_BUILD_STATIC ON CACHE BOOL "Build static library")
|
|
||||||
set(UPNPC_BUILD_SHARED OFF CACHE BOOL "Build shared library")
|
|
||||||
set(UPNPC_BUILD_TESTS OFF CACHE BOOL "Build test executables")
|
|
||||||
add_subdirectory(zlib)
|
|
||||||
add_subdirectory(db)
|
add_subdirectory(db)
|
||||||
add_subdirectory(ethereum)
|
add_subdirectory(ethereum)
|
||||||
add_subdirectory(tor-connect)
|
add_subdirectory(randomx)
|
||||||
|
|
||||||
|
if(USE_BITCOIN_SECP256K1_FOR_ECDSA)
|
||||||
|
option(SECP256K1_BUILD_BENCHMARK "Build benchmarks." OFF)
|
||||||
|
option(SECP256K1_BUILD_TESTS "Build tests." OFF)
|
||||||
|
option(SECP256K1_BUILD_EXHAUSTIVE_TESTS "Build exhaustive tests." OFF)
|
||||||
|
option(SECP256K1_BUILD_CTIME_TESTS "Build constant-time tests." OFF)
|
||||||
|
option(SECP256K1_BUILD_EXAMPLES "Build examples." OFF)
|
||||||
|
set_property(GLOBAL PROPERTY CTEST_TARGETS_ADDED 1)
|
||||||
|
|
||||||
|
if(STATIC)
|
||||||
|
set(SECP256K1_DISABLE_SHARED ON CACHE BOOL "Disable shared library for secp256k1")
|
||||||
|
set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build static libraries by default" FORCE)
|
||||||
|
endif()
|
||||||
|
add_subdirectory(bitcoin-secp256k1)
|
||||||
|
set_property(TARGET secp256k1 PROPERTY FOLDER "contrib")
|
||||||
|
set_property(TARGET secp256k1_precomputed PROPERTY FOLDER "contrib")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
if(CMAKE_SYSTEM_NAME STREQUAL "iOS" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
|
if(CMAKE_SYSTEM_NAME STREQUAL "iOS" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
|
||||||
message("excluded upnp support for IOS build")
|
message("excluded upnp support for IOS build")
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
add_subdirectory(miniupnp/miniupnpc)
|
|
||||||
|
|
||||||
|
|
||||||
set_property(TARGET libminiupnpc-static PROPERTY FOLDER "contrib")
|
|
||||||
set_property(TARGET zlibstatic PROPERTY FOLDER "contrib")
|
|
||||||
set_property(TARGET mdbx PROPERTY FOLDER "contrib")
|
set_property(TARGET mdbx PROPERTY FOLDER "contrib")
|
||||||
set_property(TARGET lmdb PROPERTY FOLDER "contrib")
|
set_property(TARGET lmdb PROPERTY FOLDER "contrib")
|
||||||
set_property(TARGET tor-connect PROPERTY FOLDER "contrib")
|
|
||||||
set_property(TARGET upnpc-static mdbx_chk mdbx_copy mdbx_dump mdbx_load mdbx_stat PROPERTY FOLDER "unused")
|
|
||||||
|
|
||||||
if(MSVC)
|
|
||||||
set_property(TARGET ntdll_extra_target PROPERTY FOLDER "unused")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
if(MSVC)
|
set_property(TARGET mdbx_chk mdbx_copy mdbx_dump mdbx_load mdbx_stat PROPERTY FOLDER "unused")
|
||||||
set_property(TARGET upnpc-static APPEND_STRING PROPERTY COMPILE_FLAGS " /wd4244 /wd4267")
|
|
||||||
set_property(TARGET zlibstatic APPEND_STRING PROPERTY COMPILE_FLAGS " /wd4267 /wd4267")
|
|
||||||
else()
|
|
||||||
set_property(TARGET upnpc-static APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-undef -Wno-unused-result -Wno-unused-value -Wno-implicit-fallthrough -Wno-discarded-qualifiers ")
|
|
||||||
set_property(TARGET zlibstatic APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-undef -Wno-unused-result -Wno-unused-value -Wno-implicit-fallthrough -Wno-discarded-qualifiers ")
|
|
||||||
endif()
|
|
||||||
|
|
|
||||||
1
contrib/bitcoin-secp256k1
Submodule
1
contrib/bitcoin-secp256k1
Submodule
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit a5269373fa13ff845f654d81b90629dd78495641
|
||||||
|
|
@ -6,15 +6,18 @@ if(CMAKE_SYSTEM_NAME STREQUAL "iOS" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
message("DB ENGINE: lmdb")
|
message("DB ENGINE: lmdb")
|
||||||
add_subdirectory(liblmdb)
|
add_subdirectory(liblmdb)
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
target_compile_options(lmdb PRIVATE /wd4996 /wd4503 /wd4345 /wd4267 /wd4244 /wd4146 /wd4333 /wd4172)
|
target_compile_options(lmdb PRIVATE /wd4996 /wd4503 /wd4345 /wd4267 /wd4244 /wd4146 /wd4333 /wd4172)
|
||||||
else()
|
else()
|
||||||
# Warnings as used by LMDB itself (LMDB_0.9.23)
|
# Warnings as used by LMDB itself (LMDB_0.9.23)
|
||||||
target_compile_options(lmdb PRIVATE -Wall -Wno-unused-parameter -Wbad-function-cast -Wuninitialized)
|
target_compile_options(lmdb PRIVATE -Wall -Wno-unused-parameter -Wbad-function-cast -Wuninitialized)
|
||||||
endif()
|
endif()
|
||||||
if(NOT DISABLE_MDBX)
|
|
||||||
message("DB ENGINE: mdbx")
|
if(NOT DISABLE_MDBX)
|
||||||
add_subdirectory(libmdbx)
|
message("DB ENGINE: mdbx")
|
||||||
endif()
|
add_subdirectory(libmdbx)
|
||||||
|
# remove mdbx tools from the default MSVC build
|
||||||
|
set_target_properties(mdbx_chk mdbx_copy mdbx_dump mdbx_load mdbx_stat PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1)
|
||||||
|
endif()
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit b7ed67543fefb0878dba1c70dea2a81201041314
|
|
||||||
20
contrib/db/libmdbx/.circleci/config.yml
Normal file
20
contrib/db/libmdbx/.circleci/config.yml
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
version: 2
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
docker:
|
||||||
|
- image: circleci/buildpack-deps:artful
|
||||||
|
environment:
|
||||||
|
- TESTDB: /tmp/test.db
|
||||||
|
- TESTLOG: /tmp/test.log
|
||||||
|
steps:
|
||||||
|
- checkout
|
||||||
|
- run: make all
|
||||||
|
- run: ulimit -c unlimited && make check
|
||||||
|
- run:
|
||||||
|
command: |
|
||||||
|
mkdir -p /tmp/artifacts
|
||||||
|
mv -t /tmp/artifacts $TESTLOG $TESTDB core.*
|
||||||
|
when: on_fail
|
||||||
|
- store_artifacts:
|
||||||
|
path: /tmp/artifacts
|
||||||
|
destination: test-artifacts
|
||||||
3
contrib/db/libmdbx/.clang-format
Normal file
3
contrib/db/libmdbx/.clang-format
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
BasedOnStyle: LLVM
|
||||||
|
Standard: Cpp11
|
||||||
|
ReflowComments: true
|
||||||
35
contrib/db/libmdbx/.gitignore
vendored
Normal file
35
contrib/db/libmdbx/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
*.[ao]
|
||||||
|
*.bak
|
||||||
|
*.exe
|
||||||
|
*.gcda
|
||||||
|
*.gcno
|
||||||
|
*.gcov
|
||||||
|
*.lo
|
||||||
|
*.orig
|
||||||
|
*.rej
|
||||||
|
*.so
|
||||||
|
*[~#]
|
||||||
|
.idea
|
||||||
|
.le.ini
|
||||||
|
.vs/
|
||||||
|
cmake-build-*
|
||||||
|
@*
|
||||||
|
core
|
||||||
|
mdbx_example
|
||||||
|
libmdbx.creator.user
|
||||||
|
mdbx_chk
|
||||||
|
mdbx_copy
|
||||||
|
mdbx_dump
|
||||||
|
mdbx_load
|
||||||
|
mdbx_stat
|
||||||
|
mdbx_test
|
||||||
|
test.log
|
||||||
|
test/tmp.db
|
||||||
|
test/tmp.db-lck
|
||||||
|
tmp.db
|
||||||
|
tmp.db-lck
|
||||||
|
valgrind.*
|
||||||
|
src/elements/version.c
|
||||||
|
src/elements/config.h
|
||||||
|
dist/
|
||||||
|
*.tar*
|
||||||
61
contrib/db/libmdbx/.travis.yml
Normal file
61
contrib/db/libmdbx/.travis.yml
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
language: c cpp
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- os: linux
|
||||||
|
dist: precise
|
||||||
|
env: CC=cc CXX=c++
|
||||||
|
- os: linux
|
||||||
|
dist: trusty
|
||||||
|
compiler: clang
|
||||||
|
env: CC=clang CXX=clang++
|
||||||
|
- os: linux
|
||||||
|
dist: xenial
|
||||||
|
compiler: gcc
|
||||||
|
env: CC=gcc CXX=g++
|
||||||
|
- os: linux
|
||||||
|
dist: bionic
|
||||||
|
compiler: clang
|
||||||
|
env: CC=clang CXX=clang++
|
||||||
|
- os: osx
|
||||||
|
osx_image: xcode11
|
||||||
|
env: CC=cc CXX=c++
|
||||||
|
- os: osx
|
||||||
|
osx_image: xcode9.4
|
||||||
|
env: CC=cc CXX=c++
|
||||||
|
|
||||||
|
script: >
|
||||||
|
if [ "${COVERITY_SCAN_BRANCH}" != 1 ]; then
|
||||||
|
git fetch --unshallow --tags --prune &&
|
||||||
|
git submodule foreach --recursive git fetch --unshallow --tags --prune &&
|
||||||
|
(if which clang-format-6.0 > /dev/null && make reformat && [[ -n $(git diff) ]];
|
||||||
|
then
|
||||||
|
echo "You must run 'make reformat' before submitting a pull request";
|
||||||
|
echo "";
|
||||||
|
git diff;
|
||||||
|
exit -1;
|
||||||
|
fi) &&
|
||||||
|
make --keep-going all && MALLOC_CHECK_=7 MALLOC_PERTURB_=42 make --keep-going check
|
||||||
|
else
|
||||||
|
[ ! -s cov-int/scm_log.txt ] || cat cov-int/scm_log.txt;
|
||||||
|
fi && sleep 3
|
||||||
|
|
||||||
|
env:
|
||||||
|
global:
|
||||||
|
- secure: "M+W+heGGyRQJoBq2W0uqWVrpL4KBXmL0MFL7FSs7f9vmAaDyEgziUXeZRj3GOKzW4kTef3LpIeiu9SmvqSMoQivGGiomZShqPVl045o/OUgRCAT7Al1RLzEZ0efSHpIPf0PZ6byEf6GR2ML76OfuL6JxTVdnz8iVyO2sgLE1HbX1VeB+wgd/jfMeOBhCCXskfK6MLyZihfMYsiYZYSaV98ZDhDLSlzuuRIgzb0bMi8aL6AErs0WLW0NelRBeHkKPYfAUc85pdQHscgrJw6Rh/zT6+8BQ/q5f4IgWhiu4xoRg3Ngl7SNoedRQh93ADM3UG2iGl6HDFpVORaXcFWKAtuYY+kHQ0HB84BRYpQmeBuXNpltsfxQ3d1Q3u0RlE45zRvmr2+X1mFnkcNUAWISLPbsOUlriDQM8irGwRpho77/uYnRC00bJsHW//s6+uPf9zrAw1nI4f0y3PAWukGF/xs6HAI3FZPsuSSnx18Tj3Opgbc9Spop+V3hkhdiJoPGpNKTkFX4ZRXfkPgoRVJmtp4PpbpH0Ps/mCriKjMEfGGi0HcVCi0pEGLXiecdqJ5KPg5+22zNycEujQBJcNTKd9shN+R3glrbmhAxTEzGdGwxXXJ2ybwJ2PWJLMYZ7g98nLyX+uQPaA3BlsbYJHNeS5283/9pJsd9DzfHKsN2nFSc="
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
- echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-
|
||||||
|
- ${CC} --version
|
||||||
|
- ${CXX} --version
|
||||||
|
|
||||||
|
addons:
|
||||||
|
coverity_scan:
|
||||||
|
project:
|
||||||
|
name: "ReOpen/libmdbx"
|
||||||
|
version: 0.1
|
||||||
|
description: "Build submitted via Travis CI"
|
||||||
|
notification_email: leo@yuriev.ru
|
||||||
|
build_command_prepend: "git fetch --unshallow --tags --prune && make dist"
|
||||||
|
build_command: "make MDBX_OPTIONS=-DMDBX_DEBUG=2 -C dist all"
|
||||||
|
branch_pattern: coverity_scan
|
||||||
32
contrib/db/libmdbx/AUTHORS
Normal file
32
contrib/db/libmdbx/AUTHORS
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
Contributors
|
||||||
|
============
|
||||||
|
|
||||||
|
Alexey Naumov <alexey.naumov@gmail.com>
|
||||||
|
Chris Mikkelson <cmikk@qwest.net>
|
||||||
|
Claude Brisson <claude.brisson@gmail.com>
|
||||||
|
David Barbour <dmbarbour@gmail.com>
|
||||||
|
David Wilson <dw@botanicus.net>
|
||||||
|
dreamsxin <dreamsxin@126.com>
|
||||||
|
Hallvard Furuseth <hallvard@openldap.org>, <h.b.furuseth@usit.uio.no>
|
||||||
|
Heiko Becker <heirecka@exherbo.org>
|
||||||
|
Howard Chu <hyc@openldap.org>, <hyc@symas.com>
|
||||||
|
Ignacio Casal Quinteiro <ignacio.casal@nice-software.com>
|
||||||
|
James Rouzier <rouzier@gmail.com>
|
||||||
|
Jean-Christophe DUBOIS <jcd@tribudubois.net>
|
||||||
|
John Hewson <john@jahewson.com>
|
||||||
|
Klaus Malorny <klaus.malorny@knipp.de>
|
||||||
|
Kurt Zeilenga <kurt.zeilenga@isode.com>
|
||||||
|
Leonid Yuriev <leo@yuriev.ru>, <lyuryev@ptsecurity.com>
|
||||||
|
Lorenz Bauer <lmb@cloudflare.com>
|
||||||
|
Luke Yeager <lyeager@nvidia.com>
|
||||||
|
Martin Hedenfalk <martin@bzero.se>
|
||||||
|
Ondrej Kuznik <ondrej.kuznik@acision.com>
|
||||||
|
Orivej Desh <orivej@gmx.fr>
|
||||||
|
Oskari Timperi <oskari.timperi@iki.fi>
|
||||||
|
Pavel Medvedev <pmedvedev@gmail.com>
|
||||||
|
Philipp Storz <philipp.storz@bareos.com>
|
||||||
|
Quanah Gibson-Mount <quanah@openldap.org>
|
||||||
|
Salvador Ortiz <sog@msg.com.mx>
|
||||||
|
Sebastien Launay <sebastien@slaunay.fr>
|
||||||
|
Vladimir Romanov <vromanov@gmail.com>
|
||||||
|
Zano Foundation <crypto.sowle@gmail.com>
|
||||||
192
contrib/db/libmdbx/CMakeLists.dist-minimal
Normal file
192
contrib/db/libmdbx/CMakeLists.dist-minimal
Normal file
|
|
@ -0,0 +1,192 @@
|
||||||
|
##
|
||||||
|
## This is the minimal template for CMakeList.txt which could be used
|
||||||
|
## to build libmdbx from the "amalgamated form" of libmdbx's source code.
|
||||||
|
##
|
||||||
|
## The amalgamated form is intended to embedding libmdbx in other projects
|
||||||
|
## in cases when using as git-submodule is not acceptable or inconveniently.
|
||||||
|
##
|
||||||
|
## The amalgamated form could be generated from full git repository
|
||||||
|
## on Linux just by `make dist`.
|
||||||
|
##
|
||||||
|
|
||||||
|
##
|
||||||
|
## Copyright 2019 Leonid Yuriev <leo@yuriev.ru>
|
||||||
|
## and other libmdbx authors: please see AUTHORS file.
|
||||||
|
## All rights reserved.
|
||||||
|
##
|
||||||
|
## Redistribution and use in source and binary forms, with or without
|
||||||
|
## modification, are permitted only as authorized by the OpenLDAP
|
||||||
|
## Public License.
|
||||||
|
##
|
||||||
|
## A copy of this license is available in the file LICENSE in the
|
||||||
|
## top-level directory of the distribution or, alternatively, at
|
||||||
|
## <http://www.OpenLDAP.org/license.html>.
|
||||||
|
##
|
||||||
|
|
||||||
|
##
|
||||||
|
## libmdbx = { Revised and extended descendant of Symas LMDB. }
|
||||||
|
## Please see README.md at https://github.com/leo-yuriev/libmdbx
|
||||||
|
##
|
||||||
|
## Libmdbx is superior to LMDB in terms of features and reliability,
|
||||||
|
## not inferior in performance. libmdbx works on Linux, FreeBSD, MacOS X
|
||||||
|
## and other systems compliant with POSIX.1-2008, but also support Windows
|
||||||
|
## as a complementary platform.
|
||||||
|
##
|
||||||
|
## The next version is under active non-public development and will be
|
||||||
|
## released as MithrilDB and libmithrildb for libraries & packages.
|
||||||
|
## Admittedly mythical Mithril is resembling silver but being stronger and
|
||||||
|
## lighter than steel. Therefore MithrilDB is rightly relevant name.
|
||||||
|
##
|
||||||
|
## MithrilDB will be radically different from libmdbx by the new database
|
||||||
|
## format and API based on C++17, as well as the Apache 2.0 License.
|
||||||
|
## The goal of this revolution is to provide a clearer and robust API,
|
||||||
|
## add more features and new valuable properties of database.
|
||||||
|
##
|
||||||
|
## The Future will (be) Positive. Всё будет хорошо.
|
||||||
|
##
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.8.2)
|
||||||
|
cmake_policy(PUSH)
|
||||||
|
cmake_policy(VERSION 3.8.2)
|
||||||
|
if(NOT CMAKE_VERSION VERSION_LESS 3.9)
|
||||||
|
cmake_policy(SET CMP0069 NEW)
|
||||||
|
endif()
|
||||||
|
if(NOT CMAKE_VERSION VERSION_LESS 3.12)
|
||||||
|
cmake_policy(SET CMP0075 NEW)
|
||||||
|
endif()
|
||||||
|
if(NOT CMAKE_VERSION VERSION_LESS 3.13)
|
||||||
|
cmake_policy(SET CMP0077 NEW)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(DEFINED PROJECT_NAME)
|
||||||
|
set(SUBPROJECT ON)
|
||||||
|
set(NOT_SUBPROJECT OFF)
|
||||||
|
else()
|
||||||
|
set(SUBPROJECT OFF)
|
||||||
|
set(NOT_SUBPROJECT ON)
|
||||||
|
project(libmdbx C CXX)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_package(Threads REQUIRED)
|
||||||
|
|
||||||
|
if(NOT CMAKE_BUILD_TYPE)
|
||||||
|
set(CMAKE_BUILD_TYPE MinSizeRel CACHE STRING
|
||||||
|
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
|
||||||
|
FORCE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
list(FIND CMAKE_C_COMPILE_FEATURES c_std_11 HAS_C11)
|
||||||
|
if(NOT HAS_C11 LESS 0)
|
||||||
|
set(MDBX_C_STANDARD 11)
|
||||||
|
else()
|
||||||
|
set(MDBX_C_STANDARD 99)
|
||||||
|
endif()
|
||||||
|
message(STATUS "Use C${MDBX_C_STANDARD} for libmdbx")
|
||||||
|
|
||||||
|
# not supported by this (minimal) script
|
||||||
|
add_definitions(-DMDBX_AVOID_CRT=0)
|
||||||
|
|
||||||
|
# provide build timestamp
|
||||||
|
string(TIMESTAMP MDBX_BUILD_TIMESTAMP UTC)
|
||||||
|
add_definitions(-DMDBX_BUILD_TIMESTAMP="${MDBX_BUILD_TIMESTAMP}")
|
||||||
|
|
||||||
|
# provide compiler info
|
||||||
|
execute_process(COMMAND sh -c "${CMAKE_C_COMPILER} --version | head -1"
|
||||||
|
OUTPUT_VARIABLE MDBX_BUILD_COMPILER
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
ERROR_QUIET
|
||||||
|
RESULT_VARIABLE rc)
|
||||||
|
if(rc OR NOT MDBX_BUILD_COMPILER)
|
||||||
|
string(STRIP "${CMAKE_C_COMPILER_ID}-${CMAKE_C_COMPILER_VERSION}" MDBX_BUILD_COMPILER)
|
||||||
|
endif()
|
||||||
|
add_definitions(-DMDBX_BUILD_COMPILER="${MDBX_BUILD_COMPILER}")
|
||||||
|
|
||||||
|
# provide cpu/arch-system pair
|
||||||
|
if(CMAKE_C_COMPILER_TARGET)
|
||||||
|
set(MDBX_BUILD_TARGET "${CMAKE_C_COMPILER_TARGET}")
|
||||||
|
elseif(CMAKE_C_PLATFORM_ID AND NOT CMAKE_C_PLATFORM_ID STREQUAL CMAKE_SYSTEM_NAME)
|
||||||
|
string(STRIP "${CMAKE_C_PLATFORM_ID}-${CMAKE_SYSTEM_NAME}" MDBX_BUILD_TARGET)
|
||||||
|
elseif(CMAKE_LIBRARY_ARCHITECTURE)
|
||||||
|
string(STRIP "${CMAKE_LIBRARY_ARCHITECTURE}-${CMAKE_SYSTEM_NAME}" MDBX_BUILD_TARGET)
|
||||||
|
elseif(CMAKE_GENERATOR_PLATFORM AND NOT CMAKE_C_PLATFORM_ID STREQUAL CMAKE_SYSTEM_NAME)
|
||||||
|
string(STRIP "${CMAKE_GENERATOR_PLATFORM}-${CMAKE_SYSTEM_NAME}" MDBX_BUILD_TARGET)
|
||||||
|
elseif(CMAKE_SYSTEM_ARCH)
|
||||||
|
string(STRIP "${CMAKE_SYSTEM_ARCH}-${CMAKE_SYSTEM_NAME}" MDBX_BUILD_TARGET)
|
||||||
|
else()
|
||||||
|
string(STRIP "${CMAKE_SYSTEM_PROCESSOR}-${CMAKE_SYSTEM_NAME}" MDBX_BUILD_TARGET)
|
||||||
|
endif()
|
||||||
|
add_definitions(-DMDBX_BUILD_TARGET="${MDBX_BUILD_TARGET}")
|
||||||
|
|
||||||
|
# provide build target-config
|
||||||
|
if(CMAKE_CONFIGURATION_TYPES)
|
||||||
|
add_definitions(-DMDBX_BUILD_CONFIG="$<CONFIG>")
|
||||||
|
else()
|
||||||
|
add_definitions(-DMDBX_BUILD_CONFIG="${CMAKE_BUILD_TYPE}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# provide build cflags
|
||||||
|
set(MDBX_BUILD_FLAGS "")
|
||||||
|
list(APPEND MDBX_BUILD_FLAGS ${CMAKE_C_FLAGS})
|
||||||
|
list(APPEND MDBX_BUILD_FLAGS ${CMAKE_C_DEFINES})
|
||||||
|
if(CMAKE_CONFIGURATION_TYPES)
|
||||||
|
add_definitions(-DMDBX_BUILD_FLAGS_CONFIG="$<$<CONFIG:Debug>:${CMAKE_C_FLAGS_DEBUG} ${CMAKE_C_DEFINES_DEBUG}>$<$<CONFIG:Release>:${CMAKE_C_FLAGS_RELEASE} ${CMAKE_C_DEFINES_RELEASE}>$<$<CONFIG:RelWithDebInfo>:${CMAKE_C_FLAGS_RELWITHDEBINFO} ${CMAKE_C_DEFINES_RELWITHDEBINFO}>$<$<CONFIG:MinSizeRel>:${CMAKE_C_FLAGS_MINSIZEREL} ${CMAKE_C_DEFINES_MINSIZEREL}>")
|
||||||
|
else()
|
||||||
|
string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UPPERCASE)
|
||||||
|
list(APPEND MDBX_BUILD_FLAGS ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UPPERCASE}})
|
||||||
|
list(APPEND MDBX_BUILD_FLAGS ${CMAKE_C_DEFINES_${CMAKE_BUILD_TYPE_UPPERCASE}})
|
||||||
|
endif()
|
||||||
|
list(REMOVE_DUPLICATES MDBX_BUILD_FLAGS)
|
||||||
|
string(REPLACE ";" " " MDBX_BUILD_FLAGS "${MDBX_BUILD_FLAGS}")
|
||||||
|
add_definitions(-DMDBX_BUILD_FLAGS="${MDBX_BUILD_FLAGS}")
|
||||||
|
|
||||||
|
# shared library
|
||||||
|
if(NOT DEFINED MDBX_BUILD_SHARED_LIBRARY)
|
||||||
|
if(DEFINED BUILD_SHARED_LIBS)
|
||||||
|
option(MDBX_BUILD_SHARED_LIBRARY "Build libmdbx as shared library (DLL)" ${BUILD_SHARED_LIBS})
|
||||||
|
else()
|
||||||
|
option(MDBX_BUILD_SHARED_LIBRARY "Build libmdbx as shared library (DLL)" ON)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
if(MDBX_BUILD_SHARED_LIBRARY)
|
||||||
|
add_library(mdbx SHARED mdbx.c mdbx.h)
|
||||||
|
set_target_properties(mdbx PROPERTIES
|
||||||
|
C_STANDARD ${MDBX_C_STANDARD} C_STANDARD_REQUIRED ON
|
||||||
|
PUBLIC_HEADER mdbx.h)
|
||||||
|
target_compile_definitions(mdbx PRIVATE LIBMDBX_EXPORTS INTERFACE LIBMDBX_IMPORTS)
|
||||||
|
if(DEFINED INTERPROCEDURAL_OPTIMIZATION)
|
||||||
|
set_target_properties(mdbx PROPERTIES
|
||||||
|
INTERPROCEDURAL_OPTIMIZATION $<BOOL:${INTERPROCEDURAL_OPTIMIZATION}>)
|
||||||
|
endif()
|
||||||
|
target_link_libraries(mdbx PRIVATE ${CMAKE_THREAD_LIBS_INIT})
|
||||||
|
if(WIN32)
|
||||||
|
target_link_libraries(mdbx PRIVATE ntdll.lib)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# static library used for tools, to avoid rpath/dll-path troubles
|
||||||
|
add_library(mdbx-static STATIC EXCLUDE_FROM_ALL mdbx.c mdbx.h)
|
||||||
|
set_target_properties(mdbx-static PROPERTIES
|
||||||
|
C_STANDARD ${MDBX_C_STANDARD} C_STANDARD_REQUIRED ON
|
||||||
|
PUBLIC_HEADER mdbx.h)
|
||||||
|
target_link_libraries(mdbx-static INTERFACE ${CMAKE_THREAD_LIBS_INIT})
|
||||||
|
if(DEFINED INTERPROCEDURAL_OPTIMIZATION)
|
||||||
|
set_target_properties(mdbx-static PROPERTIES
|
||||||
|
INTERPROCEDURAL_OPTIMIZATION $<BOOL:${INTERPROCEDURAL_OPTIMIZATION}>)
|
||||||
|
endif()
|
||||||
|
if(WIN32)
|
||||||
|
target_link_libraries(mdbx-static INTERFACE ntdll.lib)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# mdbx-tools
|
||||||
|
foreach(TOOL mdbx_chk mdbx_copy mdbx_stat mdbx_dump mdbx_load)
|
||||||
|
add_executable(${TOOL} ${TOOL}.c)
|
||||||
|
set_target_properties(${TOOL} PROPERTIES
|
||||||
|
C_STANDARD ${MDBX_C_STANDARD} C_STANDARD_REQUIRED ON)
|
||||||
|
if(DEFINED INTERPROCEDURAL_OPTIMIZATION)
|
||||||
|
set_target_properties(${TOOL} PROPERTIES
|
||||||
|
INTERPROCEDURAL_OPTIMIZATION $<BOOL:${INTERPROCEDURAL_OPTIMIZATION}>)
|
||||||
|
endif()
|
||||||
|
target_link_libraries(${TOOL} mdbx-static)
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
cmake_policy(POP)
|
||||||
342
contrib/db/libmdbx/CMakeLists.txt
Normal file
342
contrib/db/libmdbx/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,342 @@
|
||||||
|
##
|
||||||
|
## Copyright 2019 Leonid Yuriev <leo@yuriev.ru>
|
||||||
|
## and other libmdbx authors: please see AUTHORS file.
|
||||||
|
## All rights reserved.
|
||||||
|
##
|
||||||
|
## Redistribution and use in source and binary forms, with or without
|
||||||
|
## modification, are permitted only as authorized by the OpenLDAP
|
||||||
|
## Public License.
|
||||||
|
##
|
||||||
|
## A copy of this license is available in the file LICENSE in the
|
||||||
|
## top-level directory of the distribution or, alternatively, at
|
||||||
|
## <http://www.OpenLDAP.org/license.html>.
|
||||||
|
##
|
||||||
|
|
||||||
|
##
|
||||||
|
## libmdbx = { Revised and extended descendant of Symas LMDB. }
|
||||||
|
## Please see README.md at https://github.com/leo-yuriev/libmdbx
|
||||||
|
##
|
||||||
|
## Libmdbx is superior to LMDB in terms of features and reliability,
|
||||||
|
## not inferior in performance. libmdbx works on Linux, FreeBSD, MacOS X
|
||||||
|
## and other systems compliant with POSIX.1-2008, but also support Windows
|
||||||
|
## as a complementary platform.
|
||||||
|
##
|
||||||
|
## The next version is under active non-public development and will be
|
||||||
|
## released as MithrilDB and libmithrildb for libraries & packages.
|
||||||
|
## Admittedly mythical Mithril is resembling silver but being stronger and
|
||||||
|
## lighter than steel. Therefore MithrilDB is rightly relevant name.
|
||||||
|
##
|
||||||
|
## MithrilDB will be radically different from libmdbx by the new database
|
||||||
|
## format and API based on C++17, as well as the Apache 2.0 License.
|
||||||
|
## The goal of this revolution is to provide a clearer and robust API,
|
||||||
|
## add more features and new valuable properties of database.
|
||||||
|
##
|
||||||
|
## The Future will (be) Positive. Всё будет хорошо.
|
||||||
|
##
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.8.2)
|
||||||
|
cmake_policy(PUSH)
|
||||||
|
cmake_policy(VERSION 3.8.2)
|
||||||
|
if(NOT CMAKE_VERSION VERSION_LESS 3.13)
|
||||||
|
cmake_policy(SET CMP0077 NEW)
|
||||||
|
endif()
|
||||||
|
if(NOT CMAKE_VERSION VERSION_LESS 3.12)
|
||||||
|
cmake_policy(SET CMP0075 NEW)
|
||||||
|
endif()
|
||||||
|
if(NOT CMAKE_VERSION VERSION_LESS 3.9)
|
||||||
|
cmake_policy(SET CMP0069 NEW)
|
||||||
|
include(CheckIPOSupported)
|
||||||
|
check_ipo_supported(RESULT CMAKE_INTERPROCEDURAL_OPTIMIZATION_AVAILABLE)
|
||||||
|
else()
|
||||||
|
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_AVAILABLE FALSE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(DEFINED PROJECT_NAME)
|
||||||
|
set(SUBPROJECT ON)
|
||||||
|
set(NOT_SUBPROJECT OFF)
|
||||||
|
if(NOT DEFINED BUILD_TESTING)
|
||||||
|
set(BUILD_TESTING OFF)
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
set(SUBPROJECT OFF)
|
||||||
|
set(NOT_SUBPROJECT ON)
|
||||||
|
project(libmdbx C CXX)
|
||||||
|
if(NOT DEFINED BUILD_TESTING)
|
||||||
|
set(BUILD_TESTING ON)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT CMAKE_BUILD_TYPE)
|
||||||
|
set(CMAKE_BUILD_TYPE MinSizeRel CACHE STRING
|
||||||
|
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
|
||||||
|
FORCE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
macro(add_mdbx_option NAME DESCRIPTION DEFAULT)
|
||||||
|
list(APPEND MDBX_BUILD_OPTIONS ${NAME})
|
||||||
|
if(NOT ${DEFAULT} STREQUAL "AUTO")
|
||||||
|
option(${NAME} "${DESCRIPTION}" ${DEFAULT})
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# only for compatibility testing
|
||||||
|
# set(CMAKE_CXX_STANDARD 14)
|
||||||
|
|
||||||
|
if(NOT "$ENV{TEAMCITY_PROCESS_FLOW_ID}" STREQUAL "")
|
||||||
|
set(CI TEAMCITY)
|
||||||
|
message(STATUS "TeamCity CI")
|
||||||
|
elseif(NOT "$ENV{TRAVIS}" STREQUAL "")
|
||||||
|
set(CI TRAVIS)
|
||||||
|
message(STATUS "Travis CI")
|
||||||
|
elseif(NOT "$ENV{CIRCLECI}" STREQUAL "")
|
||||||
|
set(CI CIRCLE)
|
||||||
|
message(STATUS "Circle CI")
|
||||||
|
elseif(NOT "$ENV{APPVEYOR}" STREQUAL "")
|
||||||
|
set(CI APPVEYOR)
|
||||||
|
message(STATUS "AppVeyor CI")
|
||||||
|
elseif(NOT "$ENV{CI}" STREQUAL "")
|
||||||
|
set(CI "$ENV{CI}")
|
||||||
|
message(STATUS "Other CI (${CI})")
|
||||||
|
else()
|
||||||
|
message(STATUS "Assume No any CI environment")
|
||||||
|
unset(CI)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# output all mdbx-related targets in single directory
|
||||||
|
if(NOT DEFINED MDBX_OUTPUT_DIR)
|
||||||
|
set(MDBX_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
endif()
|
||||||
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${MDBX_OUTPUT_DIR})
|
||||||
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${MDBX_OUTPUT_DIR})
|
||||||
|
set(CMAKE_PDB_OUTPUT_DIRECTORY ${MDBX_OUTPUT_DIR})
|
||||||
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${MDBX_OUTPUT_DIR})
|
||||||
|
|
||||||
|
include(CheckLibraryExists)
|
||||||
|
include(CheckIncludeFiles)
|
||||||
|
include(CheckCCompilerFlag)
|
||||||
|
include(CheckSymbolExists)
|
||||||
|
include(CheckCSourceRuns)
|
||||||
|
include(CheckCXXSourceRuns)
|
||||||
|
include(CheckCSourceCompiles)
|
||||||
|
include(CheckCXXSourceCompiles)
|
||||||
|
include(TestBigEndian)
|
||||||
|
include(CheckFunctionExists)
|
||||||
|
include(FindPackageMessage)
|
||||||
|
include(CheckStructHasMember)
|
||||||
|
include(CMakeDependentOption)
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
|
if(CMAKE_C_COMPILER_ID STREQUAL "MSVC" AND MSVC_VERSION LESS 1900)
|
||||||
|
message(SEND_ERROR "MSVC compiler ${MSVC_VERSION} is too old for building MDBX."
|
||||||
|
" At least 'Microsoft Visual Studio 2015' is required.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Set default build type to Release. This is to ease a User's life.
|
||||||
|
if(NOT CMAKE_BUILD_TYPE)
|
||||||
|
set(CMAKE_BUILD_TYPE Release CACHE STRING
|
||||||
|
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
|
||||||
|
FORCE)
|
||||||
|
endif()
|
||||||
|
string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UPPERCASE)
|
||||||
|
|
||||||
|
include(cmake/utils.cmake)
|
||||||
|
include(cmake/compiler.cmake)
|
||||||
|
include(cmake/profile.cmake)
|
||||||
|
|
||||||
|
find_program(ECHO echo)
|
||||||
|
find_program(CAT cat)
|
||||||
|
find_program(GIT git)
|
||||||
|
find_program(LD ld)
|
||||||
|
|
||||||
|
# CHECK_INCLUDE_FILES(unistd.h HAVE_UNISTD_H)
|
||||||
|
# CHECK_INCLUDE_FILES(sys/uio.h HAVE_SYS_UIO_H)
|
||||||
|
# CHECK_INCLUDE_FILES(sys/stat.h HAVE_SYS_STAT_H)
|
||||||
|
|
||||||
|
CHECK_FUNCTION_EXISTS(pow NOT_NEED_LIBM)
|
||||||
|
if(NOT_NEED_LIBM)
|
||||||
|
set(LIB_MATH "")
|
||||||
|
else()
|
||||||
|
set(CMAKE_REQUIRED_LIBRARIES m)
|
||||||
|
CHECK_FUNCTION_EXISTS(pow HAVE_LIBM)
|
||||||
|
if(HAVE_LIBM)
|
||||||
|
set(LIB_MATH m)
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "No libm found for math support")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_package(Threads REQUIRED)
|
||||||
|
|
||||||
|
if(SUBPROJECT)
|
||||||
|
if(NOT DEFINED BUILD_SHARED_LIBS)
|
||||||
|
option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)" OFF)
|
||||||
|
endif()
|
||||||
|
if(NOT DEFINED CMAKE_POSITION_INDEPENDENT_CODE)
|
||||||
|
option(CMAKE_POSITION_INDEPENDENT_CODE "Generate position independed (PIC)" ON)
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)" ON)
|
||||||
|
option(CMAKE_POSITION_INDEPENDENT_CODE "Generate position independed (PIC)" ON)
|
||||||
|
if (CC_HAS_ARCH_NATIVE)
|
||||||
|
option(BUILD_FOR_NATIVE_CPU "Generate code for the compiling machine CPU" OFF)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_CONFIGURATION_TYPES OR NOT CMAKE_BUILD_TYPE_UPPERCASE STREQUAL "DEBUG")
|
||||||
|
set(INTERPROCEDURAL_OPTIMIZATION_DEFAULT ON)
|
||||||
|
else()
|
||||||
|
set(INTERPROCEDURAL_OPTIMIZATION_DEFAULT OFF)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_INTERPROCEDURAL_OPTIMIZATION_AVAILABLE
|
||||||
|
OR GCC_LTO_AVAILABLE OR MSVC_LTO_AVAILABLE OR CLANG_LTO_AVAILABLE)
|
||||||
|
option(INTERPROCEDURAL_OPTIMIZATION "Enable interprocedural/LTO optimization" ${INTERPROCEDURAL_OPTIMIZATION_DEFAULT})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(INTERPROCEDURAL_OPTIMIZATION)
|
||||||
|
if(GCC_LTO_AVAILABLE)
|
||||||
|
set(LTO_ENABLED TRUE)
|
||||||
|
set(CMAKE_AR ${CMAKE_GCC_AR} CACHE PATH "Path to ar program with LTO-plugin" FORCE)
|
||||||
|
set(CMAKE_NM ${CMAKE_GCC_NM} CACHE PATH "Path to nm program with LTO-plugin" FORCE)
|
||||||
|
set(CMAKE_RANLIB ${CMAKE_GCC_RANLIB} CACHE PATH "Path to ranlib program with LTO-plugin" FORCE)
|
||||||
|
message(STATUS "MDBX indulge Link-Time Optimization by GCC")
|
||||||
|
elseif(CLANG_LTO_AVAILABLE)
|
||||||
|
set(LTO_ENABLED TRUE)
|
||||||
|
set(CMAKE_AR ${CMAKE_CLANG_AR} CACHE PATH "Path to ar program with LTO-plugin" FORCE)
|
||||||
|
set(CMAKE_NM ${CMAKE_CLANG_NM} CACHE PATH "Path to nm program with LTO-plugin" FORCE)
|
||||||
|
set(CMAKE_RANLIB ${CMAKE_CLANG_RANLIB} CACHE PATH "Path to ranlib program with LTO-plugin" FORCE)
|
||||||
|
message(STATUS "MDBX indulge Link-Time Optimization by CLANG")
|
||||||
|
elseif(MSVC_LTO_AVAILABLE)
|
||||||
|
set(LTO_ENABLED TRUE)
|
||||||
|
message(STATUS "MDBX indulge Link-Time Optimization by MSVC")
|
||||||
|
elseif(CMAKE_INTERPROCEDURAL_OPTIMIZATION_AVAILABLE)
|
||||||
|
message(STATUS "MDBX indulge Interprocedural Optimization by CMake")
|
||||||
|
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
|
||||||
|
set(LTO_ENABLED TRUE)
|
||||||
|
else()
|
||||||
|
message(WARNING "Unable to engage interprocedural/LTO optimization.")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION FALSE)
|
||||||
|
set(LTO_ENABLED FALSE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_program(VALGRIND valgrind)
|
||||||
|
if(VALGRIND)
|
||||||
|
# LY: cmake is ugly and nasty.
|
||||||
|
# - therefore memcheck-options should be defined before including ctest;
|
||||||
|
# - otherwise ctest may ignore it.
|
||||||
|
set(MEMORYCHECK_SUPPRESSIONS_FILE
|
||||||
|
"${PROJECT_SOURCE_DIR}/test/valgrind_suppress.txt"
|
||||||
|
CACHE FILEPATH "Suppressions file for Valgrind" FORCE)
|
||||||
|
set(MEMORYCHECK_COMMAND_OPTIONS
|
||||||
|
"--trace-children=yes --leak-check=full --track-origins=yes --error-exitcode=42 --error-markers=@ --errors-for-leak-kinds=definite --fair-sched=yes --suppressions=${MEMORYCHECK_SUPPRESSIONS_FILE}"
|
||||||
|
CACHE STRING "Valgrind options" FORCE)
|
||||||
|
set(VALGRIND_COMMAND_OPTIONS "${MEMORYCHECK_COMMAND_OPTIONS}" CACHE STRING "Valgrind options" FORCE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable 'make tags' target.
|
||||||
|
find_program(CTAGS ctags)
|
||||||
|
if(CTAGS)
|
||||||
|
add_custom_target(tags COMMAND ${CTAGS} -R -f tags
|
||||||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
||||||
|
add_custom_target(ctags DEPENDS tags)
|
||||||
|
endif(CTAGS)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable 'make reformat' target.
|
||||||
|
find_program(CLANG_FORMAT
|
||||||
|
NAMES clang-format-6.0 clang-format-5.0 clang-format-4.0
|
||||||
|
clang-format-3.9 clang-format-3.8 clang-format-3.7 clang-format)
|
||||||
|
if(CLANG_FORMAT AND UNIX)
|
||||||
|
add_custom_target(reformat
|
||||||
|
VERBATIM
|
||||||
|
COMMAND
|
||||||
|
git ls-files |
|
||||||
|
grep -E \\.\(c|cxx|cc|cpp|h|hxx|hpp\)\(\\.in\)?\$ |
|
||||||
|
xargs ${CLANG_FORMAT} -i --style=file
|
||||||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT "${PROJECT_BINARY_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}")
|
||||||
|
add_custom_target(distclean)
|
||||||
|
add_custom_command(TARGET distclean
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E remove_directory "${PROJECT_BINARY_DIR}"
|
||||||
|
COMMENT "Removing the build directory and its content")
|
||||||
|
elseif(IS_DIRECTORY .git AND GIT)
|
||||||
|
add_custom_target(distclean)
|
||||||
|
add_custom_command(TARGET distclean
|
||||||
|
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
||||||
|
COMMAND ${GIT} submodule foreach --recursive git clean -f -X -d
|
||||||
|
COMMAND ${GIT} clean -f -X -d
|
||||||
|
COMMENT "Removing all build files from the source directory")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
setup_compile_flags()
|
||||||
|
endif(SUBPROJECT)
|
||||||
|
|
||||||
|
list(FIND CMAKE_C_COMPILE_FEATURES c_std_11 HAS_C11)
|
||||||
|
if(NOT HAS_C11 LESS 0)
|
||||||
|
set(MDBX_C_STANDARD 11)
|
||||||
|
else()
|
||||||
|
set(MDBX_C_STANDARD 99)
|
||||||
|
endif()
|
||||||
|
message(STATUS "Use C${MDBX_C_STANDARD} for libmdbx")
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# #### ##### ##### # #### # # ####
|
||||||
|
# # # # # # # # # ## # #
|
||||||
|
# # # # # # # # # # # # ####
|
||||||
|
# # # ##### # # # # # # # #
|
||||||
|
# # # # # # # # # ## # #
|
||||||
|
# #### # # # #### # # ####
|
||||||
|
#
|
||||||
|
|
||||||
|
set(MDBX_BUILD_OPTIONS ENABLE_ASAN MDBX_USE_VALGRIND ENABLE_GPROF ENABLE_GCOV)
|
||||||
|
add_mdbx_option(MDBX_BUILD_SHARED_LIBRARY "Build libmdbx as shared library (DLL)" ${BUILD_SHARED_LIBS})
|
||||||
|
add_mdbx_option(MDBX_ALLOY_BUILD "Build MDBX library as single object file" ON)
|
||||||
|
add_mdbx_option(MDBX_TXN_CHECKOWNER "Checking transaction matches the calling thread inside libmdbx's API" ON)
|
||||||
|
add_mdbx_option(MDBX_TXN_CHECKPID "Paranoid checking PID inside libmdbx's API" AUTO)
|
||||||
|
mark_as_advanced(MDBX_TXN_CHECKPID)
|
||||||
|
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
|
||||||
|
add_mdbx_option(MDBX_DISABLE_GNU_SOURCE "Don't use nonstandard GNU/Linux extension functions" OFF)
|
||||||
|
mark_as_advanced(MDBX_DISABLE_GNU_SOURCE)
|
||||||
|
endif()
|
||||||
|
if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
|
||||||
|
add_mdbx_option(MDBX_OSX_SPEED_INSTEADOF_DURABILITY "Disable use fcntl(F_FULLFSYNC) in favor of speed" OFF)
|
||||||
|
mark_as_advanced(MDBX_OSX_SPEED_INSTEADOF_DURABILITY)
|
||||||
|
endif()
|
||||||
|
if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
|
||||||
|
add_mdbx_option(MDBX_AVOID_CRT "Avoid dependence from MSVC CRT" ${NOT_SUBPROJECT})
|
||||||
|
if(NOT MDBX_BUILD_SHARED_LIBRARY)
|
||||||
|
add_mdbx_option(MDBX_CONFIG_MANUAL_TLS_CALLBACK
|
||||||
|
"Provide mdbx_dll_handler() for manual initialization" OFF)
|
||||||
|
mark_as_advanced(MDBX_CONFIG_MANUAL_TLS_CALLBACK)
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
add_mdbx_option(MDBX_USE_ROBUST "Use POSIX.1-2008 robust mutexes" AUTO)
|
||||||
|
mark_as_advanced(MDBX_USE_ROBUST)
|
||||||
|
add_mdbx_option(MDBX_USE_OFDLOCKS "Use Open file description locks (aka OFD locks, non-POSIX)" AUTO)
|
||||||
|
mark_as_advanced(MDBX_USE_OFDLOCKS)
|
||||||
|
endif()
|
||||||
|
option(MDBX_ENABLE_TESTS "Build MDBX tests." ${BUILD_TESTING})
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
add_subdirectory(src)
|
||||||
|
if(MDBX_ENABLE_TESTS)
|
||||||
|
add_subdirectory(test)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(PACKAGE "libmdbx")
|
||||||
|
set(CPACK_PACKAGE_VERSION_MAJOR ${MDBX_VERSION_MAJOR})
|
||||||
|
set(CPACK_PACKAGE_VERSION_MINOR ${MDBX_VERSION_MINOR})
|
||||||
|
set(CPACK_PACKAGE_VERSION_PATCH ${MDBX_VERSION_RELEASE})
|
||||||
|
set(CPACK_PACKAGE_VERSION_COMMIT ${MDBX_VERSION_REVISION})
|
||||||
|
set(PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}.${CPACK_PACKAGE_VERSION_COMMIT}")
|
||||||
|
message(STATUS "libmdbx package version is ${PACKAGE_VERSION}")
|
||||||
|
|
||||||
|
cmake_policy(POP)
|
||||||
22
contrib/db/libmdbx/COPYRIGHT
Normal file
22
contrib/db/libmdbx/COPYRIGHT
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
Copyright 2015-2019 Leonid Yuriev <leo@yuriev.ru>.
|
||||||
|
Copyright 2011-2015 Howard Chu, Symas Corp.
|
||||||
|
Copyright 2015,2016 Peter-Service R&D LLC.
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted only as authorized by the OpenLDAP
|
||||||
|
Public License.
|
||||||
|
|
||||||
|
A copy of this license is available in the file LICENSE in the
|
||||||
|
top-level directory of the distribution or, alternatively, at
|
||||||
|
<http://www.OpenLDAP.org/license.html>.
|
||||||
|
|
||||||
|
OpenLDAP is a registered trademark of the OpenLDAP Foundation.
|
||||||
|
|
||||||
|
Individual files and/or contributed packages may be copyright by
|
||||||
|
other parties and/or subject to additional restrictions.
|
||||||
|
|
||||||
|
This work also contains materials derived from public sources.
|
||||||
|
|
||||||
|
Additional information about OpenLDAP can be obtained at
|
||||||
|
<http://www.openldap.org/>.
|
||||||
362
contrib/db/libmdbx/GNUmakefile
Normal file
362
contrib/db/libmdbx/GNUmakefile
Normal file
|
|
@ -0,0 +1,362 @@
|
||||||
|
# This makefile is for GNU Make, and nowadays provided
|
||||||
|
# just for compatibility and preservation of traditions.
|
||||||
|
# Please use CMake in case of any difficulties or problems.
|
||||||
|
#
|
||||||
|
# Preprocessor macros (for MDBX_OPTIONS) of interest...
|
||||||
|
# Note that the defaults should already be correct for most platforms;
|
||||||
|
# you should not need to change any of these. Read their descriptions
|
||||||
|
# in README and source code if you do. There may be other macros of interest.
|
||||||
|
SHELL := /bin/bash
|
||||||
|
|
||||||
|
# install sandbox
|
||||||
|
SANDBOX ?=
|
||||||
|
|
||||||
|
# install prefixes (inside sandbox)
|
||||||
|
prefix ?= /usr/local
|
||||||
|
mandir ?= $(prefix)/man
|
||||||
|
|
||||||
|
# lib/bin suffix for multiarch/biarch, e.g. '.x86_64'
|
||||||
|
suffix ?=
|
||||||
|
|
||||||
|
CC ?= gcc
|
||||||
|
LD ?= ld
|
||||||
|
MDBX_OPTIONS ?= -DNDEBUG=1
|
||||||
|
CFLAGS ?= -Os -g3 -Wall -Werror -Wextra -Wpedantic -ffunction-sections -fPIC -fvisibility=hidden -std=gnu11 -pthread -Wno-tautological-compare
|
||||||
|
|
||||||
|
# LY: '--no-as-needed,-lrt' for ability to built with modern glibc, but then run with the old
|
||||||
|
LDFLAGS ?= $(shell $(LD) --help 2>/dev/null | grep -q -- --gc-sections && echo '-Wl,--gc-sections,-z,relro,-O1')$(shell $(LD) --help 2>/dev/null | grep -q -- -dead_strip && echo '-Wl,-dead_strip')
|
||||||
|
EXE_LDFLAGS ?= -pthread
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
UNAME := $(shell uname -s 2>/dev/null || echo Unknown)
|
||||||
|
define uname2sosuffix
|
||||||
|
case "$(UNAME)" in
|
||||||
|
Darwin*|Mach*) echo dylib;;
|
||||||
|
CYGWIN*|MINGW*|MSYS*|Windows*) echo dll;;
|
||||||
|
*) echo so;;
|
||||||
|
esac
|
||||||
|
endef
|
||||||
|
SO_SUFFIX := $(shell $(uname2sosuffix))
|
||||||
|
|
||||||
|
HEADERS := mdbx.h
|
||||||
|
LIBRARIES := libmdbx.a libmdbx.$(SO_SUFFIX)
|
||||||
|
TOOLS := mdbx_stat mdbx_copy mdbx_dump mdbx_load mdbx_chk
|
||||||
|
MANPAGES := mdbx_stat.1 mdbx_copy.1 mdbx_dump.1 mdbx_load.1 mdbx_chk.1
|
||||||
|
|
||||||
|
.PHONY: mdbx all install clean test dist check
|
||||||
|
|
||||||
|
all: $(LIBRARIES) $(TOOLS)
|
||||||
|
|
||||||
|
mdbx: libmdbx.a libmdbx.$(SO_SUFFIX)
|
||||||
|
|
||||||
|
tools: $(TOOLS)
|
||||||
|
|
||||||
|
strip: all
|
||||||
|
strip libmdbx.$(SO_SUFFIX) $(TOOLS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf $(TOOLS) mdbx_test @* *.[ao] *.[ls]o *~ tmp.db/* \
|
||||||
|
*.gcov *.log *.err src/*.o test/*.o mdbx_example dist \
|
||||||
|
config.h src/elements/config.h src/elements/version.c *.tar*
|
||||||
|
|
||||||
|
libmdbx.a: mdbx-static.o
|
||||||
|
$(AR) rs $@ $?
|
||||||
|
|
||||||
|
libmdbx.$(SO_SUFFIX): mdbx-dylib.o
|
||||||
|
$(CC) $(CFLAGS) $^ -pthread -shared $(LDFLAGS) -o $@
|
||||||
|
|
||||||
|
#> dist-cutoff-begin
|
||||||
|
ifeq ($(wildcard mdbx.c),mdbx.c)
|
||||||
|
#< dist-cutoff-end
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# Amalgamated source code, i.e. distributed after `make dists`
|
||||||
|
MAN_SRCDIR := man1/
|
||||||
|
|
||||||
|
config.h: mdbx.c $(lastword $(MAKEFILE_LIST))
|
||||||
|
(echo '#define MDBX_BUILD_TIMESTAMP "$(shell date +%Y-%m-%dT%H:%M:%S%z)"' \
|
||||||
|
&& echo '#define MDBX_BUILD_FLAGS "$(CFLAGS) $(LDFLAGS)"' \
|
||||||
|
&& echo '#define MDBX_BUILD_COMPILER "$(shell set -o pipefail; $(CC) --version | head -1 || echo 'Please use GCC or CLANG compatible compiler')"' \
|
||||||
|
&& echo '#define MDBX_BUILD_TARGET "$(shell set -o pipefail; LC_ALL=C $(CC) -v 2>&1 | grep -i '^Target:' | cut -d ' ' -f 2- || echo 'Please use GCC or CLANG compatible compiler')"' \
|
||||||
|
) > $@
|
||||||
|
|
||||||
|
mdbx-dylib.o: config.h mdbx.c $(lastword $(MAKEFILE_LIST))
|
||||||
|
$(CC) $(CFLAGS) $(MDBX_OPTIONS) '-DMDBX_CONFIG_H="config.h"' -DLIBMDBX_EXPORTS=1 -c mdbx.c -o $@
|
||||||
|
|
||||||
|
mdbx-static.o: config.h mdbx.c $(lastword $(MAKEFILE_LIST))
|
||||||
|
$(CC) $(CFLAGS) $(MDBX_OPTIONS) '-DMDBX_CONFIG_H="config.h"' -ULIBMDBX_EXPORTS -c mdbx.c -o $@
|
||||||
|
|
||||||
|
mdbx_%: mdbx_%.c libmdbx.a
|
||||||
|
$(CC) $(CFLAGS) $(MDBX_OPTIONS) '-DMDBX_CONFIG_H="config.h"' $^ $(EXE_LDFLAGS) -o $@
|
||||||
|
|
||||||
|
#> dist-cutoff-begin
|
||||||
|
else
|
||||||
|
################################################################################
|
||||||
|
# Plain (non-amalgamated) sources with test
|
||||||
|
|
||||||
|
define uname2osal
|
||||||
|
case "$(UNAME)" in
|
||||||
|
CYGWIN*|MINGW*|MSYS*|Windows*) echo windows;;
|
||||||
|
*) echo unix;;
|
||||||
|
esac
|
||||||
|
endef
|
||||||
|
|
||||||
|
define uname2titer
|
||||||
|
case "$(UNAME)" in
|
||||||
|
Darwin*|Mach*) echo 2;;
|
||||||
|
*) echo 12;;
|
||||||
|
esac
|
||||||
|
endef
|
||||||
|
|
||||||
|
DIST_EXTRA := LICENSE README.md CMakeLists.txt GNUmakefile $(addprefix man1/, $(MANPAGES))
|
||||||
|
DIST_SRC := mdbx.h mdbx.c $(addsuffix .c, $(TOOLS))
|
||||||
|
|
||||||
|
TEST_DB ?= $(shell [ -d /dev/shm ] && echo /dev/shm || echo /tmp)/mdbx-test.db
|
||||||
|
TEST_LOG ?= $(shell [ -d /dev/shm ] && echo /dev/shm || echo /tmp)/mdbx-test.log
|
||||||
|
TEST_OSAL := $(shell $(uname2osal))
|
||||||
|
TEST_ITER := $(shell $(uname2titer))
|
||||||
|
TEST_SRC := test/osal-$(TEST_OSAL).cc $(filter-out $(wildcard test/osal-*.cc), $(wildcard test/*.cc))
|
||||||
|
TEST_INC := $(wildcard test/*.h)
|
||||||
|
TEST_OBJ := $(patsubst %.cc,%.o,$(TEST_SRC))
|
||||||
|
CXX ?= g++
|
||||||
|
CXXSTD ?= $(shell $(CXX) -std=c++27 -c test/test.cc -o /dev/null 2>/dev/null && echo -std=c++17 || echo -std=c++11)
|
||||||
|
CXXFLAGS := $(CXXSTD) $(filter-out -std=gnu11,$(CFLAGS))
|
||||||
|
|
||||||
|
MAN_SRCDIR := src/man1/
|
||||||
|
ALLOY_DEPS := $(wildcard src/elements/*)
|
||||||
|
MDBX_VERSION_GIT = ${shell set -o pipefail; git describe --tags | sed -n 's|^v*\([0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\)\(.*\)|\1|p' || echo 'Please fetch tags and/or install latest git version'}
|
||||||
|
MDBX_GIT_TIMESTAMP = $(shell git show --no-patch --format=%cI HEAD || echo 'Please install latest get version')
|
||||||
|
MDBX_GIT_DESCRIBE = $(shell git describe --tags --long --dirty=-dirty || echo 'Please fetch tags and/or install latest git version')
|
||||||
|
MDBX_VERSION_SUFFIX = $(shell set -o pipefail; echo -n '$(MDBX_GIT_DESCRIBE)' | tr -c -s '[a-zA-Z0-9]' _)
|
||||||
|
MDBX_BUILD_SOURCERY = $(shell set -o pipefail; $(MAKE) -s src/elements/version.c && (openssl dgst -r -sha256 src/elements/version.c || sha256sum src/elements/version.c || shasum -a 256 src/elements/version.c) 2>/dev/null | cut -d ' ' -f 1 || echo 'Please install openssl or sha256sum or shasum')_$(MDBX_VERSION_SUFFIX)
|
||||||
|
|
||||||
|
test check: all mdbx_example mdbx_test
|
||||||
|
rm -f $(TEST_DB) $(TEST_LOG) && (set -o pipefail; \
|
||||||
|
(./mdbx_test --progress --console=no --repeat=$(TEST_ITER) --pathname=$(TEST_DB) --dont-cleanup-after basic && \
|
||||||
|
./mdbx_test --mode=-writemap,-lifo --progress --console=no --repeat=1 --pathname=$(TEST_DB) --dont-cleanup-after basic) \
|
||||||
|
| tee -a $(TEST_LOG) | tail -n 42) \
|
||||||
|
&& ./mdbx_chk -vvn $(TEST_DB) && ./mdbx_chk -vvn $(TEST_DB)-copy
|
||||||
|
|
||||||
|
mdbx_example: mdbx.h example/example-mdbx.c libmdbx.$(SO_SUFFIX)
|
||||||
|
$(CC) $(CFLAGS) -I. example/example-mdbx.c ./libmdbx.$(SO_SUFFIX) -o $@
|
||||||
|
|
||||||
|
check-singleprocess: all mdbx_test
|
||||||
|
rm -f $(TEST_DB) $(TEST_LOG) && (set -o pipefail; \
|
||||||
|
(./mdbx_test --progress --console=no --repeat=42 --pathname=$(TEST_DB) --dont-cleanup-after --hill && \
|
||||||
|
./mdbx_test --progress --console=no --repeat=2 --pathname=$(TEST_DB) --dont-cleanup-before --dont-cleanup-after --copy && \
|
||||||
|
./mdbx_test --mode=-writemap,-lifo --progress --console=no --repeat=42 --pathname=$(TEST_DB) --dont-cleanup-after --nested) \
|
||||||
|
| tee -a $(TEST_LOG) | tail -n 42) \
|
||||||
|
&& ./mdbx_chk -vvn $(TEST_DB) && ./mdbx_chk -vvn $(TEST_DB)-copy
|
||||||
|
|
||||||
|
check-fault: all mdbx_test
|
||||||
|
rm -f $(TEST_DB) $(TEST_LOG) && (set -o pipefail; ./mdbx_test --progress --console=no --pathname=$(TEST_DB) --inject-writefault=42 --dump-config --dont-cleanup-after basic | tee -a $(TEST_LOG) | tail -n 42) \
|
||||||
|
; ./mdbx_chk -vvnw $(TEST_DB) && ([ ! -e $(TEST_DB)-copy ] || ./mdbx_chk -vvn $(TEST_DB)-copy)
|
||||||
|
|
||||||
|
VALGRIND=valgrind --trace-children=yes --log-file=valgrind-%p.log --leak-check=full --track-origins=yes --error-exitcode=42 --suppressions=test/valgrind_suppress.txt
|
||||||
|
memcheck check-valgrind: all mdbx_test
|
||||||
|
@echo "$(MDBX_OPTIONS)" | grep -q MDBX_USE_VALGRIND || echo "WARNING: Please build libmdbx with -DMDBX_USE_VALGRIND to avoid false-positives from Valgrind !!!" >&2
|
||||||
|
rm -f valgrind-*.log $(TEST_DB) $(TEST_LOG) && (set -o pipefail; \
|
||||||
|
($(VALGRIND) ./mdbx_test --mode=-writemap,-lifo --progress --console=no --repeat=4 --pathname=$(TEST_DB) --dont-cleanup-after basic && \
|
||||||
|
$(VALGRIND) ./mdbx_test --progress --console=no --pathname=$(TEST_DB) --dont-cleanup-before --dont-cleanup-after --copy && \
|
||||||
|
$(VALGRIND) ./mdbx_test --progress --console=no --repeat=2 --pathname=$(TEST_DB) --dont-cleanup-after basic) \
|
||||||
|
| tee -a $(TEST_LOG) | tail -n 42) \
|
||||||
|
&& $(VALGRIND) ./mdbx_chk -vvn $(TEST_DB) && ./mdbx_chk -vvn $(TEST_DB)-copy
|
||||||
|
|
||||||
|
define test-rule
|
||||||
|
$(patsubst %.cc,%.o,$(1)): $(1) $(TEST_INC) mdbx.h $(lastword $(MAKEFILE_LIST))
|
||||||
|
$(CXX) $(CXXFLAGS) $(MDBX_OPTIONS) -c $(1) -o $$@
|
||||||
|
|
||||||
|
endef
|
||||||
|
$(foreach file,$(TEST_SRC),$(eval $(call test-rule,$(file))))
|
||||||
|
|
||||||
|
mdbx_%: src/tools/mdbx_%.c libmdbx.a
|
||||||
|
$(CC) $(CFLAGS) $(MDBX_OPTIONS) '-DMDBX_CONFIG_H="config.h"' $^ $(EXE_LDFLAGS) -o $@
|
||||||
|
|
||||||
|
mdbx_test: $(TEST_OBJ) libmdbx.$(SO_SUFFIX)
|
||||||
|
$(CXX) $(CXXFLAGS) $(TEST_OBJ) -Wl,-rpath . -L . -l mdbx $(EXE_LDFLAGS) -o $@
|
||||||
|
|
||||||
|
git_DIR := $(shell if [ -d .git ]; then echo .git; elif [ -s .git -a -f .git ]; then grep '^gitdir: ' .git | cut -d ':' -f 2; else echo "Please use libmdbx as a git-submodule or the amalgamated source code" >&2 && echo git_directory; fi)
|
||||||
|
|
||||||
|
src/elements/version.c: src/elements/version.c.in $(lastword $(MAKEFILE_LIST)) $(git_DIR)/HEAD $(git_DIR)/index $(git_DIR)/refs/tags
|
||||||
|
sed \
|
||||||
|
-e "s|@MDBX_GIT_TIMESTAMP@|$(MDBX_GIT_TIMESTAMP)|" \
|
||||||
|
-e "s|@MDBX_GIT_TREE@|$(shell git show --no-patch --format=%T HEAD || echo 'Please install latest get version')|" \
|
||||||
|
-e "s|@MDBX_GIT_COMMIT@|$(shell git show --no-patch --format=%H HEAD || echo 'Please install latest get version')|" \
|
||||||
|
-e "s|@MDBX_GIT_DESCRIBE@|$(MDBX_GIT_DESCRIBE)|" \
|
||||||
|
-e "s|\$${MDBX_VERSION_MAJOR}|$(shell echo '$(MDBX_VERSION_GIT)' | cut -d . -f 1)|" \
|
||||||
|
-e "s|\$${MDBX_VERSION_MINOR}|$(shell echo '$(MDBX_VERSION_GIT)' | cut -d . -f 2)|" \
|
||||||
|
-e "s|\$${MDBX_VERSION_RELEASE}|$(shell echo '$(MDBX_VERSION_GIT)' | cut -d . -f 3)|" \
|
||||||
|
-e "s|\$${MDBX_VERSION_REVISION}|$(shell git rev-list --count --no-merges HEAD || echo 'Please fetch tags and/or install latest git version')|" \
|
||||||
|
src/elements/version.c.in > $@
|
||||||
|
|
||||||
|
src/elements/config.h: src/elements/version.c $(lastword $(MAKEFILE_LIST))
|
||||||
|
(echo '#define MDBX_BUILD_TIMESTAMP "$(shell date +%Y-%m-%dT%H:%M:%S%z)"' \
|
||||||
|
&& echo '#define MDBX_BUILD_FLAGS "$(CFLAGS) $(LDFLAGS)"' \
|
||||||
|
&& echo '#define MDBX_BUILD_COMPILER "$(shell set -o pipefail; $(CC) --version | head -1 || echo 'Please use GCC or CLANG compatible compiler')"' \
|
||||||
|
&& echo '#define MDBX_BUILD_TARGET "$(shell set -o pipefail; LC_ALL=C $(CC) -v 2>&1 | grep -i '^Target:' | cut -d ' ' -f 2- || echo 'Please use GCC or CLANG compatible compiler')"' \
|
||||||
|
&& echo '#define MDBX_BUILD_SOURCERY $(MDBX_BUILD_SOURCERY)' \
|
||||||
|
) > $@
|
||||||
|
|
||||||
|
mdbx-dylib.o: src/elements/config.h src/elements/version.c src/alloy.c $(ALLOY_DEPS) $(lastword $(MAKEFILE_LIST))
|
||||||
|
$(CC) $(CFLAGS) $(MDBX_OPTIONS) '-DMDBX_CONFIG_H="config.h"' -DLIBMDBX_EXPORTS=1 -c src/alloy.c -o $@
|
||||||
|
|
||||||
|
mdbx-static.o: src/elements/config.h src/elements/version.c src/alloy.c $(ALLOY_DEPS) $(lastword $(MAKEFILE_LIST))
|
||||||
|
$(CC) $(CFLAGS) $(MDBX_OPTIONS) '-DMDBX_CONFIG_H="config.h"' -ULIBMDBX_EXPORTS -c src/alloy.c -o $@
|
||||||
|
|
||||||
|
.PHONY: dist
|
||||||
|
dist: libmdbx-sources-$(MDBX_VERSION_SUFFIX).tar.gz $(lastword $(MAKEFILE_LIST))
|
||||||
|
|
||||||
|
libmdbx-sources-$(MDBX_VERSION_SUFFIX).tar.gz: $(addprefix dist/, $(DIST_SRC) $(DIST_EXTRA)) $(addprefix dist/man1/,$(MANPAGES))
|
||||||
|
tar -c -a -f $@ --owner=0 --group=0 -C dist $(DIST_SRC) $(DIST_EXTRA) \
|
||||||
|
&& rm dist/@tmp-shared_internals.inc
|
||||||
|
|
||||||
|
dist/mdbx.h: mdbx.h src/elements/version.c $(lastword $(MAKEFILE_LIST))
|
||||||
|
mkdir -p dist && cp $< $@
|
||||||
|
|
||||||
|
dist/GNUmakefile: GNUmakefile
|
||||||
|
mkdir -p dist && sed -e '/^#> dist-cutoff-begin/,/^#< dist-cutoff-end/d' $< > $@
|
||||||
|
|
||||||
|
dist/@tmp-shared_internals.inc: src/elements/version.c $(ALLOY_DEPS) $(lastword $(MAKEFILE_LIST))
|
||||||
|
mkdir -p dist && sed \
|
||||||
|
-e 's|#pragma once|#define MDBX_ALLOY 1\n#define MDBX_BUILD_SOURCERY $(MDBX_BUILD_SOURCERY)|' \
|
||||||
|
-e 's|#include "../../mdbx.h"|@INCLUDE "mdbx.h"|' \
|
||||||
|
-e '/#include "defs.h"/r src/elements/defs.h' \
|
||||||
|
-e '/#include "osal.h"/r src/elements/osal.h' \
|
||||||
|
src/elements/internals.h > $@
|
||||||
|
|
||||||
|
dist/mdbx.c: dist/@tmp-shared_internals.inc $(lastword $(MAKEFILE_LIST))
|
||||||
|
mkdir -p dist && (cat dist/@tmp-shared_internals.inc \
|
||||||
|
&& cat src/elements/core.c src/elements/osal.c src/elements/version.c \
|
||||||
|
&& echo '#if defined(_WIN32) || defined(_WIN64)' \
|
||||||
|
&& cat src/elements/lck-windows.c && echo '#else /* LCK-implementation */' \
|
||||||
|
&& cat src/elements/lck-posix.c && echo '#endif /* LCK-implementation */' \
|
||||||
|
) | grep -v -e '#include "' -e '#pragma once' | sed 's|@INCLUDE|#include|' > $@
|
||||||
|
|
||||||
|
define dist-tool-rule
|
||||||
|
dist/$(1).c: src/tools/$(1).c src/tools/wingetopt.h src/tools/wingetopt.c \
|
||||||
|
dist/@tmp-shared_internals.inc $(lastword $(MAKEFILE_LIST))
|
||||||
|
mkdir -p dist && sed \
|
||||||
|
-e '/#include "..\/elements\/internals.h"/r dist/@tmp-shared_internals.inc' \
|
||||||
|
-e '/#include "wingetopt.h"/r src/tools/wingetopt.c' \
|
||||||
|
src/tools/$(1).c \
|
||||||
|
| grep -v -e '#include "' -e '#pragma once' -e '#define MDBX_ALLOY' \
|
||||||
|
| sed 's|@INCLUDE|#include|' > $$@
|
||||||
|
|
||||||
|
endef
|
||||||
|
$(foreach file,$(TOOLS),$(eval $(call dist-tool-rule,$(file))))
|
||||||
|
|
||||||
|
dist/man1/mdbx_%.1: src/man1/mdbx_%.1
|
||||||
|
mkdir -p dist/man1/ && cp $< $@
|
||||||
|
dist/LICENSE: LICENSE
|
||||||
|
mkdir -p dist/man1/ && cp $< $@
|
||||||
|
dist/README.md: README.md
|
||||||
|
mkdir -p dist/man1/ && cp $< $@
|
||||||
|
dist/CMakeLists.txt: CMakeLists.dist-minimal
|
||||||
|
mkdir -p dist/man1/ && cp $< $@
|
||||||
|
endif
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# Cross-compilation simple test
|
||||||
|
|
||||||
|
CROSS_LIST = mips-linux-gnu-gcc \
|
||||||
|
powerpc64-linux-gnu-gcc powerpc-linux-gnu-gcc \
|
||||||
|
arm-linux-gnueabihf-gcc aarch64-linux-gnu-gcc \
|
||||||
|
sh4-linux-gnu-gcc mips64-linux-gnuabi64-gcc
|
||||||
|
|
||||||
|
# hppa-linux-gnu-gcc - don't supported by current qemu release
|
||||||
|
# s390x-linux-gnu-gcc - qemu troubles (hang/abort)
|
||||||
|
# sparc64-linux-gnu-gcc - qemu troubles (fcntl for F_SETLK/F_GETLK)
|
||||||
|
# alpha-linux-gnu-gcc - qemu (or gcc) troubles (coredump)
|
||||||
|
|
||||||
|
CROSS_LIST_NOQEMU = hppa-linux-gnu-gcc s390x-linux-gnu-gcc \
|
||||||
|
sparc64-linux-gnu-gcc alpha-linux-gnu-gcc
|
||||||
|
|
||||||
|
cross-gcc:
|
||||||
|
@echo "CORRESPONDING CROSS-COMPILERs ARE REQUIRED."
|
||||||
|
@echo "FOR INSTANCE: apt install g++-aarch64-linux-gnu g++-alpha-linux-gnu g++-arm-linux-gnueabihf g++-hppa-linux-gnu g++-mips-linux-gnu g++-mips64-linux-gnuabi64 g++-powerpc-linux-gnu g++-powerpc64-linux-gnu g++-s390x-linux-gnu g++-sh4-linux-gnu g++-sparc64-linux-gnu"
|
||||||
|
@for CC in $(CROSS_LIST_NOQEMU) $(CROSS_LIST); do \
|
||||||
|
echo "===================== $$CC"; \
|
||||||
|
$(MAKE) clean && CC=$$CC CXX=$$(echo $$CC | sed 's/-gcc/-g++/') EXE_LDFLAGS=-static $(MAKE) all || exit $$?; \
|
||||||
|
done
|
||||||
|
|
||||||
|
# Unfortunately qemu don't provide robust support for futexes.
|
||||||
|
# Therefore it is impossible to run full multi-process tests.
|
||||||
|
cross-qemu:
|
||||||
|
@echo "CORRESPONDING CROSS-COMPILERs AND QEMUs ARE REQUIRED."
|
||||||
|
@echo "FOR INSTANCE: "
|
||||||
|
@echo " 1) apt install g++-aarch64-linux-gnu g++-alpha-linux-gnu g++-arm-linux-gnueabihf g++-hppa-linux-gnu g++-mips-linux-gnu g++-mips64-linux-gnuabi64 g++-powerpc-linux-gnu g++-powerpc64-linux-gnu g++-s390x-linux-gnu g++-sh4-linux-gnu g++-sparc64-linux-gnu"
|
||||||
|
@echo " 2) apt install binfmt-support qemu-user-static qemu-user qemu-system-arm qemu-system-mips qemu-system-misc qemu-system-ppc qemu-system-sparc"
|
||||||
|
@for CC in $(CROSS_LIST); do \
|
||||||
|
echo "===================== $$CC + qemu"; \
|
||||||
|
$(MAKE) clean && \
|
||||||
|
CC=$$CC CXX=$$(echo $$CC | sed 's/-gcc/-g++/') EXE_LDFLAGS=-static MDBX_OPTIONS="-DMDBX_SAFE4QEMU $(MDBX_OPTIONS)" \
|
||||||
|
$(MAKE) check-singleprocess || exit $$?; \
|
||||||
|
done
|
||||||
|
|
||||||
|
#< dist-cutoff-end
|
||||||
|
install: $(LIBRARIES) $(TOOLS) $(HEADERS)
|
||||||
|
mkdir -p $(SANDBOX)$(prefix)/bin$(suffix) \
|
||||||
|
&& cp -t $(SANDBOX)$(prefix)/bin$(suffix) $(TOOLS) && \
|
||||||
|
mkdir -p $(SANDBOX)$(prefix)/lib$(suffix) \
|
||||||
|
&& cp -t $(SANDBOX)$(prefix)/lib$(suffix) $(LIBRARIES) && \
|
||||||
|
mkdir -p $(SANDBOX)$(prefix)/include \
|
||||||
|
&& cp -t $(SANDBOX)$(prefix)/include $(HEADERS) && \
|
||||||
|
mkdir -p $(SANDBOX)$(mandir)/man1 \
|
||||||
|
&& cp -t $(SANDBOX)$(mandir)/man1 $(addprefix $(MAN_SRCDIR), $(MANPAGES))
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# Benchmarking by ioarena
|
||||||
|
|
||||||
|
IOARENA ?= $(shell \
|
||||||
|
(test -x ../ioarena/@BUILD/src/ioarena && echo ../ioarena/@BUILD/src/ioarena) || \
|
||||||
|
(test -x ../../@BUILD/src/ioarena && echo ../../@BUILD/src/ioarena) || \
|
||||||
|
(test -x ../../src/ioarena && echo ../../src/ioarena) || which ioarena)
|
||||||
|
NN ?= 25000000
|
||||||
|
|
||||||
|
ifneq ($(wildcard $(IOARENA)),)
|
||||||
|
|
||||||
|
.PHONY: bench clean-bench re-bench
|
||||||
|
|
||||||
|
clean-bench:
|
||||||
|
rm -rf bench-*.txt _ioarena/*
|
||||||
|
|
||||||
|
re-bench: clean-bench bench
|
||||||
|
|
||||||
|
define bench-rule
|
||||||
|
bench-$(1)_$(2).txt: $(3) $(IOARENA) $(lastword $(MAKEFILE_LIST))
|
||||||
|
LD_LIBRARY_PATH="./:$$$${LD_LIBRARY_PATH}" \
|
||||||
|
$(IOARENA) -D $(1) -B crud -m nosync -n $(2) \
|
||||||
|
| tee $$@ | grep throughput && \
|
||||||
|
LD_LIBRARY_PATH="./:$$$${LD_LIBRARY_PATH}" \
|
||||||
|
$(IOARENA) -D $(1) -B get,iterate -m sync -r 4 -n $(2) \
|
||||||
|
| tee -a $$@ | grep throughput \
|
||||||
|
|| mv -f $$@ $$@.error
|
||||||
|
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(eval $(call bench-rule,mdbx,$(NN),libmdbx.$(SO_SUFFIX)))
|
||||||
|
|
||||||
|
$(eval $(call bench-rule,sophia,$(NN)))
|
||||||
|
$(eval $(call bench-rule,leveldb,$(NN)))
|
||||||
|
$(eval $(call bench-rule,rocksdb,$(NN)))
|
||||||
|
$(eval $(call bench-rule,wiredtiger,$(NN)))
|
||||||
|
$(eval $(call bench-rule,forestdb,$(NN)))
|
||||||
|
$(eval $(call bench-rule,lmdb,$(NN)))
|
||||||
|
$(eval $(call bench-rule,nessdb,$(NN)))
|
||||||
|
$(eval $(call bench-rule,sqlite3,$(NN)))
|
||||||
|
$(eval $(call bench-rule,ejdb,$(NN)))
|
||||||
|
$(eval $(call bench-rule,vedisdb,$(NN)))
|
||||||
|
$(eval $(call bench-rule,dummy,$(NN)))
|
||||||
|
|
||||||
|
$(eval $(call bench-rule,debug,10))
|
||||||
|
|
||||||
|
bench: bench-mdbx_$(NN).txt
|
||||||
|
|
||||||
|
.PHONY: bench-debug
|
||||||
|
|
||||||
|
bench-debug: bench-debug_10.txt
|
||||||
|
|
||||||
|
bench-quartet: bench-mdbx_$(NN).txt bench-lmdb_$(NN).txt bench-rocksdb_$(NN).txt bench-wiredtiger_$(NN).txt
|
||||||
|
|
||||||
|
endif
|
||||||
47
contrib/db/libmdbx/LICENSE
Normal file
47
contrib/db/libmdbx/LICENSE
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
The OpenLDAP Public License
|
||||||
|
Version 2.8, 17 August 2003
|
||||||
|
|
||||||
|
Redistribution and use of this software and associated documentation
|
||||||
|
("Software"), with or without modification, are permitted provided
|
||||||
|
that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions in source form must retain copyright statements
|
||||||
|
and notices,
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce applicable copyright
|
||||||
|
statements and notices, this list of conditions, and the following
|
||||||
|
disclaimer in the documentation and/or other materials provided
|
||||||
|
with the distribution, and
|
||||||
|
|
||||||
|
3. Redistributions must contain a verbatim copy of this document.
|
||||||
|
|
||||||
|
The OpenLDAP Foundation may revise this license from time to time.
|
||||||
|
Each revision is distinguished by a version number. You may use
|
||||||
|
this Software under terms of this license revision or under the
|
||||||
|
terms of any subsequent revision of the license.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE OPENLDAP FOUNDATION AND ITS
|
||||||
|
CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||||
|
SHALL THE OPENLDAP FOUNDATION, ITS CONTRIBUTORS, OR THE AUTHOR(S)
|
||||||
|
OR OWNER(S) OF THE SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
|
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
The names of the authors and copyright holders must not be used in
|
||||||
|
advertising or otherwise to promote the sale, use or other dealing
|
||||||
|
in this Software without specific, written prior permission. Title
|
||||||
|
to copyright in this Software shall at all times remain with copyright
|
||||||
|
holders.
|
||||||
|
|
||||||
|
OpenLDAP is a registered trademark of the OpenLDAP Foundation.
|
||||||
|
|
||||||
|
Copyright 1999-2003 The OpenLDAP Foundation, Redwood City,
|
||||||
|
California, USA. All Rights Reserved. Permission to copy and
|
||||||
|
distribute verbatim copies of this document is granted.
|
||||||
591
contrib/db/libmdbx/README.md
Normal file
591
contrib/db/libmdbx/README.md
Normal file
|
|
@ -0,0 +1,591 @@
|
||||||
|
### The [repository now only mirrored on the Github](https://abf.io/erthink/libmdbx) due to illegal discriminatory restrictions for Russian Crimea and for sovereign crimeans.
|
||||||
|
<!-- Required extensions: pymdownx.betterem, pymdownx.tilde, pymdownx.emoji, pymdownx.tasklist, pymdownx.superfences -->
|
||||||
|
-----
|
||||||
|
|
||||||
|
libmdbx
|
||||||
|
======================================
|
||||||
|
|
||||||
|
_libmdbx_ is an extremely fast, compact, powerful, embedded
|
||||||
|
transactional [key-value
|
||||||
|
store](https://en.wikipedia.org/wiki/Key-value_database)
|
||||||
|
database, with permissive [OpenLDAP Public License](LICENSE).
|
||||||
|
_libmdbx_ has a specific set of properties and capabilities,
|
||||||
|
focused on creating unique lightweight solutions with
|
||||||
|
extraordinary performance.
|
||||||
|
|
||||||
|
The next version is under active non-public development and will be
|
||||||
|
released as **_MithrilDB_** and `libmithrildb` for libraries & packages.
|
||||||
|
Admittedly mythical [Mithril](https://en.wikipedia.org/wiki/Mithril) is
|
||||||
|
resembling silver but being stronger and lighter than steel. Therefore
|
||||||
|
_MithrilDB_ is rightly relevant name.
|
||||||
|
> _MithrilDB_ will be radically different from _libmdbx_ by the new
|
||||||
|
> database format and API based on C++17, as well as the [Apache 2.0
|
||||||
|
> License](https://www.apache.org/licenses/LICENSE-2.0). The goal of this
|
||||||
|
> revolution is to provide a clearer and robust API, add more features and
|
||||||
|
> new valuable properties of database.
|
||||||
|
|
||||||
|
*The Future will (be) [Positive](https://www.ptsecurity.com). Всё будет хорошо.*
|
||||||
|
|
||||||
|
[](https://travis-ci.org/leo-yuriev/libmdbx)
|
||||||
|
[](https://ci.appveyor.com/project/leo-yuriev/libmdbx/branch/master)
|
||||||
|
[](https://scan.coverity.com/projects/reopen-libmdbx)
|
||||||
|
|
||||||
|
## Table of Contents
|
||||||
|
- [Overview](#overview)
|
||||||
|
- [Comparison with other databases](#comparison-with-other-databases)
|
||||||
|
- [History & Acknowledgments](#history)
|
||||||
|
- [Description](#description)
|
||||||
|
- [Key features](#key-features)
|
||||||
|
- [Improvements over LMDB](#improvements-over-lmdb)
|
||||||
|
- [Gotchas](#gotchas)
|
||||||
|
- [Usage](#usage)
|
||||||
|
- [Building](#building)
|
||||||
|
- [Bindings](#bindings)
|
||||||
|
- [Performance comparison](#performance-comparison)
|
||||||
|
- [Integral performance](#integral-performance)
|
||||||
|
- [Read scalability](#read-scalability)
|
||||||
|
- [Sync-write mode](#sync-write-mode)
|
||||||
|
- [Lazy-write mode](#lazy-write-mode)
|
||||||
|
- [Async-write mode](#async-write-mode)
|
||||||
|
- [Cost comparison](#cost-comparison)
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
_libmdbx_ is revised and extended descendant of amazing [Lightning
|
||||||
|
Memory-Mapped
|
||||||
|
Database](https://en.wikipedia.org/wiki/Lightning_Memory-Mapped_Database).
|
||||||
|
_libmdbx_ inherits all features and characteristics from
|
||||||
|
[LMDB](https://en.wikipedia.org/wiki/Lightning_Memory-Mapped_Database),
|
||||||
|
but resolves some issues and adds several features.
|
||||||
|
|
||||||
|
- _libmdbx_ guarantee data integrity after crash unless this was explicitly
|
||||||
|
neglected in favour of write performance.
|
||||||
|
|
||||||
|
- _libmdbx_ allows multiple processes to read and update several key-value
|
||||||
|
tables concurrently, while being
|
||||||
|
[ACID](https://en.wikipedia.org/wiki/ACID)-compliant, with minimal
|
||||||
|
overhead and Olog(N) operation cost.
|
||||||
|
|
||||||
|
- _libmdbx_ enforce
|
||||||
|
[serializability](https://en.wikipedia.org/wiki/Serializability) for
|
||||||
|
writers by single
|
||||||
|
[mutex](https://en.wikipedia.org/wiki/Mutual_exclusion) and affords
|
||||||
|
[wait-free](https://en.wikipedia.org/wiki/Non-blocking_algorithm#Wait-freedom)
|
||||||
|
for parallel readers without atomic/interlocked operations, while
|
||||||
|
writing and reading transactions do not block each other.
|
||||||
|
|
||||||
|
- _libmdbx_ uses [B+Trees](https://en.wikipedia.org/wiki/B%2B_tree) and
|
||||||
|
[Memory-Mapping](https://en.wikipedia.org/wiki/Memory-mapped_file),
|
||||||
|
doesn't use [WAL](https://en.wikipedia.org/wiki/Write-ahead_logging)
|
||||||
|
which might be a caveat for some workloads.
|
||||||
|
|
||||||
|
- _libmdbx_ implements a simplified variant of the [Berkeley
|
||||||
|
DB](https://en.wikipedia.org/wiki/Berkeley_DB) and/or
|
||||||
|
[dbm](https://en.wikipedia.org/wiki/DBM_(computing)) API.
|
||||||
|
|
||||||
|
- _libmdbx_ supports Linux, Windows, MacOS, FreeBSD and other systems
|
||||||
|
compliant with POSIX.1-2008.
|
||||||
|
|
||||||
|
### Comparison with other databases
|
||||||
|
For now please refer to [chapter of "BoltDB comparison with other
|
||||||
|
databases"](https://github.com/coreos/bbolt#comparison-with-other-databases)
|
||||||
|
which is also (mostly) applicable to _libmdbx_.
|
||||||
|
|
||||||
|
### History
|
||||||
|
At first the development was carried out within the
|
||||||
|
[ReOpenLDAP](https://github.com/leo-yuriev/ReOpenLDAP) project. About a
|
||||||
|
year later _libmdbx_ was separated into standalone project, which was
|
||||||
|
[presented at Highload++ 2015
|
||||||
|
conference](http://www.highload.ru/2015/abstracts/1831.html).
|
||||||
|
|
||||||
|
Since 2017 _libmdbx_ is used in [Fast Positive Tables](https://github.com/leo-yuriev/libfpta),
|
||||||
|
and development is funded by [Positive Technologies](https://www.ptsecurity.com).
|
||||||
|
|
||||||
|
### Acknowledgments
|
||||||
|
Howard Chu <hyc@openldap.org> is the author of LMDB, from which
|
||||||
|
originated the MDBX in 2015.
|
||||||
|
|
||||||
|
Martin Hedenfalk <martin@bzero.se> is the author of `btree.c` code, which
|
||||||
|
was used for begin development of LMDB.
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
|
||||||
|
## Key features
|
||||||
|
|
||||||
|
1. Key-value pairs are stored in ordered map(s), keys are always sorted,
|
||||||
|
range lookups are supported.
|
||||||
|
|
||||||
|
2. Data is [memory-mapped](https://en.wikipedia.org/wiki/Memory-mapped_file)
|
||||||
|
into each worker DB process, and could be accessed zero-copy from transactions.
|
||||||
|
|
||||||
|
3. Transactions are
|
||||||
|
[ACID](https://en.wikipedia.org/wiki/ACID)-compliant, through to
|
||||||
|
[MVCC](https://en.wikipedia.org/wiki/Multiversion_concurrency_control)
|
||||||
|
and [CoW](https://en.wikipedia.org/wiki/Copy-on-write). Writes are
|
||||||
|
strongly serialized and aren't blocked by reads, transactions can't
|
||||||
|
conflict with each other. Reads are guaranteed to get only commited data
|
||||||
|
([relaxing serializability](https://en.wikipedia.org/wiki/Serializability#Relaxing_serializability)).
|
||||||
|
|
||||||
|
4. Read transactions are
|
||||||
|
[non-blocking](https://en.wikipedia.org/wiki/Non-blocking_algorithm),
|
||||||
|
don't use [atomic operations](https://en.wikipedia.org/wiki/Linearizability#High-level_atomic_operations).
|
||||||
|
Readers don't block each other and aren't blocked by writers. Read
|
||||||
|
performance scales linearly with CPU core count.
|
||||||
|
> Nonetheless, "connect to DB" (starting the first read transaction in a thread) and
|
||||||
|
> "disconnect from DB" (closing DB or thread termination) requires a lock
|
||||||
|
> acquisition to register/unregister at the "readers table".
|
||||||
|
|
||||||
|
5. Keys with multiple values are stored efficiently without key
|
||||||
|
duplication, sorted by value, including integers (valuable for
|
||||||
|
secondary indexes).
|
||||||
|
|
||||||
|
6. Efficient operation on short fixed length keys,
|
||||||
|
including 32/64-bit integer types.
|
||||||
|
|
||||||
|
7. [WAF](https://en.wikipedia.org/wiki/Write_amplification) (Write
|
||||||
|
Amplification Factor) и RAF (Read Amplification Factor) are Olog(N).
|
||||||
|
|
||||||
|
8. No [WAL](https://en.wikipedia.org/wiki/Write-ahead_logging) and
|
||||||
|
transaction journal. In case of a crash no recovery needed. No need for
|
||||||
|
regular maintenance. Backups can be made on the fly on working DB
|
||||||
|
without freezing writers.
|
||||||
|
|
||||||
|
9. No additional memory management, all done by basic OS services.
|
||||||
|
|
||||||
|
|
||||||
|
## Improvements over LMDB
|
||||||
|
|
||||||
|
_libmdbx_ is superior to _legendary [LMDB](https://symas.com/lmdb/)_ in
|
||||||
|
terms of features and reliability, not inferior in performance. In
|
||||||
|
comparison to LMDB, _libmdbx_ make things "just work" perfectly and
|
||||||
|
out-of-the-box, not silently and catastrophically break down. The list
|
||||||
|
below is pruned down to the improvements most notable and obvious from
|
||||||
|
the user's point of view.
|
||||||
|
|
||||||
|
1. Automatic on-the-fly database size control by preset parameters, both
|
||||||
|
reduction and increment.
|
||||||
|
> _libmdbx_ manage the database size according to parameters specified
|
||||||
|
> by `mdbx_env_set_geometry()` function,
|
||||||
|
> ones include the growth step and the truncation threshold.
|
||||||
|
|
||||||
|
2. Automatic continuous zero-overhead database compactification.
|
||||||
|
> _libmdbx_ logically move as possible a freed pages
|
||||||
|
> at end of allocation area into unallocated space,
|
||||||
|
> and then release such space if a lot of.
|
||||||
|
|
||||||
|
3. LIFO policy for recycling a Garbage Collection items. On systems with a disk
|
||||||
|
write-back cache, this can significantly increase write performance, up to
|
||||||
|
several times in a best case scenario.
|
||||||
|
> LIFO means that for reuse pages will be taken which became unused the lastest.
|
||||||
|
> Therefore the loop of database pages circulation becomes as short as possible.
|
||||||
|
> In other words, the number of pages, that are overwritten in memory
|
||||||
|
> and on disk during a series of write transactions, will be as small as possible.
|
||||||
|
> Thus creates ideal conditions for the efficient operation of the disk write-back cache.
|
||||||
|
|
||||||
|
4. Fast estimation of range query result volume, i.e. how many items can
|
||||||
|
be found between a `KEY1` and a `KEY2`. This is prerequisite for build
|
||||||
|
and/or optimize query execution plans.
|
||||||
|
> _libmdbx_ performs a rough estimate based only on b-tree pages that
|
||||||
|
> are common for the both stacks of cursors that were set to corresponing
|
||||||
|
> keys.
|
||||||
|
|
||||||
|
5. `mdbx_chk` tool for database integrity check.
|
||||||
|
|
||||||
|
6. Guarantee of database integrity even in asynchronous unordered write-to-disk mode.
|
||||||
|
> _libmdbx_ propose additional trade-off by implementing append-like manner for updates
|
||||||
|
> in `NOSYNC` and `MAPASYNC` modes, that avoid database corruption after a system crash
|
||||||
|
> contrary to LMDB. Nevertheless, the `MDBX_UTTERLY_NOSYNC` mode available to match LMDB behaviour,
|
||||||
|
> and for a special use-cases.
|
||||||
|
|
||||||
|
7. Automated steady flush to disk upon volume of changes and/or by
|
||||||
|
timeout via cheap polling.
|
||||||
|
|
||||||
|
8. Sequence generation and three cheap persistent 64-bit markers with ACID.
|
||||||
|
|
||||||
|
9. Support for keys and values of zero length, including multi-values
|
||||||
|
(aka sorted duplicates).
|
||||||
|
|
||||||
|
10. The handler of lack-of-space condition with a callback,
|
||||||
|
that allow you to control and resolve such situations.
|
||||||
|
|
||||||
|
11. Support for opening a database in the exclusive mode, including on a network share.
|
||||||
|
|
||||||
|
12. Extended transaction info, including dirty and leftover space info
|
||||||
|
for a write transaction, reading lag and hold over space for read
|
||||||
|
transactions.
|
||||||
|
|
||||||
|
13. Extended whole-database info (aka environment) and reader enumeration.
|
||||||
|
|
||||||
|
14. Extended update or delete, _at once_ with getting previous value
|
||||||
|
and addressing the particular item from multi-value with the same key.
|
||||||
|
|
||||||
|
15. Support for explicitly updating the existing record, not insertion a new one.
|
||||||
|
|
||||||
|
16. All cursors are uniformly, can be reused and should be closed explicitly,
|
||||||
|
regardless ones were opened within write or read transaction.
|
||||||
|
|
||||||
|
17. Correct update of current record with `MDBX_CURRENT` flag when size
|
||||||
|
of key or data was changed, including sorted duplicated.
|
||||||
|
|
||||||
|
18. Opening database handles is spared from race conditions and
|
||||||
|
pre-opening is not needed.
|
||||||
|
|
||||||
|
19. Ability to determine whether the particular data is on a dirty page
|
||||||
|
or not, that allows to avoid copy-out before updates.
|
||||||
|
|
||||||
|
20. Ability to determine whether the cursor is pointed to a key-value
|
||||||
|
pair, to the first, to the last, or not set to anything.
|
||||||
|
|
||||||
|
21. Returning `MDBX_EMULTIVAL` error in case of ambiguous update or delete.
|
||||||
|
|
||||||
|
22. On **MacOS** the `fcntl(F_FULLFSYNC)` syscall is used _by
|
||||||
|
default_ to synchronize data with the disk, as this is [the only way to
|
||||||
|
guarantee data
|
||||||
|
durability](https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/fsync.2.html)
|
||||||
|
in case of power failure. Unfortunately, in scenarios with high write
|
||||||
|
intensity, the use of `F_FULLFSYNC` significant degrades performance
|
||||||
|
compared to LMDB, where the `fsync()` syscall is used. Therefore,
|
||||||
|
_libmdbx_ allows you to override this behavior by defining the
|
||||||
|
`MDBX_OSX_SPEED_INSTEADOF_DURABILITY=1` option while build the library.
|
||||||
|
|
||||||
|
23. On **Windows** the `LockFileEx()` syscall is used for locking, since
|
||||||
|
it allows place the database on network drives, and provides protection
|
||||||
|
against incompetent user actions (aka
|
||||||
|
[poka-yoke](https://en.wikipedia.org/wiki/Poka-yoke)). Therefore
|
||||||
|
_libmdbx_ may be a little lag in performance tests from LMDB where a
|
||||||
|
named mutexes are used.
|
||||||
|
|
||||||
|
|
||||||
|
## Gotchas
|
||||||
|
|
||||||
|
1. There cannot be more than one writer at a time.
|
||||||
|
> On the other hand, this allows serialize an updates and eliminate any
|
||||||
|
> possibility of conflicts, deadlocks or logical errors.
|
||||||
|
|
||||||
|
2. No [WAL](https://en.wikipedia.org/wiki/Write-ahead_logging) means
|
||||||
|
relatively big [WAF](https://en.wikipedia.org/wiki/Write_amplification)
|
||||||
|
(Write Amplification Factor). Because of this syncing data to disk might
|
||||||
|
be quite resource intensive and be main performance bottleneck during
|
||||||
|
intensive write workload.
|
||||||
|
> As compromise _libmdbx_ allows several modes of lazy and/or periodic
|
||||||
|
> syncing, including `MAPASYNC` mode, which modificate data in memory and
|
||||||
|
> asynchronously syncs data to disk, moment to sync is picked by OS.
|
||||||
|
>
|
||||||
|
> Although this should be used with care, synchronous transactions in a DB
|
||||||
|
> with transaction journal will require 2 IOPS minimum (probably 3-4 in
|
||||||
|
> practice) because of filesystem overhead, overhead depends on
|
||||||
|
> filesystem, not on record count or record size. In _libmdbx_ IOPS count
|
||||||
|
> will grow logarithmically depending on record count in DB (height of B+
|
||||||
|
> tree) and will require at least 2 IOPS per transaction too.
|
||||||
|
|
||||||
|
3. [CoW](https://en.wikipedia.org/wiki/Copy-on-write) for
|
||||||
|
[MVCC](https://en.wikipedia.org/wiki/Multiversion_concurrency_control)
|
||||||
|
is done on memory page level with
|
||||||
|
[B+trees](https://ru.wikipedia.org/wiki/B-%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE).
|
||||||
|
Therefore altering data requires to copy about Olog(N) memory pages,
|
||||||
|
which uses [memory bandwidth](https://en.wikipedia.org/wiki/Memory_bandwidth) and is main
|
||||||
|
performance bottleneck in `MDBX_MAPASYNC` mode.
|
||||||
|
> This is unavoidable, but isn't that bad. Syncing data to disk requires
|
||||||
|
> much more similar operations which will be done by OS, therefore this is
|
||||||
|
> noticeable only if data sync to persistent storage is fully disabled.
|
||||||
|
> _libmdbx_ allows to safely save data to persistent storage with minimal
|
||||||
|
> performance overhead. If there is no need to save data to persistent
|
||||||
|
> storage then it's much more preferable to use `std::map`.
|
||||||
|
|
||||||
|
4. Massive altering of data during a parallel long read operation will
|
||||||
|
increase the process work set, may exhaust entire free database space and
|
||||||
|
result in subsequent write performance degradation.
|
||||||
|
> _libmdbx_ mostly solve this issue by lack-of-space callback and `MDBX_LIFORECLAIM` mode.
|
||||||
|
> See [`mdbx.h`](mdbx.h) with API description for details.
|
||||||
|
> The "next" version of libmdbx (MithrilDB) will completely solve this.
|
||||||
|
|
||||||
|
5. There are no built-in checksums or digests to verify database integrity.
|
||||||
|
> The "next" version of _libmdbx_ (MithrilDB) will solve this issue employing [Merkle Tree](https://en.wikipedia.org/wiki/Merkle_tree).
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
## Source code embedding
|
||||||
|
|
||||||
|
_libmdbx_ provides two official ways for integration in source code form:
|
||||||
|
|
||||||
|
1. Using the amalgamated source code.
|
||||||
|
> The amalgamated source code includes all files requires to build and
|
||||||
|
> use _libmdbx_, but not for testing _libmdbx_ itself.
|
||||||
|
|
||||||
|
2. Adding the complete original source code as a `git submodule`.
|
||||||
|
> This allows you to build as _libmdbx_ and testing tool.
|
||||||
|
> On the other hand, this way requires you to pull git tags, and use C++11 compiler for test tool.
|
||||||
|
|
||||||
|
**_Please, avoid using any other techniques._** Otherwise, at least
|
||||||
|
don't ask for support and don't name such chimeras `libmdbx`.
|
||||||
|
|
||||||
|
The amalgamated source code could be created from original clone of git
|
||||||
|
repository on Linux by executing `make dist`. As a result, the desired
|
||||||
|
set of files will be formed in the `dist` subdirectory.
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
Both amalgamated and original source code provides build through the use
|
||||||
|
[CMake](https://cmake.org/) or [GNU
|
||||||
|
Make](https://www.gnu.org/software/make/) with
|
||||||
|
[bash](https://en.wikipedia.org/wiki/Bash_(Unix_shell)). All build ways
|
||||||
|
are completely traditional and have minimal prerequirements like
|
||||||
|
`build-essential`, i.e. the non-obsolete C/C++ compiler and a
|
||||||
|
[SDK](https://en.wikipedia.org/wiki/Software_development_kit) for the
|
||||||
|
target platform. Obviously you need building tools itself, i.e. `git`,
|
||||||
|
`cmake` or GNU `make` with `bash`.
|
||||||
|
|
||||||
|
So just use CMake or GNU Make in your habitual manner and feel free to
|
||||||
|
fill an issue or make pull request in the case something will be
|
||||||
|
unexpected or broken down.
|
||||||
|
|
||||||
|
#### DSO/DLL unloading and destructors of Thread-Local-Storage objects
|
||||||
|
When building _libmdbx_ as a shared library or use static _libmdbx_ as a
|
||||||
|
part of another dynamic library, it is advisable to make sure that your
|
||||||
|
system ensures the correctness of the call destructors of
|
||||||
|
Thread-Local-Storage objects when unloading dynamic libraries.
|
||||||
|
|
||||||
|
If this is not the case, then unloading a dynamic-link library with
|
||||||
|
_libmdbx_ code inside, can result in either a resource leak or a crash
|
||||||
|
due to calling destructors from an already unloaded DSO/DLL object. The
|
||||||
|
problem can only manifest in a multithreaded application, which makes
|
||||||
|
the unloading of shared dynamic libraries with _libmdbx_ code inside,
|
||||||
|
after using _libmdbx_. It is known that TLS-destructors are properly
|
||||||
|
maintained in the following cases:
|
||||||
|
|
||||||
|
- On all modern versions of Windows (Windows 7 and later).
|
||||||
|
|
||||||
|
- On systems with the
|
||||||
|
[`__cxa_thread_atexit_impl()`](https://sourceware.org/glibc/wiki/Destructor%20support%20for%20thread_local%20variables)
|
||||||
|
function in the standard C library, including systems with GNU libc
|
||||||
|
version 2.18 and later.
|
||||||
|
|
||||||
|
- On systems with libpthread/ntpl from GNU libc with bug fixes
|
||||||
|
[#21031](https://sourceware.org/bugzilla/show_bug.cgi?id=21031) and
|
||||||
|
[#21032](https://sourceware.org/bugzilla/show_bug.cgi?id=21032), or
|
||||||
|
where there are no similar bugs in the pthreads implementation.
|
||||||
|
|
||||||
|
### Linux and other platforms with GNU Make
|
||||||
|
To build the library it is enough to execute `make all` in the directory
|
||||||
|
of source code, and `make check` for execute the basic tests.
|
||||||
|
|
||||||
|
If the `make` installed on the system is not GNU Make, there will be a
|
||||||
|
lot of errors from make when trying to build. In this case, perhaps you
|
||||||
|
should use `gmake` instead of `make`, or even `gnu-make`, etc.
|
||||||
|
|
||||||
|
### FreeBSD and related platforms
|
||||||
|
As a rule, in such systems, the default is to use Berkeley Make. And GNU
|
||||||
|
Make is called by the gmake command or may be missing. In addition,
|
||||||
|
[bash](https://en.wikipedia.org/wiki/Bash_(Unix_shell)) may be absent.
|
||||||
|
|
||||||
|
You need to install the required components: GNU Make, bash, C and C++
|
||||||
|
compilers compatible with GCC or CLANG. After that, to build the
|
||||||
|
library, it is enough execute `gmake all` (or `make all`) in the
|
||||||
|
directory with source code, and `gmake check` (or `make check`) to run
|
||||||
|
the basic tests.
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
For build _libmdbx_ on Windows the _original_ CMake and [Microsoft Visual
|
||||||
|
Studio](https://en.wikipedia.org/wiki/Microsoft_Visual_Studio) are
|
||||||
|
recommended.
|
||||||
|
|
||||||
|
Building by MinGW, MSYS or Cygwin is potentially possible. However,
|
||||||
|
these scripts are not tested and will probably require you to modify the
|
||||||
|
CMakeLists.txt or Makefile respectively.
|
||||||
|
|
||||||
|
It should be noted that in _libmdbx_ was efforts to resolve
|
||||||
|
runtime dependencies from CRT and other libraries Visual Studio.
|
||||||
|
For this is enough define the `MDBX_AVOID_CRT` during build.
|
||||||
|
|
||||||
|
An example of running a basic test script can be found in the
|
||||||
|
[CI-script](appveyor.yml) for [AppVeyor](https://www.appveyor.com/). To
|
||||||
|
run the [long stochastic test scenario](test/long_stochastic.sh),
|
||||||
|
[bash](https://en.wikipedia.org/wiki/Bash_(Unix_shell)) is required, and
|
||||||
|
the such testing is recommended with place the test data on the
|
||||||
|
[RAM-disk](https://en.wikipedia.org/wiki/RAM_drive).
|
||||||
|
|
||||||
|
### MacOS
|
||||||
|
Current [native build tools](https://en.wikipedia.org/wiki/Xcode) for
|
||||||
|
MacOS include GNU Make, CLANG and an outdated version of bash.
|
||||||
|
Therefore, to build the library, it is enough to run `make all` in the
|
||||||
|
directory with source code, and run `make check` to execute the base
|
||||||
|
tests. If something goes wrong, it is recommended to install
|
||||||
|
[Homebrew](https://brew.sh/) and try again.
|
||||||
|
|
||||||
|
To run the [long stochastic test scenario](test/long_stochastic.sh), you
|
||||||
|
will need to install the current (not outdated) version of
|
||||||
|
[bash](https://en.wikipedia.org/wiki/Bash_(Unix_shell)). To do this, we
|
||||||
|
recommend that you install [Homebrew](https://brew.sh/) and then execute
|
||||||
|
`brew install bash`.
|
||||||
|
|
||||||
|
## Bindings
|
||||||
|
|
||||||
|
| Runtime | GitHub | Author |
|
||||||
|
| -------- | ------ | ------ |
|
||||||
|
| Java | [mdbxjni](https://github.com/castortech/mdbxjni) | [Castor Technologies](https://castortech.com/) |
|
||||||
|
| .NET | [mdbx.NET](https://github.com/wangjia184/mdbx.NET) | [Jerry Wang](https://github.com/wangjia184) |
|
||||||
|
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Performance comparison
|
||||||
|
======================
|
||||||
|
|
||||||
|
All benchmarks were done by [IOArena](https://github.com/pmwkaa/ioarena)
|
||||||
|
and multiple [scripts](https://github.com/pmwkaa/ioarena/tree/HL%2B%2B2015)
|
||||||
|
runs on Lenovo Carbon-2 laptop, i7-4600U 2.1 GHz, 8 Gb RAM,
|
||||||
|
SSD SAMSUNG MZNTD512HAGL-000L1 (DXT23L0Q) 512 Gb.
|
||||||
|
|
||||||
|
## Integral performance
|
||||||
|
|
||||||
|
Here showed sum of performance metrics in 3 benchmarks:
|
||||||
|
|
||||||
|
- Read/Search on 4 CPU cores machine;
|
||||||
|
|
||||||
|
- Transactions with [CRUD](https://en.wikipedia.org/wiki/CRUD)
|
||||||
|
operations in sync-write mode (fdatasync is called after each
|
||||||
|
transaction);
|
||||||
|
|
||||||
|
- Transactions with [CRUD](https://en.wikipedia.org/wiki/CRUD)
|
||||||
|
operations in lazy-write mode (moment to sync data to persistent storage
|
||||||
|
is decided by OS).
|
||||||
|
|
||||||
|
*Reasons why asynchronous mode isn't benchmarked here:*
|
||||||
|
|
||||||
|
1. It doesn't make sense as it has to be done with DB engines, oriented
|
||||||
|
for keeping data in memory e.g. [Tarantool](https://tarantool.io/),
|
||||||
|
[Redis](https://redis.io/)), etc.
|
||||||
|
|
||||||
|
2. Performance gap is too high to compare in any meaningful way.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## Read Scalability
|
||||||
|
|
||||||
|
Summary performance with concurrent read/search queries in 1-2-4-8
|
||||||
|
threads on 4 CPU cores machine.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## Sync-write mode
|
||||||
|
|
||||||
|
- Linear scale on left and dark rectangles mean arithmetic mean
|
||||||
|
transactions per second;
|
||||||
|
|
||||||
|
- Logarithmic scale on right is in seconds and yellow intervals mean
|
||||||
|
execution time of transactions. Each interval shows minimal and maximum
|
||||||
|
execution time, cross marks standard deviation.
|
||||||
|
|
||||||
|
**10,000 transactions in sync-write mode**. In case of a crash all data
|
||||||
|
is consistent and state is right after last successful transaction.
|
||||||
|
[fdatasync](https://linux.die.net/man/2/fdatasync) syscall is used after
|
||||||
|
each write transaction in this mode.
|
||||||
|
|
||||||
|
In the benchmark each transaction contains combined CRUD operations (2
|
||||||
|
inserts, 1 read, 1 update, 1 delete). Benchmark starts on empty database
|
||||||
|
and after full run the database contains 10,000 small key-value records.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## Lazy-write mode
|
||||||
|
|
||||||
|
- Linear scale on left and dark rectangles mean arithmetic mean of
|
||||||
|
thousands transactions per second;
|
||||||
|
|
||||||
|
- Logarithmic scale on right in seconds and yellow intervals mean
|
||||||
|
execution time of transactions. Each interval shows minimal and maximum
|
||||||
|
execution time, cross marks standard deviation.
|
||||||
|
|
||||||
|
**100,000 transactions in lazy-write mode**. In case of a crash all data
|
||||||
|
is consistent and state is right after one of last transactions, but
|
||||||
|
transactions after it will be lost. Other DB engines use
|
||||||
|
[WAL](https://en.wikipedia.org/wiki/Write-ahead_logging) or transaction
|
||||||
|
journal for that, which in turn depends on order of operations in
|
||||||
|
journaled filesystem. _libmdbx_ doesn't use WAL and hands I/O operations
|
||||||
|
to filesystem and OS kernel (mmap).
|
||||||
|
|
||||||
|
In the benchmark each transaction contains combined CRUD operations (2
|
||||||
|
inserts, 1 read, 1 update, 1 delete). Benchmark starts on empty database
|
||||||
|
and after full run the database contains 100,000 small key-value
|
||||||
|
records.
|
||||||
|
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## Async-write mode
|
||||||
|
|
||||||
|
- Linear scale on left and dark rectangles mean arithmetic mean of
|
||||||
|
thousands transactions per second;
|
||||||
|
|
||||||
|
- Logarithmic scale on right in seconds and yellow intervals mean
|
||||||
|
execution time of transactions. Each interval shows minimal and maximum
|
||||||
|
execution time, cross marks standard deviation.
|
||||||
|
|
||||||
|
**1,000,000 transactions in async-write mode**. In case of a crash all
|
||||||
|
data will be consistent and state will be right after one of last
|
||||||
|
transactions, but lost transaction count is much higher than in
|
||||||
|
lazy-write mode. All DB engines in this mode do as little writes as
|
||||||
|
possible on persistent storage. _libmdbx_ uses
|
||||||
|
[msync(MS_ASYNC)](https://linux.die.net/man/2/msync) in this mode.
|
||||||
|
|
||||||
|
In the benchmark each transaction contains combined CRUD operations (2
|
||||||
|
inserts, 1 read, 1 update, 1 delete). Benchmark starts on empty database
|
||||||
|
and after full run the database contains 10,000 small key-value records.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## Cost comparison
|
||||||
|
|
||||||
|
Summary of used resources during lazy-write mode benchmarks:
|
||||||
|
|
||||||
|
- Read and write IOPS;
|
||||||
|
|
||||||
|
- Sum of user CPU time and sys CPU time;
|
||||||
|
|
||||||
|
- Used space on persistent storage after the test and closed DB, but not
|
||||||
|
waiting for the end of all internal housekeeping operations (LSM
|
||||||
|
compactification, etc).
|
||||||
|
|
||||||
|
_ForestDB_ is excluded because benchmark showed it's resource
|
||||||
|
consumption for each resource (CPU, IOPS) much higher than other engines
|
||||||
|
which prevents to meaningfully compare it with them.
|
||||||
|
|
||||||
|
All benchmark data is gathered by
|
||||||
|
[getrusage()](http://man7.org/linux/man-pages/man2/getrusage.2.html)
|
||||||
|
syscall and by scanning data directory.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
```
|
||||||
|
$ objdump -f -h -j .text libmdbx.so
|
||||||
|
|
||||||
|
libmdbx.so: file format elf64-x86-64
|
||||||
|
architecture: i386:x86-64, flags 0x00000150:
|
||||||
|
HAS_SYMS, DYNAMIC, D_PAGED
|
||||||
|
start address 0x0000000000003710
|
||||||
|
|
||||||
|
Sections:
|
||||||
|
Idx Name Size VMA LMA File off Algn
|
||||||
|
11 .text 00015eff 0000000000003710 0000000000003710 00003710 2**4
|
||||||
|
CONTENTS, ALLOC, LOAD, READONLY, CODE
|
||||||
|
```
|
||||||
99
contrib/db/libmdbx/appveyor.yml
Normal file
99
contrib/db/libmdbx/appveyor.yml
Normal file
|
|
@ -0,0 +1,99 @@
|
||||||
|
version: 0.3.2.{build}
|
||||||
|
|
||||||
|
environment:
|
||||||
|
matrix:
|
||||||
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
|
||||||
|
CMAKE_GENERATOR: Visual Studio 16 2019
|
||||||
|
TOOLSET: 142
|
||||||
|
MDBX_BUILD_SHARED_LIBRARY: OFF
|
||||||
|
MDBX_AVOID_CRT: OFF
|
||||||
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
|
||||||
|
CMAKE_GENERATOR: Visual Studio 16 2019
|
||||||
|
TOOLSET: 142
|
||||||
|
MDBX_BUILD_SHARED_LIBRARY: ON
|
||||||
|
MDBX_AVOID_CRT: ON
|
||||||
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
|
||||||
|
CMAKE_GENERATOR: Visual Studio 16 2019
|
||||||
|
TOOLSET: 142
|
||||||
|
MDBX_BUILD_SHARED_LIBRARY: OFF
|
||||||
|
MDBX_AVOID_CRT: ON
|
||||||
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
|
||||||
|
CMAKE_GENERATOR: Visual Studio 16 2019
|
||||||
|
TOOLSET: 142
|
||||||
|
MDBX_BUILD_SHARED_LIBRARY: ON
|
||||||
|
MDBX_AVOID_CRT: OFF
|
||||||
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||||
|
CMAKE_GENERATOR: Visual Studio 15 2017
|
||||||
|
TOOLSET: 141
|
||||||
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||||
|
CMAKE_GENERATOR: Visual Studio 14 2015
|
||||||
|
TOOLSET: 140
|
||||||
|
|
||||||
|
branches:
|
||||||
|
except:
|
||||||
|
- coverity_scan
|
||||||
|
|
||||||
|
configuration:
|
||||||
|
- Debug
|
||||||
|
- Release
|
||||||
|
|
||||||
|
platform:
|
||||||
|
- Win32
|
||||||
|
- x64
|
||||||
|
|
||||||
|
before_build:
|
||||||
|
- git clean -x -f -d
|
||||||
|
- git submodule sync
|
||||||
|
- git fetch --tags --prune
|
||||||
|
- git submodule update --init --recursive
|
||||||
|
- git submodule foreach --recursive git fetch --tags --prune
|
||||||
|
- cmake --version
|
||||||
|
|
||||||
|
build_script:
|
||||||
|
- ps: |
|
||||||
|
Write-Output "*******************************************************************************"
|
||||||
|
Write-Output "Configuration: $env:CONFIGURATION"
|
||||||
|
Write-Output "Platform: $env:PLATFORM"
|
||||||
|
Write-Output "Toolchain: $env:CMAKE_GENERATOR v$env:TOOLSET"
|
||||||
|
Write-Output "Options: MDBX_AVOID_CRT=$env:MDBX_AVOID_CRT MDBX_BUILD_SHARED_LIBRARY=$env:MDBX_BUILD_SHARED_LIBRARY"
|
||||||
|
Write-Output "*******************************************************************************"
|
||||||
|
|
||||||
|
md _build -Force | Out-Null
|
||||||
|
cd _build
|
||||||
|
|
||||||
|
$generator = $env:CMAKE_GENERATOR
|
||||||
|
if ($env:TOOLSET -lt 142) {
|
||||||
|
if ($env:PLATFORM -eq "x64") {
|
||||||
|
$generator = "$generator Win64"
|
||||||
|
}
|
||||||
|
& cmake -G "$generator" -D CMAKE_CONFIGURATION_TYPES="Debug;Release" -D MDBX_AVOID_CRT:BOOL=$env:MDBX_AVOID_CRT -D MDBX_BUILD_SHARED_LIBRARY:BOOL=$env:MDBX_BUILD_SHARED_LIBRARY ..
|
||||||
|
} else {
|
||||||
|
& cmake -G "$generator" -A $env:PLATFORM -D CMAKE_CONFIGURATION_TYPES="Debug;Release" -DMDBX_AVOID_CRT:BOOL=$env:MDBX_AVOID_CRT -D MDBX_BUILD_SHARED_LIBRARY:BOOL=$env:MDBX_BUILD_SHARED_LIBRARY ..
|
||||||
|
}
|
||||||
|
if ($LastExitCode -ne 0) {
|
||||||
|
throw "Exec: $ErrorMessage"
|
||||||
|
}
|
||||||
|
Write-Output "*******************************************************************************"
|
||||||
|
|
||||||
|
& cmake --build . --config $env:CONFIGURATION
|
||||||
|
if ($LastExitCode -ne 0) {
|
||||||
|
throw "Exec: $ErrorMessage"
|
||||||
|
}
|
||||||
|
Write-Output "*******************************************************************************"
|
||||||
|
|
||||||
|
test_script:
|
||||||
|
- ps: |
|
||||||
|
if (($env:PLATFORM -ne "ARM") -and ($env:PLATFORM -ne "ARM64")) {
|
||||||
|
& ./$env:CONFIGURATION/mdbx_test.exe --progress --console=no --pathname=test.db --dont-cleanup-after basic > test.log
|
||||||
|
Get-Content test.log | Select-Object -last 42
|
||||||
|
if ($LastExitCode -ne 0) {
|
||||||
|
throw "Exec: $ErrorMessage"
|
||||||
|
} else {
|
||||||
|
& ./$env:CONFIGURATION/mdbx_chk.exe -nvv test.db | Tee-Object -file chk.log | Select-Object -last 42
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
on_failure:
|
||||||
|
- ps: Push-AppveyorArtifact \projects\libmdbx\_build\test.log
|
||||||
|
- ps: Push-AppveyorArtifact \projects\libmdbx\_build\test.db
|
||||||
|
- ps: Push-AppveyorArtifact \projects\libmdbx\_build\chk.log
|
||||||
666
contrib/db/libmdbx/cmake/compiler.cmake
Normal file
666
contrib/db/libmdbx/cmake/compiler.cmake
Normal file
|
|
@ -0,0 +1,666 @@
|
||||||
|
## Copyright (c) 2012-2019 Leonid Yuriev <leo@yuriev.ru>.
|
||||||
|
##
|
||||||
|
## Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
## you may not use this file except in compliance with the License.
|
||||||
|
## You may obtain a copy of the License at
|
||||||
|
##
|
||||||
|
## http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
##
|
||||||
|
## Unless required by applicable law or agreed to in writing, software
|
||||||
|
## distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
## See the License for the specific language governing permissions and
|
||||||
|
## limitations under the License.
|
||||||
|
##
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.8.2)
|
||||||
|
cmake_policy(PUSH)
|
||||||
|
cmake_policy(VERSION 3.8.2)
|
||||||
|
|
||||||
|
if (CMAKE_VERSION MATCHES ".*MSVC.*")
|
||||||
|
message(FATAL_ERROR "CMake from MSVC kit is unfit! "
|
||||||
|
"Please use the original CMake from https://cmake.org/download/")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT (CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED))
|
||||||
|
message(FATAL_ERROR "This module required C or C++ to be enabled")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(CMakeDependentOption)
|
||||||
|
|
||||||
|
if(CMAKE_CXX_COMPILER_LOADED)
|
||||||
|
include(CheckCXXSourceRuns)
|
||||||
|
include(CheckCXXSourceCompiles)
|
||||||
|
include(CheckCXXCompilerFlag)
|
||||||
|
endif()
|
||||||
|
if(CMAKE_C_COMPILER_LOADED)
|
||||||
|
include(CheckCSourceRuns)
|
||||||
|
include(CheckCSourceCompiles)
|
||||||
|
include(CheckCCompilerFlag)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Check if the same compile family is used for both C and CXX
|
||||||
|
if(CMAKE_C_COMPILER_LOADED AND CMAKE_CXX_COMPILER_LOADED AND
|
||||||
|
NOT (CMAKE_C_COMPILER_ID STREQUAL CMAKE_CXX_COMPILER_ID))
|
||||||
|
message(WARNING "CMAKE_C_COMPILER_ID (${CMAKE_C_COMPILER_ID}) is different "
|
||||||
|
"from CMAKE_CXX_COMPILER_ID (${CMAKE_CXX_COMPILER_ID}). "
|
||||||
|
"The final binary may be unusable.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_CXX_COMPILER_LOADED)
|
||||||
|
set(CMAKE_PRIMARY_LANG "CXX")
|
||||||
|
else()
|
||||||
|
set(CMAKE_PRIMARY_LANG "C")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
macro(check_compiler_flag flag variable)
|
||||||
|
if(CMAKE_CXX_COMPILER_LOADED)
|
||||||
|
check_cxx_compiler_flag(${flag} ${variable})
|
||||||
|
else()
|
||||||
|
check_c_compiler_flag(${flag} ${variable})
|
||||||
|
endif()
|
||||||
|
endmacro(check_compiler_flag)
|
||||||
|
|
||||||
|
# We support building with Clang and gcc. First check
|
||||||
|
# what we're using for build.
|
||||||
|
if(CMAKE_C_COMPILER_LOADED AND CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
||||||
|
set(CMAKE_COMPILER_IS_CLANG ON)
|
||||||
|
set(CMAKE_COMPILER_IS_GNUCC OFF)
|
||||||
|
endif()
|
||||||
|
if(CMAKE_CXX_COMPILER_LOADED AND CMAKE_CXx_COMPILER_ID STREQUAL "Clang")
|
||||||
|
set(CMAKE_COMPILER_IS_CLANG ON)
|
||||||
|
set(CMAKE_COMPILER_IS_GNUCXX OFF)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Hard coding the compiler version is ugly from cmake POV, but
|
||||||
|
# at least gives user a friendly error message. The most critical
|
||||||
|
# demand for C++ compiler is support of C++11 lambdas, added
|
||||||
|
# only in version 4.5 https://gcc.gnu.org/projects/cxx0x.html
|
||||||
|
if(CMAKE_COMPILER_IS_GNUCC)
|
||||||
|
if(CMAKE_C_COMPILER_VERSION VERSION_LESS 4.5)
|
||||||
|
message(FATAL_ERROR "
|
||||||
|
Your GCC version is ${CMAKE_C_COMPILER_VERSION}, please update")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
if(CMAKE_COMPILER_IS_GNUCXX)
|
||||||
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.5)
|
||||||
|
message(FATAL_ERROR "
|
||||||
|
Your G++ version is ${CMAKE_CXX_COMPILER_VERSION}, please update")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_C_COMPILER_LOADED)
|
||||||
|
# Check for Elbrus lcc
|
||||||
|
execute_process(COMMAND ${CMAKE_C_COMPILER} --version
|
||||||
|
OUTPUT_VARIABLE tmp_lcc_probe_version
|
||||||
|
RESULT_VARIABLE tmp_lcc_probe_result ERROR_QUIET)
|
||||||
|
if(tmp_lcc_probe_result EQUAL 0)
|
||||||
|
string(FIND "${tmp_lcc_probe_version}" "lcc:" tmp_lcc_marker)
|
||||||
|
string(FIND "${tmp_lcc_probe_version}" ":e2k-" tmp_e2k_marker)
|
||||||
|
if(tmp_lcc_marker GREATER -1 AND tmp_e2k_marker GREATER tmp_lcc_marker)
|
||||||
|
execute_process(COMMAND ${CMAKE_C_COMPILER} -print-version
|
||||||
|
OUTPUT_VARIABLE CMAKE_C_COMPILER_VERSION
|
||||||
|
RESULT_VARIABLE tmp_lcc_probe_result)
|
||||||
|
set(CMAKE_COMPILER_IS_ELBRUSC ON)
|
||||||
|
set(CMAKE_C_COMPILER_ID "Elbrus")
|
||||||
|
else()
|
||||||
|
set(CMAKE_COMPILER_IS_ELBRUSC OFF)
|
||||||
|
endif()
|
||||||
|
unset(tmp_lcc_marker)
|
||||||
|
unset(tmp_e2k_marker)
|
||||||
|
endif()
|
||||||
|
unset(tmp_lcc_probe_version)
|
||||||
|
unset(tmp_lcc_probe_result)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_CXX_COMPILER_LOADED)
|
||||||
|
# Check for Elbrus l++
|
||||||
|
execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version
|
||||||
|
OUTPUT_VARIABLE tmp_lxx_probe_version
|
||||||
|
RESULT_VARIABLE tmp_lxx_probe_result ERROR_QUIET)
|
||||||
|
if(tmp_lxx_probe_result EQUAL 0)
|
||||||
|
string(FIND "${tmp_lxx_probe_version}" "lcc:" tmp_lcc_marker)
|
||||||
|
string(FIND "${tmp_lxx_probe_version}" ":e2k-" tmp_e2k_marker)
|
||||||
|
if(tmp_lcc_marker GREATER -1 AND tmp_e2k_marker GREATER tmp_lcc_marker)
|
||||||
|
execute_process(COMMAND ${CMAKE_CXX_COMPILER} -print-version
|
||||||
|
OUTPUT_VARIABLE CMAKE_CXX_COMPILER_VERSION
|
||||||
|
RESULT_VARIABLE tmp_lxx_probe_result)
|
||||||
|
set(CMAKE_COMPILER_IS_ELBRUSCXX ON)
|
||||||
|
set(CMAKE_CXX_COMPILER_ID "Elbrus")
|
||||||
|
else()
|
||||||
|
set(CMAKE_COMPILER_IS_ELBRUSCXX OFF)
|
||||||
|
endif()
|
||||||
|
unset(tmp_lcc_marker)
|
||||||
|
unset(tmp_e2k_marker)
|
||||||
|
endif()
|
||||||
|
unset(tmp_lxx_probe_version)
|
||||||
|
unset(tmp_lxx_probe_result)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_CL_64)
|
||||||
|
set(MSVC64 1)
|
||||||
|
endif()
|
||||||
|
if(WIN32 AND CMAKE_COMPILER_IS_GNU${CMAKE_PRIMARY_LANG})
|
||||||
|
execute_process(COMMAND ${CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER} -dumpmachine
|
||||||
|
OUTPUT_VARIABLE __GCC_TARGET_MACHINE
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
if(__GCC_TARGET_MACHINE MATCHES "amd64|x86_64|AMD64")
|
||||||
|
set(MINGW64 1)
|
||||||
|
endif()
|
||||||
|
unset(__GCC_TARGET_MACHINE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_COMPILER_IS_ELBRUSC OR CMAKE_SYSTEM_PROCESSOR MATCHES "e2k.*|E2K.*|elbrus.*|ELBRUS.*")
|
||||||
|
set(E2K TRUE)
|
||||||
|
set(CMAKE_SYSTEM_ARCH "Elbrus")
|
||||||
|
elseif((MSVC64 OR MINGW64) AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
|
set(X86_64 TRUE)
|
||||||
|
set(CMAKE_SYSTEM_ARCH "x86_64")
|
||||||
|
elseif(MINGW OR (MSVC AND NOT CMAKE_CROSSCOMPILING))
|
||||||
|
set(X86_32 TRUE)
|
||||||
|
set(CMAKE_SYSTEM_ARCH "x86")
|
||||||
|
elseif(CMAKE_COMPILER_IS_ELBRUSC OR CMAKE_SYSTEM_PROCESSOR MATCHES "e2k.*|E2K.*|elbrus.*|ELBRUS.*")
|
||||||
|
set(E2K TRUE)
|
||||||
|
set(CMAKE_SYSTEM_ARCH "Elbrus")
|
||||||
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
|
set(X86_64 TRUE)
|
||||||
|
set(CMAKE_SYSTEM_ARCH "x86_64")
|
||||||
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i686.*|i386.*|x86.*")
|
||||||
|
set(X86_32 TRUE)
|
||||||
|
set(CMAKE_SYSTEM_ARCH "x86")
|
||||||
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*|ARM64.*)" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
|
set(AARCH64 TRUE)
|
||||||
|
set(CMAKE_SYSTEM_ARCH "ARM64")
|
||||||
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm.*|ARM.*)")
|
||||||
|
set(ARM32 TRUE)
|
||||||
|
set(CMAKE_SYSTEM_ARCH "ARM")
|
||||||
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64le.*" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
|
set(PPC64LE TRUE)
|
||||||
|
set(CMAKE_SYSTEM_ARCH "PPC64LE")
|
||||||
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64.*" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
|
set(PPC64 TRUE)
|
||||||
|
set(CMAKE_SYSTEM_ARCH "PPC64")
|
||||||
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc).*")
|
||||||
|
set(PPC32 TRUE)
|
||||||
|
set(CMAKE_SYSTEM_ARCH "PPC")
|
||||||
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(mips|MIPS)64.*" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
|
set(MIPS64 TRUE)
|
||||||
|
set(CMAKE_SYSTEM_ARCH "MIPS64")
|
||||||
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(mips|MIPS).*")
|
||||||
|
set(MIPS32 TRUE)
|
||||||
|
set(CMAKE_SYSTEM_ARCH "MIPS")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(MSVC)
|
||||||
|
check_compiler_flag("/WX" CC_HAS_WERROR)
|
||||||
|
else()
|
||||||
|
#
|
||||||
|
# GCC started to warn for unused result starting from 4.2, and
|
||||||
|
# this is when it introduced -Wno-unused-result
|
||||||
|
# GCC can also be built on top of llvm runtime (on mac).
|
||||||
|
check_compiler_flag("-Wno-unknown-pragmas" CC_HAS_WNO_UNKNOWN_PRAGMAS)
|
||||||
|
check_compiler_flag("-Wextra" CC_HAS_WEXTRA)
|
||||||
|
check_compiler_flag("-Werror" CC_HAS_WERROR)
|
||||||
|
check_compiler_flag("-fexceptions" CC_HAS_FEXCEPTIONS)
|
||||||
|
check_cxx_compiler_flag("-fcxx-exceptions" CC_HAS_FCXX_EXCEPTIONS)
|
||||||
|
check_compiler_flag("-funwind-tables" CC_HAS_FUNWIND_TABLES)
|
||||||
|
check_compiler_flag("-fno-omit-frame-pointer" CC_HAS_FNO_OMIT_FRAME_POINTER)
|
||||||
|
check_compiler_flag("-fno-common" CC_HAS_FNO_COMMON)
|
||||||
|
check_compiler_flag("-ggdb" CC_HAS_GGDB)
|
||||||
|
check_compiler_flag("-fvisibility=hidden" CC_HAS_VISIBILITY)
|
||||||
|
check_compiler_flag("-march=native" CC_HAS_ARCH_NATIVE)
|
||||||
|
check_compiler_flag("-Og" CC_HAS_DEBUG_FRENDLY_OPTIMIZATION)
|
||||||
|
check_compiler_flag("-Wall" CC_HAS_WALL)
|
||||||
|
check_compiler_flag("-Ominimal" CC_HAS_OMINIMAL)
|
||||||
|
check_compiler_flag("-ffunction-sections -fdata-sections" CC_HAS_SECTIONS)
|
||||||
|
check_compiler_flag("-ffast-math" CC_HAS_FASTMATH)
|
||||||
|
|
||||||
|
# Check for an omp support
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "-fopenmp -Werror")
|
||||||
|
check_cxx_source_compiles("int main(void) {
|
||||||
|
#pragma omp parallel
|
||||||
|
return 0;
|
||||||
|
}" HAVE_OPENMP)
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Check for LTO support by GCC
|
||||||
|
if(CMAKE_COMPILER_IS_GNU${CMAKE_PRIMARY_LANG})
|
||||||
|
unset(gcc_collect)
|
||||||
|
unset(gcc_lto_wrapper)
|
||||||
|
|
||||||
|
if(NOT CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_VERSION VERSION_LESS 4.7)
|
||||||
|
execute_process(COMMAND ${CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER} -v
|
||||||
|
OUTPUT_VARIABLE gcc_info_v ERROR_VARIABLE gcc_info_v)
|
||||||
|
|
||||||
|
string(REGEX MATCH "^(.+\nCOLLECT_GCC=)([^ \n]+)(\n.+)$" gcc_collect_valid ${gcc_info_v})
|
||||||
|
if(gcc_collect_valid)
|
||||||
|
string(REGEX REPLACE "^(.+\nCOLLECT_GCC=)([^ \n]+)(\n.+)$" "\\2" gcc_collect ${gcc_info_v})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(REGEX MATCH "^(.+\nCOLLECT_LTO_WRAPPER=)([^ \n]+/lto-wrapper)(\n.+)$" gcc_lto_wrapper_valid ${gcc_info_v})
|
||||||
|
if(gcc_lto_wrapper_valid)
|
||||||
|
string(REGEX REPLACE "^(.+\nCOLLECT_LTO_WRAPPER=)([^ \n]+/lto-wrapper)(\n.+)$" "\\2" gcc_lto_wrapper ${gcc_info_v})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(gcc_suffix "")
|
||||||
|
if(gcc_collect_valid AND gcc_collect)
|
||||||
|
string(REGEX MATCH "^(.*cc)(-.+)$" gcc_suffix_valid ${gcc_collect})
|
||||||
|
if(gcc_suffix_valid)
|
||||||
|
string(REGEX MATCH "^(.*cc)(-.+)$" "\\2" gcc_suffix ${gcc_collect})
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
get_filename_component(gcc_dir ${CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER} DIRECTORY)
|
||||||
|
if(NOT CMAKE_GCC_AR)
|
||||||
|
find_program(CMAKE_GCC_AR NAMES gcc${gcc_suffix}-ar gcc-ar${gcc_suffix} PATHS ${gcc_dir} NO_DEFAULT_PATH)
|
||||||
|
endif()
|
||||||
|
if(NOT CMAKE_GCC_NM)
|
||||||
|
find_program(CMAKE_GCC_NM NAMES gcc${gcc_suffix}-nm gcc-nm${gcc_suffix} PATHS ${gcc_dir} NO_DEFAULT_PATH)
|
||||||
|
endif()
|
||||||
|
if(NOT CMAKE_GCC_RANLIB)
|
||||||
|
find_program(CMAKE_GCC_RANLIB NAMES gcc${gcc_suffix}-ranlib gcc-ranlib${gcc_suffix} PATHS ${gcc_dir} NO_DEFAULT_PATH)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
unset(gcc_dir)
|
||||||
|
unset(gcc_suffix_valid)
|
||||||
|
unset(gcc_suffix)
|
||||||
|
unset(gcc_lto_wrapper_valid)
|
||||||
|
unset(gcc_collect_valid)
|
||||||
|
unset(gcc_collect)
|
||||||
|
unset(gcc_info_v)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_GCC_AR AND CMAKE_GCC_NM AND CMAKE_GCC_RANLIB AND gcc_lto_wrapper)
|
||||||
|
message(STATUS "Found GCC's LTO toolset: ${gcc_lto_wrapper}, ${CMAKE_GCC_AR}, ${CMAKE_GCC_RANLIB}")
|
||||||
|
set(GCC_LTO_CFLAGS "-flto -fno-fat-lto-objects -fuse-linker-plugin")
|
||||||
|
set(GCC_LTO_AVAILABLE TRUE)
|
||||||
|
message(STATUS "Link-Time Optimization by GCC is available")
|
||||||
|
else()
|
||||||
|
set(GCC_LTO_AVAILABLE FALSE)
|
||||||
|
message(STATUS "Link-Time Optimization by GCC is NOT available")
|
||||||
|
endif()
|
||||||
|
unset(gcc_lto_wrapper)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# check for LTO by MSVC
|
||||||
|
if(MSVC)
|
||||||
|
if(NOT MSVC_VERSION LESS 1600)
|
||||||
|
set(MSVC_LTO_AVAILABLE TRUE)
|
||||||
|
message(STATUS "Link-Time Optimization by MSVC is available")
|
||||||
|
else()
|
||||||
|
set(MSVC_LTO_AVAILABLE FALSE)
|
||||||
|
message(STATUS "Link-Time Optimization by MSVC is NOT available")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Check for LTO support by CLANG
|
||||||
|
if(CMAKE_COMPILER_IS_CLANG)
|
||||||
|
if(NOT CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_VERSION VERSION_LESS 3.5)
|
||||||
|
execute_process(COMMAND ${CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER} -print-search-dirs
|
||||||
|
OUTPUT_VARIABLE clang_search_dirs)
|
||||||
|
|
||||||
|
unset(clang_bindir)
|
||||||
|
unset(clang_libdir)
|
||||||
|
string(REGEX MATCH "^(.*programs: =)([^:]*:)*([^:]+/llvm[-.0-9]+/bin[^:]*)(:[^:]*)*(\n.+)$" clang_bindir_valid ${clang_search_dirs})
|
||||||
|
if(clang_bindir_valid)
|
||||||
|
string(REGEX REPLACE "^(.*programs: =)([^:]*:)*([^:]+/llvm[-.0-9]+/bin[^:]*)(:[^:]*)*(\n.+)$" "\\3" clang_bindir ${clang_search_dirs})
|
||||||
|
get_filename_component(clang_libdir "${clang_bindir}/../lib" REALPATH)
|
||||||
|
if(clang_libdir)
|
||||||
|
message(STATUS "Found CLANG/LLVM directories: ${clang_bindir}, ${clang_libdir}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT (clang_bindir AND clang_libdir))
|
||||||
|
message(STATUS "Could NOT find CLANG/LLVM directories (bin and/or lib).")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT CMAKE_CLANG_LD AND clang_bindir)
|
||||||
|
find_program(CMAKE_CLANG_LD NAMES llvm-link link llvm-ld ld PATHS ${clang_bindir} NO_DEFAULT_PATH)
|
||||||
|
endif()
|
||||||
|
if(NOT CMAKE_CLANG_AR AND clang_bindir)
|
||||||
|
find_program(CMAKE_CLANG_AR NAMES llvm-ar ar PATHS ${clang_bindir} NO_DEFAULT_PATH)
|
||||||
|
endif()
|
||||||
|
if(NOT CMAKE_CLANG_NM AND clang_bindir)
|
||||||
|
find_program(CMAKE_CLANG_NM NAMES llvm-nm nm PATHS ${clang_bindir} NO_DEFAULT_PATH)
|
||||||
|
endif()
|
||||||
|
if(NOT CMAKE_CLANG_RANLIB AND clang_bindir)
|
||||||
|
find_program(CMAKE_CLANG_RANLIB NAMES llvm-ranlib ranlib PATHS ${clang_bindir} NO_DEFAULT_PATH)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(clang_lto_plugin_name "LLVMgold${CMAKE_SHARED_LIBRARY_SUFFIX}")
|
||||||
|
if(NOT CMAKE_LD_GOLD AND clang_bindir)
|
||||||
|
find_program(CMAKE_LD_GOLD NAMES ld.gold PATHS)
|
||||||
|
endif()
|
||||||
|
if(NOT CLANG_LTO_PLUGIN AND clang_libdir)
|
||||||
|
find_file(CLANG_LTO_PLUGIN ${clang_lto_plugin_name} PATH ${clang_libdir} NO_DEFAULT_PATH)
|
||||||
|
endif()
|
||||||
|
if(CLANG_LTO_PLUGIN)
|
||||||
|
message(STATUS "Found CLANG/LLVM's plugin for LTO: ${CLANG_LTO_PLUGIN}")
|
||||||
|
else()
|
||||||
|
message(STATUS "Could NOT find CLANG/LLVM's plugin (${clang_lto_plugin_name}) for LTO.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_CLANG_LD AND CMAKE_CLANG_AR AND CMAKE_CLANG_NM AND CMAKE_CLANG_RANLIB)
|
||||||
|
message(STATUS "Found CLANG/LLVM's binutils for LTO: ${CMAKE_CLANG_AR}, ${CMAKE_CLANG_RANLIB}")
|
||||||
|
else()
|
||||||
|
message(STATUS "Could NOT find CLANG/LLVM's binutils (ar, ranlib, nm) for LTO.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
unset(clang_lto_plugin_name)
|
||||||
|
unset(clang_libdir)
|
||||||
|
unset(clang_bindir_valid)
|
||||||
|
unset(clang_bindir)
|
||||||
|
unset(clang_search_dirs)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if((CLANG_LTO_PLUGIN AND CMAKE_LD_GOLD) AND
|
||||||
|
(CMAKE_CLANG_LD AND CMAKE_CLANG_AR AND CMAKE_CLANG_NM AND CMAKE_CLANG_RANLIB))
|
||||||
|
set(CLANG_LTO_AVAILABLE TRUE)
|
||||||
|
message(STATUS "Link-Time Optimization by CLANG/LLVM is available")
|
||||||
|
elseif(CMAKE_TOOLCHAIN_FILE AND NOT CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_VERSION VERSION_LESS 7.0)
|
||||||
|
set(CLANG_LTO_AVAILABLE TRUE)
|
||||||
|
if (NOT CMAKE_CLANG_AR)
|
||||||
|
set(CMAKE_CLANG_AR ${CMAKE_AR})
|
||||||
|
endif()
|
||||||
|
if (NOT CMAKE_CLANG_NM)
|
||||||
|
set(CMAKE_CLANG_NM ${CMAKE_NM})
|
||||||
|
endif()
|
||||||
|
if (NOT CMAKE_CLANG_RANLIB)
|
||||||
|
set(CMAKE_CLANG_RANLIB ${CMAKE_RANLIB })
|
||||||
|
endif()
|
||||||
|
message(STATUS "Assume Link-Time Optimization by CLANG/LLVM is available via ${CMAKE_TOOLCHAIN_FILE}")
|
||||||
|
else()
|
||||||
|
set(CLANG_LTO_AVAILABLE FALSE)
|
||||||
|
message(STATUS "Link-Time Optimization by CLANG/LLVM is NOT available")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Perform build type specific configuration.
|
||||||
|
option(ENABLE_BACKTRACE "Enable output of fiber backtrace information in 'show
|
||||||
|
fiber' administrative command. Only works on x86 architectures, if compiled
|
||||||
|
with gcc. If GNU binutils and binutils-dev libraries are installed, backtrace
|
||||||
|
is output with resolved function (symbol) names. Otherwise only frame
|
||||||
|
addresses are printed." OFF)
|
||||||
|
|
||||||
|
set(HAVE_BFD False)
|
||||||
|
if(ENABLE_BACKTRACE)
|
||||||
|
if(NOT (X86_32 OR X86_64) OR NOT CMAKE_COMPILER_IS_GNU${CMAKE_PRIMARY_LANG})
|
||||||
|
# We only know this option to work with gcc
|
||||||
|
message(FATAL_ERROR "ENABLE_BACKTRACE option is set but the system
|
||||||
|
is not x86 based (${CMAKE_SYSTEM_PROCESSOR}) or the compiler
|
||||||
|
is not GNU GCC (${CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER}).")
|
||||||
|
endif()
|
||||||
|
# Use GNU bfd if present.
|
||||||
|
find_library(BFD_LIBRARY NAMES libbfd.a)
|
||||||
|
if(BFD_LIBRARY)
|
||||||
|
check_library_exists(${BFD_LIBRARY} bfd_init "" HAVE_BFD_LIB)
|
||||||
|
endif()
|
||||||
|
find_library(IBERTY_LIBRARY NAMES libiberty.a)
|
||||||
|
if(IBERTY_LIBRARY)
|
||||||
|
check_library_exists(${IBERTY_LIBRARY} cplus_demangle "" HAVE_IBERTY_LIB)
|
||||||
|
endif()
|
||||||
|
set(CMAKE_REQUIRED_DEFINITIONS -DPACKAGE=${PACKAGE} -DPACKAGE_VERSION=${PACKAGE_VERSION})
|
||||||
|
check_include_files(bfd.h HAVE_BFD_H)
|
||||||
|
set(CMAKE_REQUIRED_DEFINITIONS)
|
||||||
|
find_package(ZLIB)
|
||||||
|
if(HAVE_BFD_LIB AND HAVE_BFD_H AND HAVE_IBERTY_LIB AND ZLIB_FOUND)
|
||||||
|
set(HAVE_BFD ON)
|
||||||
|
set(BFD_LIBRARIES ${BFD_LIBRARY} ${IBERTY_LIBRARY} ${ZLIB_LIBRARIES})
|
||||||
|
find_package_message(BFD_LIBRARIES "Found libbfd and dependencies"
|
||||||
|
${BFD_LIBRARIES})
|
||||||
|
if(TARGET_OS_FREEBSD AND NOT TARGET_OS_DEBIAN_FREEBSD)
|
||||||
|
set(BFD_LIBRARIES ${BFD_LIBRARIES} iconv)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
macro(setup_compile_flags)
|
||||||
|
# LY: save initial C/CXX flags
|
||||||
|
if(NOT INITIAL_CMAKE_FLAGS_SAVED)
|
||||||
|
if(MSVC)
|
||||||
|
string(REGEX REPLACE "^(.*)(/EHsc)( *)(.*)$" "\\1/EHs\\3\\4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
||||||
|
endif()
|
||||||
|
set(INITIAL_CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} CACHE STRING "Initial CMake's flags" FORCE)
|
||||||
|
set(INITIAL_CMAKE_C_FLAGS ${CMAKE_C_FLAGS} CACHE STRING "Initial CMake's flags" FORCE)
|
||||||
|
set(INITIAL_CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} CACHE STRING "Initial CMake's flags" FORCE)
|
||||||
|
set(INITIAL_CMAKE_SHARED_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS} CACHE STRING "Initial CMake's flags" FORCE)
|
||||||
|
set(INITIAL_CMAKE_STATIC_LINKER_FLAGS ${CMAKE_STATIC_LINKER_FLAGS} CACHE STRING "Initial CMake's flags" FORCE)
|
||||||
|
set(INITIAL_CMAKE_MODULE_LINKER_FLAGS ${CMAKE_MODULE_LINKER_FLAGS} CACHE STRING "Initial CMake's flags" FORCE)
|
||||||
|
set(INITIAL_CMAKE_FLAGS_SAVED TRUE CACHE INTERNAL "State of initial CMake's flags" FORCE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# LY: reset C/CXX flags
|
||||||
|
set(CXX_FLAGS ${INITIAL_CMAKE_CXX_FLAGS})
|
||||||
|
set(C_FLAGS ${INITIAL_CMAKE_C_FLAGS})
|
||||||
|
set(EXE_LINKER_FLAGS ${INITIAL_CMAKE_EXE_LINKER_FLAGS})
|
||||||
|
set(SHARED_LINKER_FLAGS ${INITIAL_CMAKE_SHARED_LINKER_FLAGS})
|
||||||
|
set(STATIC_LINKER_FLAGS ${INITIAL_CMAKE_STATIC_LINKER_FLAGS})
|
||||||
|
set(MODULE_LINKER_FLAGS ${INITIAL_CMAKE_MODULE_LINKER_FLAGS})
|
||||||
|
|
||||||
|
if(CC_HAS_FEXCEPTIONS)
|
||||||
|
add_compile_flags("C;CXX" "-fexceptions")
|
||||||
|
endif()
|
||||||
|
if(CC_HAS_FCXX_EXCEPTIONS)
|
||||||
|
add_compile_flags("CXX" "-fcxx-exceptions -frtti")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# In C a global variable without a storage specifier (static/extern) and
|
||||||
|
# without an initialiser is called a ’tentative definition’. The
|
||||||
|
# language permits multiple tentative definitions in the single
|
||||||
|
# translation unit; i.e. int foo; int foo; is perfectly ok. GNU
|
||||||
|
# toolchain goes even further, allowing multiple tentative definitions
|
||||||
|
# in *different* translation units. Internally, variables introduced via
|
||||||
|
# tentative definitions are implemented as ‘common’ symbols. Linker
|
||||||
|
# permits multiple definitions if they are common symbols, and it picks
|
||||||
|
# one arbitrarily for inclusion in the binary being linked.
|
||||||
|
#
|
||||||
|
# -fno-common forces GNU toolchain to behave in a more
|
||||||
|
# standard-conformant way in respect to tentative definitions and it
|
||||||
|
# prevents common symbols generation. Since we are a cross-platform
|
||||||
|
# project it really makes sense. There are toolchains that don’t
|
||||||
|
# implement GNU style handling of the tentative definitions and there
|
||||||
|
# are platforms lacking proper support for common symbols (osx).
|
||||||
|
if(CC_HAS_FNO_COMMON)
|
||||||
|
add_compile_flags("C;CXX" "-fno-common")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CC_HAS_GGDB)
|
||||||
|
add_compile_flags("C;CXX" "-ggdb")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CC_HAS_WNO_UNKNOWN_PRAGMAS AND NOT HAVE_OPENMP)
|
||||||
|
add_compile_flags("C;CXX" -Wno-unknown-pragmas)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CC_HAS_SECTIONS)
|
||||||
|
add_compile_flags("C;CXX" -ffunction-sections -fdata-sections)
|
||||||
|
elseif(MSVC)
|
||||||
|
add_compile_flags("C;CXX" /Gy)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# We must set -fno-omit-frame-pointer here, since we rely
|
||||||
|
# on frame pointer when getting a backtrace, and it must
|
||||||
|
# be used consistently across all object files.
|
||||||
|
# The same reasoning applies to -fno-stack-protector switch.
|
||||||
|
if(ENABLE_BACKTRACE)
|
||||||
|
if(CC_HAS_FNO_OMIT_FRAME_POINTER)
|
||||||
|
add_compile_flags("C;CXX" "-fno-omit-frame-pointer")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(MSVC)
|
||||||
|
if (MSVC_VERSION LESS 1900)
|
||||||
|
message(FATAL_ERROR "At least \"Microsoft C/C++ Compiler\" version 19.0.24234.1 (Visual Studio 2015 Update 3) is required.")
|
||||||
|
endif()
|
||||||
|
add_compile_flags("CXX" "/Zc:__cplusplus")
|
||||||
|
add_compile_flags("C;CXX" "/W4")
|
||||||
|
add_compile_flags("C;CXX" "/utf-8")
|
||||||
|
else()
|
||||||
|
if(CC_HAS_WALL)
|
||||||
|
add_compile_flags("C;CXX" "-Wall")
|
||||||
|
endif()
|
||||||
|
if(CC_HAS_WEXTRA)
|
||||||
|
add_compile_flags("C;CXX" "-Wextra")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_COMPILER_IS_GNU${CMAKE_PRIMARY_LANG}
|
||||||
|
AND CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_VERSION VERSION_LESS 5)
|
||||||
|
# G++ bug. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31488
|
||||||
|
add_compile_flags("CXX" "-Wno-invalid-offsetof")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_definitions("-D__STDC_FORMAT_MACROS=1")
|
||||||
|
add_definitions("-D__STDC_LIMIT_MACROS=1")
|
||||||
|
add_definitions("-D__STDC_CONSTANT_MACROS=1")
|
||||||
|
add_definitions("-D_HAS_EXCEPTIONS=1")
|
||||||
|
|
||||||
|
# Only add -Werror if it's a debug build, done by developers.
|
||||||
|
# Release builds should not cause extra trouble.
|
||||||
|
if(CC_HAS_WERROR AND (CI OR CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE STREQUAL "Debug"))
|
||||||
|
if(MSVC)
|
||||||
|
add_compile_flags("C;CXX" "/WX")
|
||||||
|
elseif(CMAKE_COMPILER_IS_CLANG)
|
||||||
|
if (NOT CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_VERSION VERSION_LESS 6)
|
||||||
|
add_compile_flags("C;CXX" "-Werror")
|
||||||
|
endif()
|
||||||
|
elseif(CMAKE_COMPILER_IS_GNUCC)
|
||||||
|
if (NOT CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_VERSION VERSION_LESS 6)
|
||||||
|
add_compile_flags("C;CXX" "-Werror")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
add_compile_flags("C;CXX" "-Werror")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(HAVE_OPENMP)
|
||||||
|
add_compile_flags("C;CXX" "-fopenmp")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (ENABLE_ASAN)
|
||||||
|
add_compile_flags("C;CXX" -fsanitize=address)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(ENABLE_GCOV)
|
||||||
|
if(NOT HAVE_GCOV)
|
||||||
|
message(FATAL_ERROR
|
||||||
|
"ENABLE_GCOV option requested but gcov library is not found")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_compile_flags("C;CXX" "-fprofile-arcs" "-ftest-coverage")
|
||||||
|
set(EXE_LINKER_FLAGS "${EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")
|
||||||
|
set(SHARED_LINKER_FLAGS "${SHARED_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")
|
||||||
|
set(MODULE_LINKER_FLAGS "${MODULE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")
|
||||||
|
# add_library(gcov SHARED IMPORTED)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(ENABLE_GPROF)
|
||||||
|
add_compile_flags("C;CXX" "-pg")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_COMPILER_IS_GNUCC AND LTO_ENABLED)
|
||||||
|
add_compile_flags("C;CXX" ${GCC_LTO_CFLAGS})
|
||||||
|
set(EXE_LINKER_FLAGS "${EXE_LINKER_FLAGS} ${GCC_LTO_CFLAGS} -fverbose-asm -fwhole-program")
|
||||||
|
set(SHARED_LINKER_FLAGS "${SHARED_LINKER_FLAGS} ${GCC_LTO_CFLAGS} -fverbose-asm")
|
||||||
|
set(MODULE_LINKER_FLAGS "${MODULE_LINKER_FLAGS} ${GCC_LTO_CFLAGS} -fverbose-asm")
|
||||||
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5)
|
||||||
|
# Pass the same optimization flags to the linker
|
||||||
|
set(compile_flags "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UPPERCASE}}")
|
||||||
|
set(EXE_LINKER_FLAGS "${EXE_LINKER_FLAGS} ${compile_flags}")
|
||||||
|
set(SHARED_LINKER_FLAGS "${SHARED_LINKER_FLAGS} ${compile_flags}")
|
||||||
|
set(MODULE_LINKER_FLAGS "${MODULE_LINKER_FLAGS} ${compile_flags}")
|
||||||
|
unset(compile_flags)
|
||||||
|
else()
|
||||||
|
add_compile_flags("CXX" "-flto-odr-type-merging")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(MSVC AND LTO_ENABLED)
|
||||||
|
add_compile_flags("C;CXX" "/GL")
|
||||||
|
foreach(linkmode IN ITEMS EXE SHARED STATIC MODULE)
|
||||||
|
set(${linkmode}_LINKER_FLAGS "${${linkmode}_LINKER_FLAGS} /LTCG")
|
||||||
|
string(REGEX REPLACE "^(.*)(/INCREMENTAL:NO *)(.*)$" "\\1\\3" ${linkmode}_LINKER_FLAGS "${${linkmode}_LINKER_FLAGS}")
|
||||||
|
string(REGEX REPLACE "^(.*)(/INCREMENTAL:YES *)(.*)$" "\\1\\3" ${linkmode}_LINKER_FLAGS "${${linkmode}_LINKER_FLAGS}")
|
||||||
|
string(REGEX REPLACE "^(.*)(/INCREMENTAL *)(.*)$" "\\1\\3" ${linkmode}_LINKER_FLAGS "${${linkmode}_LINKER_FLAGS}")
|
||||||
|
string(STRIP "${${linkmode}_LINKER_FLAGS}" ${linkmode}_LINKER_FLAGS)
|
||||||
|
foreach(config IN LISTS CMAKE_CONFIGURATION_TYPES ITEMS Release MinSizeRel RelWithDebInfo Debug)
|
||||||
|
string(TOUPPER "${config}" config_uppercase)
|
||||||
|
if(DEFINED "CMAKE_${linkmode}_LINKER_FLAGS_${config_uppercase}")
|
||||||
|
string(REGEX REPLACE "^(.*)(/INCREMENTAL:NO *)(.*)$" "\\1\\3" altered_flags "${CMAKE_${linkmode}_LINKER_FLAGS_${config_uppercase}}")
|
||||||
|
string(REGEX REPLACE "^(.*)(/INCREMENTAL:YES *)(.*)$" "\\1\\3" altered_flags "${altered_flags}")
|
||||||
|
string(REGEX REPLACE "^(.*)(/INCREMENTAL *)(.*)$" "\\1\\3" altered_flags "${altered_flags}")
|
||||||
|
string(STRIP "${altered_flags}" altered_flags)
|
||||||
|
if(NOT "${altered_flags}" STREQUAL "${CMAKE_${linkmode}_LINKER_FLAGS_${config_uppercase}}")
|
||||||
|
set(CMAKE_${linkmode}_LINKER_FLAGS_${config_uppercase} "${altered_flags}" CACHE STRING "Altered: '/INCREMENTAL' removed for LTO" FORCE)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endforeach(config)
|
||||||
|
endforeach(linkmode)
|
||||||
|
unset(linkmode)
|
||||||
|
|
||||||
|
foreach(config IN LISTS CMAKE_CONFIGURATION_TYPES ITEMS Release MinSizeRel RelWithDebInfo)
|
||||||
|
foreach(lang IN ITEMS C CXX)
|
||||||
|
string(TOUPPER "${config}" config_uppercase)
|
||||||
|
if(DEFINED "CMAKE_${lang}_FLAGS_${config_uppercase}")
|
||||||
|
string(REPLACE "/O2" "/Ox" altered_flags "${CMAKE_${lang}_FLAGS_${config_uppercase}}")
|
||||||
|
if(NOT "${altered_flags}" STREQUAL "${CMAKE_${lang}_FLAGS_${config_uppercase}}")
|
||||||
|
set(CMAKE_${lang}_FLAGS_${config_uppercase} "${altered_flags}" CACHE STRING "Altered: '/O2' replaced by '/Ox' for LTO" FORCE)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
unset(config_uppercase)
|
||||||
|
endforeach(lang)
|
||||||
|
endforeach(config)
|
||||||
|
unset(altered_flags)
|
||||||
|
unset(lang)
|
||||||
|
unset(config)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_COMPILER_IS_CLANG AND OSX_ARCHITECTURES)
|
||||||
|
set(EXE_LINKER_FLAGS "${EXE_LINKER_FLAGS} -Wl,-keep_dwarf_unwind")
|
||||||
|
set(SHARED_LINKER_FLAGS "${SHARED_LINKER_FLAGS} -Wl,-keep_dwarf_unwind")
|
||||||
|
set(MODULE_LINKER_FLAGS "${MODULE_LINKER_FLAGS} -Wl,-keep_dwarf_unwind")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_COMPILER_IS_CLANG AND LTO_ENABLED)
|
||||||
|
if(CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_VERSION VERSION_LESS 3.9)
|
||||||
|
set(CLANG_LTO_FLAG "-flto")
|
||||||
|
else()
|
||||||
|
set(CLANG_LTO_FLAG "-flto=thin")
|
||||||
|
endif()
|
||||||
|
add_compile_flags("C;CXX" ${CLANG_LTO_FLAG})
|
||||||
|
set(EXE_LINKER_FLAGS "${EXE_LINKER_FLAGS} ${CLANG_LTO_FLAG} -fverbose-asm -fwhole-program")
|
||||||
|
set(SHARED_LINKER_FLAGS "${SHARED_LINKER_FLAGS} ${CLANG_LTO_FLAG} -fverbose-asm")
|
||||||
|
set(MODULE_LINKER_FLAGS "${MODULE_LINKER_FLAGS} ${CLANG_LTO_FLAG} -fverbose-asm")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# LY: push C/CXX flags into the cache
|
||||||
|
set(CMAKE_CXX_FLAGS ${CXX_FLAGS} CACHE STRING "Flags used by the C++ compiler during all build types" FORCE)
|
||||||
|
set(CMAKE_C_FLAGS ${C_FLAGS} CACHE STRING "Flags used by the C compiler during all build types" FORCE)
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS ${EXE_LINKER_FLAGS} CACHE STRING "Flags used by the linker" FORCE)
|
||||||
|
set(CMAKE_SHARED_LINKER_FLAGS ${SHARED_LINKER_FLAGS} CACHE STRING "Flags used by the linker during the creation of dll's" FORCE)
|
||||||
|
set(CMAKE_STATIC_LINKER_FLAGS ${STATIC_LINKER_FLAGS} CACHE STRING "Flags used by the linker during the creation of static libraries" FORCE)
|
||||||
|
set(CMAKE_MODULE_LINKER_FLAGS ${MODULE_LINKER_FLAGS} CACHE STRING "Flags used by the linker during the creation of modules" FORCE)
|
||||||
|
unset(CXX_FLAGS)
|
||||||
|
unset(C_FLAGS)
|
||||||
|
unset(EXE_LINKER_FLAGS)
|
||||||
|
unset(SHARED_LINKER_FLAGS)
|
||||||
|
unset(STATIC_LINKER_FLAGS)
|
||||||
|
unset(MODULE_LINKER_FLAGS)
|
||||||
|
endmacro(setup_compile_flags)
|
||||||
|
|
||||||
|
# determine library for for std::filesystem
|
||||||
|
set(LIBCXX_FILESYSTEM "")
|
||||||
|
if(CMAKE_COMPILER_IS_GNUCXX)
|
||||||
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.0)
|
||||||
|
set(LIBCXX_FILESYSTEM "stdc++fs")
|
||||||
|
endif()
|
||||||
|
elseif (CMAKE_COMPILER_IS_CLANG)
|
||||||
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)
|
||||||
|
set(LIBCXX_FILESYSTEM "c++experimental")
|
||||||
|
else()
|
||||||
|
set(LIBCXX_FILESYSTEM "stdc++fs")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
cmake_policy(POP)
|
||||||
45
contrib/db/libmdbx/cmake/profile.cmake
Normal file
45
contrib/db/libmdbx/cmake/profile.cmake
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
## Copyright (c) 2012-2019 Leonid Yuriev <leo@yuriev.ru>.
|
||||||
|
##
|
||||||
|
## Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
## you may not use this file except in compliance with the License.
|
||||||
|
## You may obtain a copy of the License at
|
||||||
|
##
|
||||||
|
## http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
##
|
||||||
|
## Unless required by applicable law or agreed to in writing, software
|
||||||
|
## distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
## See the License for the specific language governing permissions and
|
||||||
|
## limitations under the License.
|
||||||
|
##
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.8.2)
|
||||||
|
cmake_policy(PUSH)
|
||||||
|
cmake_policy(VERSION 3.8.2)
|
||||||
|
|
||||||
|
include(CheckLibraryExists)
|
||||||
|
check_library_exists(gcov __gcov_flush "" HAVE_GCOV)
|
||||||
|
|
||||||
|
option(ENABLE_GCOV
|
||||||
|
"Enable integration with gcov, a code coverage program" OFF)
|
||||||
|
|
||||||
|
option(ENABLE_GPROF
|
||||||
|
"Enable integration with gprof, a performance analyzing tool" OFF)
|
||||||
|
|
||||||
|
if(CMAKE_CXX_COMPILER_LOADED)
|
||||||
|
include(CheckIncludeFileCXX)
|
||||||
|
check_include_file_cxx(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
|
||||||
|
else()
|
||||||
|
include(CheckIncludeFile)
|
||||||
|
check_include_file(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
option(MDBX_USE_VALGRIND "Enable integration with valgrind, a memory analyzing tool" OFF)
|
||||||
|
if(MDBX_USE_VALGRIND AND NOT HAVE_VALGRIND_MEMCHECK_H)
|
||||||
|
message(FATAL_ERROR "MDBX_USE_VALGRIND option is set but valgrind/memcheck.h is not found")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
option(ENABLE_ASAN
|
||||||
|
"Enable AddressSanitizer, a fast memory error detector based on compiler instrumentation" OFF)
|
||||||
|
|
||||||
|
cmake_policy(POP)
|
||||||
183
contrib/db/libmdbx/cmake/utils.cmake
Normal file
183
contrib/db/libmdbx/cmake/utils.cmake
Normal file
|
|
@ -0,0 +1,183 @@
|
||||||
|
## Copyright (c) 2012-2019 Leonid Yuriev <leo@yuriev.ru>.
|
||||||
|
##
|
||||||
|
## Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
## you may not use this file except in compliance with the License.
|
||||||
|
## You may obtain a copy of the License at
|
||||||
|
##
|
||||||
|
## http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
##
|
||||||
|
## Unless required by applicable law or agreed to in writing, software
|
||||||
|
## distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
## See the License for the specific language governing permissions and
|
||||||
|
## limitations under the License.
|
||||||
|
##
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.8.2)
|
||||||
|
cmake_policy(PUSH)
|
||||||
|
cmake_policy(VERSION 3.8.2)
|
||||||
|
|
||||||
|
macro(add_compile_flags langs)
|
||||||
|
foreach(_lang ${langs})
|
||||||
|
string(REPLACE ";" " " _flags "${ARGN}")
|
||||||
|
if(CMAKE_CXX_COMPILER_LOADED AND _lang STREQUAL "CXX")
|
||||||
|
set("${_lang}_FLAGS" "${${_lang}_FLAGS} ${_flags}")
|
||||||
|
endif()
|
||||||
|
if(CMAKE_C_COMPILER_LOADED AND _lang STREQUAL "C")
|
||||||
|
set("${_lang}_FLAGS" "${${_lang}_FLAGS} ${_flags}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
unset(_lang)
|
||||||
|
unset(_flags)
|
||||||
|
endmacro(add_compile_flags)
|
||||||
|
|
||||||
|
macro(set_source_files_compile_flags)
|
||||||
|
foreach(file ${ARGN})
|
||||||
|
get_filename_component(_file_ext ${file} EXT)
|
||||||
|
set(_lang "")
|
||||||
|
if("${_file_ext}" STREQUAL ".m")
|
||||||
|
set(_lang OBJC)
|
||||||
|
# CMake believes that Objective C is a flavor of C++, not C,
|
||||||
|
# and uses g++ compiler for .m files.
|
||||||
|
# LANGUAGE property forces CMake to use CC for ${file}
|
||||||
|
set_source_files_properties(${file} PROPERTIES LANGUAGE C)
|
||||||
|
elseif("${_file_ext}" STREQUAL ".mm")
|
||||||
|
set(_lang OBJCXX)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(_lang)
|
||||||
|
get_source_file_property(_flags ${file} COMPILE_FLAGS)
|
||||||
|
if("${_flags}" STREQUAL "NOTFOUND")
|
||||||
|
set(_flags "${CMAKE_${_lang}_FLAGS}")
|
||||||
|
else()
|
||||||
|
set(_flags "${_flags} ${CMAKE_${_lang}_FLAGS}")
|
||||||
|
endif()
|
||||||
|
# message(STATUS "Set (${file} ${_flags}")
|
||||||
|
set_source_files_properties(${file} PROPERTIES COMPILE_FLAGS
|
||||||
|
"${_flags}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
unset(_file_ext)
|
||||||
|
unset(_lang)
|
||||||
|
endmacro(set_source_files_compile_flags)
|
||||||
|
|
||||||
|
macro(fetch_version name version_file)
|
||||||
|
set(${name}_VERSION "")
|
||||||
|
set(${name}_GIT_DESCRIBE "")
|
||||||
|
set(${name}_GIT_TIMESTAMP "")
|
||||||
|
set(${name}_GIT_TREE "")
|
||||||
|
set(${name}_GIT_COMMIT "")
|
||||||
|
set(${name}_GIT_REVISION 0)
|
||||||
|
set(${name}_GIT_VERSION "")
|
||||||
|
if(GIT)
|
||||||
|
execute_process(COMMAND ${GIT} describe --tags --long --dirty=-dirty
|
||||||
|
OUTPUT_VARIABLE ${name}_GIT_DESCRIBE
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
RESULT_VARIABLE rc)
|
||||||
|
if(rc OR "${name}_GIT_DESCRIBE" STREQUAL "")
|
||||||
|
message(FATAL_ERROR "Please fetch tags and/or install latest version of git ('describe --tags --long --dirty' failed)")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
execute_process(COMMAND ${GIT} show --no-patch --format=%cI HEAD
|
||||||
|
OUTPUT_VARIABLE ${name}_GIT_TIMESTAMP
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
RESULT_VARIABLE rc)
|
||||||
|
if(rc OR "${name}_GIT_TIMESTAMP" STREQUAL "%cI")
|
||||||
|
execute_process(COMMAND ${GIT} show --no-patch --format=%ci HEAD
|
||||||
|
OUTPUT_VARIABLE ${name}_GIT_TIMESTAMP
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
RESULT_VARIABLE rc)
|
||||||
|
if(rc OR "${name}_GIT_TIMESTAMP" STREQUAL "%ci")
|
||||||
|
message(FATAL_ERROR "Please install latest version of git ('show --no-patch --format=%cI HEAD' failed)")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
execute_process(COMMAND ${GIT} show --no-patch --format=%T HEAD
|
||||||
|
OUTPUT_VARIABLE ${name}_GIT_TREE
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
RESULT_VARIABLE rc)
|
||||||
|
if(rc OR "${name}_GIT_TREE" STREQUAL "")
|
||||||
|
message(FATAL_ERROR "Please install latest version of git ('show --no-patch --format=%T HEAD' failed)")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
execute_process(COMMAND ${GIT} show --no-patch --format=%H HEAD
|
||||||
|
OUTPUT_VARIABLE ${name}_GIT_COMMIT
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
RESULT_VARIABLE rc)
|
||||||
|
if(rc OR "${name}_GIT_COMMIT" STREQUAL "")
|
||||||
|
message(FATAL_ERROR "Please install latest version of git ('show --no-patch --format=%H HEAD' failed)")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
execute_process(COMMAND ${GIT} rev-list --count --no-merges HEAD
|
||||||
|
OUTPUT_VARIABLE ${name}_GIT_REVISION
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
RESULT_VARIABLE rc)
|
||||||
|
if(rc OR "${name}_GIT_REVISION" STREQUAL "")
|
||||||
|
message(FATAL_ERROR "Please install latest version of git ('rev-list --count --no-merges HEAD' failed)")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(REGEX MATCH "^(v)?([0-9]+)\\.([0-9]+)\\.([0-9]+)(.*)?" git_version_valid "${${name}_GIT_DESCRIBE}")
|
||||||
|
if(git_version_valid)
|
||||||
|
string(REGEX REPLACE "^(v)?([0-9]+)\\.([0-9]+)\\.([0-9]+)(.*)?" "\\2;\\3;\\4" ${name}_GIT_VERSION ${${name}_GIT_DESCRIBE})
|
||||||
|
else()
|
||||||
|
string(REGEX MATCH "^(v)?([0-9]+)\\.([0-9]+)(.*)?" git_version_valid "${${name}_GIT_DESCRIBE}")
|
||||||
|
if(git_version_valid)
|
||||||
|
string(REGEX REPLACE "^(v)?([0-9]+)\\.([0-9]+)(.*)?" "\\2;\\3;0" ${name}_GIT_VERSION ${${name}_GIT_DESCRIBE})
|
||||||
|
else()
|
||||||
|
message(AUTHOR_WARNING "Bad ${name} version \"${${name}_GIT_DESCRIBE}\"; falling back to 0.0.0 (have you made an initial release?)")
|
||||||
|
set(${name}_GIT_VERSION "0;0;0")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT ${name}_GIT_VERSION OR NOT ${name}_GIT_TIMESTAMP OR NOT ${name}_GIT_REVISION)
|
||||||
|
message(WARNING "Unable to retrive ${name} version from git.")
|
||||||
|
set(${name}_GIT_VERSION "0;0;0;0")
|
||||||
|
set(${name}_GIT_TIMESTAMP "")
|
||||||
|
set(${name}_GIT_REVISION 0)
|
||||||
|
|
||||||
|
# Try to get version from VERSION file
|
||||||
|
if(EXISTS "${version_file}")
|
||||||
|
file(STRINGS "${version_file}" ${name}_VERSION)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT ${name}_VERSION)
|
||||||
|
message(WARNING "Unable to retrive ${name} version from \"${version_file}\" file.")
|
||||||
|
set(${name}_VERSION_LIST ${${name}_GIT_VERSION})
|
||||||
|
string(REPLACE ";" "." ${name}_VERSION "${${name}_GIT_VERSION}")
|
||||||
|
else()
|
||||||
|
string(REPLACE "." ";" ${name}_VERSION_LIST ${${name}_VERSION})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
else()
|
||||||
|
list(APPEND ${name}_GIT_VERSION ${${name}_GIT_REVISION})
|
||||||
|
set(${name}_VERSION_LIST ${${name}_GIT_VERSION})
|
||||||
|
string(REPLACE ";" "." ${name}_VERSION "${${name}_GIT_VERSION}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
list(GET ${name}_VERSION_LIST 0 "${name}_VERSION_MAJOR")
|
||||||
|
list(GET ${name}_VERSION_LIST 1 "${name}_VERSION_MINOR")
|
||||||
|
list(GET ${name}_VERSION_LIST 2 "${name}_VERSION_RELEASE")
|
||||||
|
list(GET ${name}_VERSION_LIST 3 "${name}_VERSION_REVISION")
|
||||||
|
|
||||||
|
set(${name}_VERSION_MAJOR ${${name}_VERSION_MAJOR} PARENT_SCOPE)
|
||||||
|
set(${name}_VERSION_MINOR ${${name}_VERSION_MINOR} PARENT_SCOPE)
|
||||||
|
set(${name}_VERSION_RELEASE ${${name}_VERSION_RELEASE} PARENT_SCOPE)
|
||||||
|
set(${name}_VERSION_REVISION ${${name}_VERSION_REVISION} PARENT_SCOPE)
|
||||||
|
set(${name}_VERSION ${${name}_VERSION} PARENT_SCOPE)
|
||||||
|
|
||||||
|
set(${name}_GIT_DESCRIBE ${${name}_GIT_DESCRIBE} PARENT_SCOPE)
|
||||||
|
set(${name}_GIT_TIMESTAMP ${${name}_GIT_TIMESTAMP} PARENT_SCOPE)
|
||||||
|
set(${name}_GIT_TREE ${${name}_GIT_TREE} PARENT_SCOPE)
|
||||||
|
set(${name}_GIT_COMMIT ${${name}_GIT_COMMIT} PARENT_SCOPE)
|
||||||
|
set(${name}_GIT_REVISION ${${name}_GIT_REVISION} PARENT_SCOPE)
|
||||||
|
set(${name}_GIT_VERSION ${${name}_GIT_VERSION} PARENT_SCOPE)
|
||||||
|
endmacro(fetch_version)
|
||||||
|
|
||||||
|
cmake_policy(POP)
|
||||||
6
contrib/db/libmdbx/example/CMakeLists.txt
Normal file
6
contrib/db/libmdbx/example/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
set(TARGET mdbx_example)
|
||||||
|
project(${TARGET})
|
||||||
|
|
||||||
|
add_executable(${TARGET} example-mdbx.c)
|
||||||
|
|
||||||
|
target_link_libraries(${TARGET} mdbx)
|
||||||
1
contrib/db/libmdbx/example/README.md
Normal file
1
contrib/db/libmdbx/example/README.md
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
See [example-mdbx.c](example-mdbx.c) as an example of using _libmdbx_, and do a line-by-line comparison of it with the [sample-bdb.txt](sample-bdb.txt) file.
|
||||||
112
contrib/db/libmdbx/example/example-mdbx.c
Normal file
112
contrib/db/libmdbx/example/example-mdbx.c
Normal file
|
|
@ -0,0 +1,112 @@
|
||||||
|
/* MDBX usage examle
|
||||||
|
*
|
||||||
|
* Do a line-by-line comparison of this and sample-bdb.txt
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2015-2019 Leonid Yuriev <leo@yuriev.ru>.
|
||||||
|
* Copyright 2017 Ilya Shipitsin <chipitsine@gmail.com>.
|
||||||
|
* Copyright 2012-2015 Howard Chu, Symas Corp.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted only as authorized by the OpenLDAP
|
||||||
|
* Public License.
|
||||||
|
*
|
||||||
|
* A copy of this license is available in the file LICENSE in the
|
||||||
|
* top-level directory of the distribution or, alternatively, at
|
||||||
|
* <http://www.OpenLDAP.org/license.html>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mdbx.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
(void)argc;
|
||||||
|
(void)argv;
|
||||||
|
|
||||||
|
int rc;
|
||||||
|
MDBX_env *env = NULL;
|
||||||
|
MDBX_dbi dbi = 0;
|
||||||
|
MDBX_val key, data;
|
||||||
|
MDBX_txn *txn = NULL;
|
||||||
|
MDBX_cursor *cursor = NULL;
|
||||||
|
char sval[32];
|
||||||
|
|
||||||
|
rc = mdbx_env_create(&env);
|
||||||
|
if (rc != MDBX_SUCCESS) {
|
||||||
|
fprintf(stderr, "mdbx_env_create: (%d) %s\n", rc, mdbx_strerror(rc));
|
||||||
|
goto bailout;
|
||||||
|
}
|
||||||
|
rc = mdbx_env_open(env, "./example-db",
|
||||||
|
MDBX_NOSUBDIR | MDBX_COALESCE | MDBX_LIFORECLAIM, 0664);
|
||||||
|
if (rc != MDBX_SUCCESS) {
|
||||||
|
fprintf(stderr, "mdbx_env_open: (%d) %s\n", rc, mdbx_strerror(rc));
|
||||||
|
goto bailout;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = mdbx_txn_begin(env, NULL, 0, &txn);
|
||||||
|
if (rc != MDBX_SUCCESS) {
|
||||||
|
fprintf(stderr, "mdbx_txn_begin: (%d) %s\n", rc, mdbx_strerror(rc));
|
||||||
|
goto bailout;
|
||||||
|
}
|
||||||
|
rc = mdbx_dbi_open(txn, NULL, 0, &dbi);
|
||||||
|
if (rc != MDBX_SUCCESS) {
|
||||||
|
fprintf(stderr, "mdbx_dbi_open: (%d) %s\n", rc, mdbx_strerror(rc));
|
||||||
|
goto bailout;
|
||||||
|
}
|
||||||
|
|
||||||
|
key.iov_len = sizeof(int);
|
||||||
|
key.iov_base = sval;
|
||||||
|
data.iov_len = sizeof(sval);
|
||||||
|
data.iov_base = sval;
|
||||||
|
|
||||||
|
sprintf(sval, "%03x %d foo bar", 32, 3141592);
|
||||||
|
rc = mdbx_put(txn, dbi, &key, &data, 0);
|
||||||
|
if (rc != MDBX_SUCCESS) {
|
||||||
|
fprintf(stderr, "mdbx_put: (%d) %s\n", rc, mdbx_strerror(rc));
|
||||||
|
goto bailout;
|
||||||
|
}
|
||||||
|
rc = mdbx_txn_commit(txn);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_txn_commit: (%d) %s\n", rc, mdbx_strerror(rc));
|
||||||
|
goto bailout;
|
||||||
|
}
|
||||||
|
txn = NULL;
|
||||||
|
|
||||||
|
rc = mdbx_txn_begin(env, NULL, MDBX_RDONLY, &txn);
|
||||||
|
if (rc != MDBX_SUCCESS) {
|
||||||
|
fprintf(stderr, "mdbx_txn_begin: (%d) %s\n", rc, mdbx_strerror(rc));
|
||||||
|
goto bailout;
|
||||||
|
}
|
||||||
|
rc = mdbx_cursor_open(txn, dbi, &cursor);
|
||||||
|
if (rc != MDBX_SUCCESS) {
|
||||||
|
fprintf(stderr, "mdbx_cursor_open: (%d) %s\n", rc, mdbx_strerror(rc));
|
||||||
|
goto bailout;
|
||||||
|
}
|
||||||
|
|
||||||
|
int found = 0;
|
||||||
|
while ((rc = mdbx_cursor_get(cursor, &key, &data, MDBX_NEXT)) == 0) {
|
||||||
|
printf("key: %p %.*s, data: %p %.*s\n", key.iov_base, (int)key.iov_len,
|
||||||
|
(char *)key.iov_base, data.iov_base, (int)data.iov_len,
|
||||||
|
(char *)data.iov_base);
|
||||||
|
found += 1;
|
||||||
|
}
|
||||||
|
if (rc != MDBX_NOTFOUND || found == 0) {
|
||||||
|
fprintf(stderr, "mdbx_cursor_get: (%d) %s\n", rc, mdbx_strerror(rc));
|
||||||
|
goto bailout;
|
||||||
|
} else {
|
||||||
|
rc = MDBX_SUCCESS;
|
||||||
|
}
|
||||||
|
bailout:
|
||||||
|
if (cursor)
|
||||||
|
mdbx_cursor_close(cursor);
|
||||||
|
if (txn)
|
||||||
|
mdbx_txn_abort(txn);
|
||||||
|
if (dbi)
|
||||||
|
mdbx_dbi_close(env, dbi);
|
||||||
|
if (env)
|
||||||
|
mdbx_env_close(env);
|
||||||
|
return (rc != MDBX_SUCCESS) ? EXIT_FAILURE : EXIT_SUCCESS;
|
||||||
|
}
|
||||||
77
contrib/db/libmdbx/example/sample-bdb.txt
Normal file
77
contrib/db/libmdbx/example/sample-bdb.txt
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
/* BerkeleyDB toy/sample
|
||||||
|
*
|
||||||
|
* Do a line-by-line comparison of this and example-mdbx.c
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2015-2019 Leonid Yuriev <leo@yuriev.ru>.
|
||||||
|
* Copyright 2012-2015 Howard Chu, Symas Corp.
|
||||||
|
* Copyright 2015,2016 Peter-Service R&D LLC.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted only as authorized by the OpenLDAP
|
||||||
|
* Public License.
|
||||||
|
*
|
||||||
|
* A copy of this license is available in the file LICENSE in the
|
||||||
|
* top-level directory of the distribution or, alternatively, at
|
||||||
|
* <http://www.OpenLDAP.org/license.html>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <db.h>
|
||||||
|
|
||||||
|
int main(int argc,char * argv[])
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
DB_ENV *env;
|
||||||
|
DB *dbi;
|
||||||
|
DBT key, data;
|
||||||
|
DB_TXN *txn;
|
||||||
|
DBC *cursor;
|
||||||
|
char sval[32], kval[32];
|
||||||
|
|
||||||
|
/* Note: Most error checking omitted for simplicity */
|
||||||
|
|
||||||
|
#define FLAGS (DB_INIT_LOCK|DB_INIT_LOG|DB_INIT_TXN|DB_INIT_MPOOL|DB_CREATE|DB_THREAD)
|
||||||
|
rc = db_env_create(&env, 0);
|
||||||
|
rc = env->open(env, "./testdb", FLAGS, 0664);
|
||||||
|
rc = db_create(&dbi, env, 0);
|
||||||
|
rc = env->txn_begin(env, NULL, &txn, 0);
|
||||||
|
rc = dbi->open(dbi, txn, "test.bdb", NULL, DB_BTREE, DB_CREATE, 0664);
|
||||||
|
|
||||||
|
memset(&key, 0, sizeof(DBT));
|
||||||
|
memset(&data, 0, sizeof(DBT));
|
||||||
|
key.size = sizeof(int);
|
||||||
|
key.data = sval;
|
||||||
|
data.size = sizeof(sval);
|
||||||
|
data.data = sval;
|
||||||
|
|
||||||
|
sprintf(sval, "%03x %d foo bar", 32, 3141592);
|
||||||
|
rc = dbi->put(dbi, txn, &key, &data, 0);
|
||||||
|
rc = txn->commit(txn, 0);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "txn->commit: (%d) %s\n", rc, db_strerror(rc));
|
||||||
|
goto leave;
|
||||||
|
}
|
||||||
|
rc = env->txn_begin(env, NULL, &txn, 0);
|
||||||
|
rc = dbi->cursor(dbi, txn, &cursor, 0);
|
||||||
|
key.flags = DB_DBT_USERMEM;
|
||||||
|
key.data = kval;
|
||||||
|
key.ulen = sizeof(kval);
|
||||||
|
data.flags = DB_DBT_USERMEM;
|
||||||
|
data.data = sval;
|
||||||
|
data.ulen = sizeof(sval);
|
||||||
|
while ((rc = cursor->c_get(cursor, &key, &data, DB_NEXT)) == 0) {
|
||||||
|
printf("key: %p %.*s, data: %p %.*s\n",
|
||||||
|
key.data, (int) key.size, (char *) key.data,
|
||||||
|
data.data, (int) data.size, (char *) data.data);
|
||||||
|
}
|
||||||
|
rc = cursor->c_close(cursor);
|
||||||
|
rc = txn->abort(txn);
|
||||||
|
leave:
|
||||||
|
rc = dbi->close(dbi, 0);
|
||||||
|
rc = env->close(env, 0);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
3497
contrib/db/libmdbx/mdbx.h
Normal file
3497
contrib/db/libmdbx/mdbx.h
Normal file
File diff suppressed because it is too large
Load diff
184
contrib/db/libmdbx/packages/rpm/CMakeLists.txt
Normal file
184
contrib/db/libmdbx/packages/rpm/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,184 @@
|
||||||
|
cmake_minimum_required(VERSION 2.8.7)
|
||||||
|
set(TARGET mdbx)
|
||||||
|
project(${TARGET})
|
||||||
|
|
||||||
|
set(MDBX_VERSION_MAJOR 0)
|
||||||
|
set(MDBX_VERSION_MINOR 3)
|
||||||
|
set(MDBX_VERSION_RELEASE 1)
|
||||||
|
set(MDBX_VERSION_REVISION 0)
|
||||||
|
|
||||||
|
set(MDBX_VERSION_STRING ${MDBX_VERSION_MAJOR}.${MDBX_VERSION_MINOR}.${MDBX_VERSION_RELEASE})
|
||||||
|
|
||||||
|
enable_language(C)
|
||||||
|
enable_language(CXX)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 11)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED on)
|
||||||
|
|
||||||
|
add_definitions(-DNDEBUG=1 -DMDBX_DEBUG=0 -DLIBMDBX_EXPORTS=1 -D_GNU_SOURCE=1)
|
||||||
|
|
||||||
|
find_package(Threads REQUIRED)
|
||||||
|
|
||||||
|
get_directory_property(hasParent PARENT_DIRECTORY)
|
||||||
|
if(hasParent)
|
||||||
|
set(STANDALONE_BUILD 0)
|
||||||
|
else()
|
||||||
|
set(STANDALONE_BUILD 1)
|
||||||
|
enable_testing()
|
||||||
|
|
||||||
|
if (CMAKE_C_COMPILER_ID MATCHES GNU)
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wextra")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (CMAKE_CXX_COMPILER_ID MATCHES GNU)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wpointer-arith")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-sign-compare")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wformat-security")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Woverloaded-virtual")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wwrite-strings")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fmax-errors=20")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-parameter -Wunused-function -Wunused-variable -Wunused-value -Wmissing-declarations")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-missing-field-initializers")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wcast-qual")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ggdb")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-strict-aliasing")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -finline-functions-called-once")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-packed-bitfield-compat")
|
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3")
|
||||||
|
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -g3")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (COVERAGE)
|
||||||
|
if (NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
|
||||||
|
message(FATAL_ERROR "Coverage requires -DCMAKE_BUILD_TYPE=Debug Current value=${CMAKE_BUILD_TYPE}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
message(STATUS "Setting coverage compiler flags")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -ggdb3 -O0 --coverage -fprofile-arcs -ftest-coverage")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -ggdb3 -O0 --coverage -fprofile-arcs -ftest-coverage")
|
||||||
|
add_definitions(-DCOVERAGE_TEST)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT TRAVIS)
|
||||||
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=address -fsanitize=leak -fstack-protector-strong -static-libasan")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(${TARGET}_SRC
|
||||||
|
mdbx.h
|
||||||
|
src/bits.h
|
||||||
|
src/defs.h
|
||||||
|
src/lck-linux.c
|
||||||
|
src/mdbx.c
|
||||||
|
src/osal.c
|
||||||
|
src/osal.h
|
||||||
|
src/version.c
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(${TARGET}_STATIC STATIC
|
||||||
|
${${TARGET}_SRC}
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(${TARGET} ALIAS ${TARGET}_STATIC)
|
||||||
|
|
||||||
|
add_library(${TARGET}_SHARED SHARED
|
||||||
|
${${TARGET}_SRC}
|
||||||
|
)
|
||||||
|
|
||||||
|
set_target_properties(${TARGET}_SHARED PROPERTIES
|
||||||
|
VERSION ${MDBX_VERSION_STRING}
|
||||||
|
SOVERSION ${MDBX_VERSION_MAJOR}.${MDBX_VERSION_MINOR}
|
||||||
|
OUTPUT_NAME ${TARGET}
|
||||||
|
CLEAN_DIRECT_OUTPUT 1
|
||||||
|
)
|
||||||
|
|
||||||
|
set_target_properties(${TARGET}_STATIC PROPERTIES
|
||||||
|
VERSION ${MDBX_VERSION_STRING}
|
||||||
|
SOVERSION ${MDBX_VERSION_MAJOR}.${MDBX_VERSION_MINOR}
|
||||||
|
OUTPUT_NAME ${TARGET}
|
||||||
|
CLEAN_DIRECT_OUTPUT 1
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(${TARGET}_STATIC PUBLIC
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
target_include_directories(${TARGET}_SHARED PUBLIC
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
|
||||||
|
target_link_libraries(${TARGET}_STATIC ${CMAKE_THREAD_LIBS_INIT})
|
||||||
|
target_link_libraries(${TARGET}_SHARED ${CMAKE_THREAD_LIBS_INIT})
|
||||||
|
if(UNIX AND NOT APPLE)
|
||||||
|
target_link_libraries(${TARGET}_STATIC rt)
|
||||||
|
target_link_libraries(${TARGET}_SHARED rt)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#install(TARGETS ${TARGET}_STATIC DESTINATION ${CMAKE_INSTALL_PREFIX}/lib64 COMPONENT mdbx)
|
||||||
|
#install(TARGETS ${TARGET}_SHARED DESTINATION ${CMAKE_INSTALL_PREFIX}/lib64 COMPONENT mdbx)
|
||||||
|
#install(FILES mdbx.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include COMPONENT mdbx-devel)
|
||||||
|
|
||||||
|
add_subdirectory(src/tools)
|
||||||
|
add_subdirectory(test)
|
||||||
|
add_subdirectory(test/pcrf)
|
||||||
|
add_subdirectory(tutorial)
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
set(CPACK_GENERATOR "RPM")
|
||||||
|
set(CPACK_RPM_COMPONENT_INSTALL ON)
|
||||||
|
|
||||||
|
# Version
|
||||||
|
if (NOT "$ENV{BUILD_NUMBER}" STREQUAL "")
|
||||||
|
set(CPACK_PACKAGE_RELEASE $ENV{BUILD_NUMBER})
|
||||||
|
else()
|
||||||
|
if (NOT "$ENV{CI_PIPELINE_ID}" STREQUAL "")
|
||||||
|
set(CPACK_PACKAGE_RELEASE $ENV{CI_PIPELINE_ID})
|
||||||
|
else()
|
||||||
|
set(CPACK_PACKAGE_RELEASE 1)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
set(CPACK_RPM_PACKAGE_RELEASE ${CPACK_PACKAGE_RELEASE})
|
||||||
|
|
||||||
|
set(CPACK_PACKAGE_VERSION ${MDBX_VERSION_STRING})
|
||||||
|
set(CPACK_PACKAGE_VERSION_FULL ${CPACK_PACKAGE_VERSION}-${CPACK_PACKAGE_RELEASE})
|
||||||
|
|
||||||
|
set(CPACK_RPM_mdbx-devel_PACKAGE_REQUIRES "mdbx = ${CPACK_PACKAGE_VERSION}")
|
||||||
|
|
||||||
|
set(CPACK_RPM_SPEC_INSTALL_POST "/bin/true")
|
||||||
|
set(CPACK_RPM_mdbx_PACKAGE_NAME mdbx)
|
||||||
|
set(CPACK_RPM_mdbx-devel_PACKAGE_NAME mdbx-devel)
|
||||||
|
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "The revised and extended descendant of Symas LMDB")
|
||||||
|
|
||||||
|
set(CPACK_PACKAGE_VENDOR "???")
|
||||||
|
set(CPACK_PACKAGE_CONTACT "Vladimir Romanov")
|
||||||
|
set(CPACK_PACKAGE_RELOCATABLE false)
|
||||||
|
set(CPACK_RPM_PACKAGE_ARCHITECTURE "x86_64")
|
||||||
|
set(CPACK_RPM_PACKAGE_REQUIRES "")
|
||||||
|
set(CPACK_RPM_PACKAGE_GROUP "Applications/Database")
|
||||||
|
|
||||||
|
set(CPACK_RPM_mdbx_FILE_NAME "${CPACK_RPM_mdbx_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION_FULL}.${CPACK_RPM_PACKAGE_ARCHITECTURE}.rpm")
|
||||||
|
set(CPACK_RPM_mdbx-devel_FILE_NAME "${CPACK_RPM_mdbx-devel_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION_FULL}.${CPACK_RPM_PACKAGE_ARCHITECTURE}.rpm")
|
||||||
|
|
||||||
|
set(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION
|
||||||
|
/usr/local
|
||||||
|
/usr/local/bin
|
||||||
|
/usr/local/lib64
|
||||||
|
/usr/local/include
|
||||||
|
/usr/local/man
|
||||||
|
/usr/local/man/man1
|
||||||
|
)
|
||||||
|
|
||||||
|
include(CPack)
|
||||||
18
contrib/db/libmdbx/packages/rpm/build.sh
Normal file
18
contrib/db/libmdbx/packages/rpm/build.sh
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
CONFIG=$1
|
||||||
|
|
||||||
|
if [[ -z "${CONFIG}" ]]; then
|
||||||
|
CONFIG=Debug
|
||||||
|
fi
|
||||||
|
if [[ -r /opt/rh/devtoolset-6/enable ]]; then
|
||||||
|
source /opt/rh/devtoolset-6/enable
|
||||||
|
fi
|
||||||
|
#rm -f -r build || true
|
||||||
|
mkdir -p cmake-build-${CONFIG}
|
||||||
|
pushd cmake-build-${CONFIG} &> /dev/null
|
||||||
|
if [[ ! -r Makefile ]]; then
|
||||||
|
cmake .. -DCMAKE_BUILD_TYPE=${CONFIG}
|
||||||
|
fi
|
||||||
|
make -j8 || exit 1
|
||||||
|
popd &> /dev/null
|
||||||
25
contrib/db/libmdbx/packages/rpm/package.sh
Normal file
25
contrib/db/libmdbx/packages/rpm/package.sh
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
CONFIG=$1
|
||||||
|
|
||||||
|
if [[ -z "${CONFIG}" ]]; then
|
||||||
|
CONFIG=Debug
|
||||||
|
fi
|
||||||
|
|
||||||
|
DIRNAME=`dirname ${BASH_SOURCE[0]}`
|
||||||
|
DIRNAME=`readlink --canonicalize ${DIRNAME}`
|
||||||
|
|
||||||
|
if [[ -r /opt/rh/devtoolset-6/enable ]]; then
|
||||||
|
source /opt/rh/devtoolset-6/enable
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p cmake-build-${CONFIG}
|
||||||
|
pushd cmake-build-${CONFIG} &> /dev/null
|
||||||
|
if [[ ! -r Makefile ]]; then
|
||||||
|
cmake .. -DCMAKE_BUILD_TYPE=${CONFIG}
|
||||||
|
fi
|
||||||
|
rm -f *.rpm
|
||||||
|
make -j8 package || exit 1
|
||||||
|
rm -f *-Unspecified.rpm
|
||||||
|
popd &> /dev/null
|
||||||
170
contrib/db/libmdbx/src/CMakeLists.txt
Normal file
170
contrib/db/libmdbx/src/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,170 @@
|
||||||
|
##
|
||||||
|
## Copyright 2019 Leonid Yuriev <leo@yuriev.ru>
|
||||||
|
## and other libmdbx authors: please see AUTHORS file.
|
||||||
|
## All rights reserved.
|
||||||
|
##
|
||||||
|
## Redistribution and use in source and binary forms, with or without
|
||||||
|
## modification, are permitted only as authorized by the OpenLDAP
|
||||||
|
## Public License.
|
||||||
|
##
|
||||||
|
## A copy of this license is available in the file LICENSE in the
|
||||||
|
## top-level directory of the distribution or, alternatively, at
|
||||||
|
## <http://www.OpenLDAP.org/license.html>.
|
||||||
|
##
|
||||||
|
|
||||||
|
# Get version
|
||||||
|
fetch_version(MDBX "${CMAKE_CURRENT_SOURCE_DIR}/../VERSION")
|
||||||
|
message(STATUS "libmdbx version is ${MDBX_VERSION}")
|
||||||
|
|
||||||
|
if(MDBX_ALLOY_MODE)
|
||||||
|
set(LIBMDBX_SOURCES alloy.c)
|
||||||
|
else()
|
||||||
|
if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
|
||||||
|
set(LIBMDBX_OSAL windows)
|
||||||
|
else()
|
||||||
|
set(LIBMDBX_OSAL posix)
|
||||||
|
endif()
|
||||||
|
set(LIBMDBX_SOURCES
|
||||||
|
elements/defs.h elements/internals.h elements/osal.h
|
||||||
|
elements/core.c elements/osal.c elements/lck-${LIBMDBX_OSAL}.c)
|
||||||
|
endif()
|
||||||
|
list(APPEND LIBMDBX_SOURCES ../mdbx.h
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/elements/version.c"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/elements/config.h")
|
||||||
|
|
||||||
|
if(MDBX_BUILD_SHARED_LIBRARY)
|
||||||
|
add_library(mdbx SHARED ${LIBMDBX_SOURCES})
|
||||||
|
target_compile_definitions(mdbx PRIVATE LIBMDBX_EXPORTS INTERFACE LIBMDBX_IMPORTS)
|
||||||
|
set(MDBX_LIBDEP_MODE PRIVATE)
|
||||||
|
else()
|
||||||
|
add_library(mdbx STATIC ${LIBMDBX_SOURCES})
|
||||||
|
set(MDBX_LIBDEP_MODE PUBLIC)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CC_HAS_VISIBILITY AND (LTO_ENABLED OR INTERPROCEDURAL_OPTIMIZATION))
|
||||||
|
set_target_properties(mdbx PROPERTIES LINK_FLAGS "-fvisibility=hidden")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
set_target_properties(mdbx PROPERTIES
|
||||||
|
INTERPROCEDURAL_OPTIMIZATION $<BOOL:${INTERPROCEDURAL_OPTIMIZATION}>
|
||||||
|
C_STANDARD ${MDBX_C_STANDARD} C_STANDARD_REQUIRED ON
|
||||||
|
PUBLIC_HEADER "../mdbx.h")
|
||||||
|
|
||||||
|
if(CC_HAS_FASTMATH)
|
||||||
|
target_compile_options(mdbx PRIVATE "-ffast-math")
|
||||||
|
endif()
|
||||||
|
if(BUILD_FOR_NATIVE_CPU AND CC_HAS_ARCH_NATIVE)
|
||||||
|
target_compile_options(mdbx PUBLIC "-march=native")
|
||||||
|
endif()
|
||||||
|
if(CC_HAS_VISIBILITY)
|
||||||
|
target_compile_options(mdbx PRIVATE "-fvisibility=hidden")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#install(TARGETS mdbx
|
||||||
|
# LIBRARY DESTINATION lib COMPONENT runtime
|
||||||
|
# RUNTIME DESTINATION bin COMPONENT runtime
|
||||||
|
# ARCHIVE DESTINATION lib/static COMPONENT devel
|
||||||
|
# PUBLIC_HEADER DESTINATION include
|
||||||
|
# INCLUDES DESTINATION include COMPONENT devel)
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
#
|
||||||
|
# library build info (used in library version output)
|
||||||
|
#
|
||||||
|
set(MDBX_BUILD_FLAGS "")
|
||||||
|
|
||||||
|
# append cmake's build-type flags and defines
|
||||||
|
if(NOT CMAKE_CONFIGURATION_TYPES)
|
||||||
|
list(APPEND MDBX_BUILD_FLAGS ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UPPERCASE}})
|
||||||
|
list(APPEND MDBX_BUILD_FLAGS ${CMAKE_C_DEFINES_${CMAKE_BUILD_TYPE_UPPERCASE}})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# append linker dll's options
|
||||||
|
if(LIBMDBX_TYPE STREQUAL "SHARED")
|
||||||
|
list(APPEND MDBX_BUILD_FLAGS ${CMAKE_SHARED_LINKER_FLAGS})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# get definitions
|
||||||
|
get_target_property(defs_list mdbx COMPILE_DEFINITIONS)
|
||||||
|
if(defs_list)
|
||||||
|
list(APPEND MDBX_BUILD_FLAGS ${defs_list})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# get target compile options
|
||||||
|
get_target_property(options_list mdbx COMPILE_OPTIONS)
|
||||||
|
if(options_list)
|
||||||
|
list(APPEND MDBX_BUILD_FLAGS ${options_list})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
list(REMOVE_DUPLICATES MDBX_BUILD_FLAGS)
|
||||||
|
string(REPLACE ";" " " MDBX_BUILD_FLAGS "${MDBX_BUILD_FLAGS}")
|
||||||
|
if(CMAKE_CONFIGURATION_TYPES)
|
||||||
|
# add dynamic part via per-configuration define
|
||||||
|
message(STATUS "MDBX Compile Flags: ${MDBX_BUILD_FLAGS} <AND CONFIGURATION DEPENDENT>")
|
||||||
|
add_definitions(-DMDBX_BUILD_FLAGS_CONFIG="$<$<CONFIG:Debug>:${CMAKE_C_FLAGS_DEBUG} ${CMAKE_C_DEFINES_DEBUG}>$<$<CONFIG:Release>:${CMAKE_C_FLAGS_RELEASE} ${CMAKE_C_DEFINES_RELEASE}>$<$<CONFIG:RelWithDebInfo>:${CMAKE_C_FLAGS_RELWITHDEBINFO} ${CMAKE_C_DEFINES_RELWITHDEBINFO}>$<$<CONFIG:MinSizeRel>:${CMAKE_C_FLAGS_MINSIZEREL} ${CMAKE_C_DEFINES_MINSIZEREL}>")
|
||||||
|
else()
|
||||||
|
message(STATUS "MDBX Compile Flags: ${MDBX_BUILD_FLAGS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# get compiler info
|
||||||
|
execute_process(COMMAND sh -c "${CMAKE_C_COMPILER} --version | head -1"
|
||||||
|
OUTPUT_VARIABLE MDBX_BUILD_COMPILER
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
ERROR_QUIET
|
||||||
|
RESULT_VARIABLE rc)
|
||||||
|
if(rc OR NOT MDBX_BUILD_COMPILER)
|
||||||
|
string(STRIP "${CMAKE_C_COMPILER_ID}-${CMAKE_C_COMPILER_VERSION}" MDBX_BUILD_COMPILER)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# make a build-target triplet
|
||||||
|
if(CMAKE_C_COMPILER_TARGET)
|
||||||
|
set(MDBX_BUILD_TARGET "${CMAKE_C_COMPILER_TARGET}")
|
||||||
|
elseif(CMAKE_C_PLATFORM_ID AND NOT CMAKE_C_PLATFORM_ID STREQUAL CMAKE_SYSTEM_NAME)
|
||||||
|
string(STRIP "${CMAKE_C_PLATFORM_ID}-${CMAKE_SYSTEM_NAME}" MDBX_BUILD_TARGET)
|
||||||
|
elseif(CMAKE_LIBRARY_ARCHITECTURE)
|
||||||
|
string(STRIP "${CMAKE_LIBRARY_ARCHITECTURE}-${CMAKE_SYSTEM_NAME}" MDBX_BUILD_TARGET)
|
||||||
|
elseif(CMAKE_GENERATOR_PLATFORM AND NOT CMAKE_C_PLATFORM_ID STREQUAL CMAKE_SYSTEM_NAME)
|
||||||
|
string(STRIP "${CMAKE_GENERATOR_PLATFORM}-${CMAKE_SYSTEM_NAME}" MDBX_BUILD_TARGET)
|
||||||
|
elseif(CMAKE_SYSTEM_ARCH)
|
||||||
|
string(STRIP "${CMAKE_SYSTEM_ARCH}-${CMAKE_SYSTEM_NAME}" MDBX_BUILD_TARGET)
|
||||||
|
else()
|
||||||
|
string(STRIP "${CMAKE_SYSTEM_PROCESSOR}-${CMAKE_SYSTEM_NAME}" MDBX_BUILD_TARGET)
|
||||||
|
endif()
|
||||||
|
if(CMAKE_CONFIGURATION_TYPES)
|
||||||
|
add_definitions(-DMDBX_BUILD_CONFIG="$<CONFIG>")
|
||||||
|
else()
|
||||||
|
set(MDBX_BUILD_CONFIG ${CMAKE_BUILD_TYPE})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# options
|
||||||
|
string(TIMESTAMP MDBX_BUILD_TIMESTAMP UTC)
|
||||||
|
set(options VERSION C_COMPILER CXX_COMPILER)
|
||||||
|
foreach(item IN LISTS options)
|
||||||
|
if(DEFINED ${item})
|
||||||
|
set(value "${${item}}")
|
||||||
|
elseif(DEFINED MDBX_${item})
|
||||||
|
set(item MDBX_${item})
|
||||||
|
set(value "${${item}}")
|
||||||
|
elseif(DEFINED CMAKE_${item})
|
||||||
|
set(item CMAKE_${item})
|
||||||
|
set(value "${${item}}")
|
||||||
|
else()
|
||||||
|
set(value "undefined")
|
||||||
|
endif()
|
||||||
|
message(STATUS "${item}: ${value}")
|
||||||
|
endforeach(item)
|
||||||
|
|
||||||
|
# generate version and config files
|
||||||
|
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/elements/version.c.in"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/elements/version.c" ESCAPE_QUOTES)
|
||||||
|
|
||||||
|
file(SHA256 "${CMAKE_CURRENT_SOURCE_DIR}/elements/version.c" MDBX_SOURCERY_DIGEST)
|
||||||
|
string(MAKE_C_IDENTIFIER "${MDBX_GIT_DESCRIBE}" MDBX_SOURCERY_SUFFIX)
|
||||||
|
set(MDBX_BUILD_SOURCERY "${MDBX_SOURCERY_DIGEST}_${MDBX_SOURCERY_SUFFIX}")
|
||||||
|
|
||||||
|
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/elements/config.h.in"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/elements/config.h" ESCAPE_QUOTES)
|
||||||
|
add_definitions(-DMDBX_CONFIG_H="config.h")
|
||||||
|
|
||||||
|
add_subdirectory(tools)
|
||||||
26
contrib/db/libmdbx/src/alloy.c
Normal file
26
contrib/db/libmdbx/src/alloy.c
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015-2019 Leonid Yuriev <leo@yuriev.ru>
|
||||||
|
* and other libmdbx authors: please see AUTHORS file.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted only as authorized by the OpenLDAP
|
||||||
|
* Public License.
|
||||||
|
*
|
||||||
|
* A copy of this license is available in the file LICENSE in the
|
||||||
|
* top-level directory of the distribution or, alternatively, at
|
||||||
|
* <http://www.OpenLDAP.org/license.html>. */
|
||||||
|
|
||||||
|
/* Amalgamated build */
|
||||||
|
#define MDBX_ALLOY 1
|
||||||
|
#include "elements/internals.h" /* must be included fisrt */
|
||||||
|
|
||||||
|
#include "elements/core.c"
|
||||||
|
#include "elements/osal.c"
|
||||||
|
#include "elements/version.c"
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
#include "elements/lck-windows.c"
|
||||||
|
#else
|
||||||
|
#include "elements/lck-posix.c"
|
||||||
|
#endif
|
||||||
56
contrib/db/libmdbx/src/elements/config.h.in
Normal file
56
contrib/db/libmdbx/src/elements/config.h.in
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
/* This is CMake-template for libmdbx's config.h
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
|
/* clang-format off */
|
||||||
|
|
||||||
|
#cmakedefine HAVE_VALGRIND_MEMCHECK_H
|
||||||
|
#cmakedefine HAS_RELAXED_CONSTEXPR
|
||||||
|
|
||||||
|
#cmakedefine LTO_ENABLED
|
||||||
|
#cmakedefine MDBX_USE_VALGRIND
|
||||||
|
#cmakedefine ENABLE_GPROF
|
||||||
|
#cmakedefine ENABLE_GCOV
|
||||||
|
#cmakedefine ENABLE_ASAN
|
||||||
|
|
||||||
|
/* Common */
|
||||||
|
#cmakedefine01 MDBX_TXN_CHECKPID
|
||||||
|
#cmakedefine01 MDBX_TXN_CHECKOWNER
|
||||||
|
#cmakedefine01 MDBX_BUILD_SHARED_LIBRARY
|
||||||
|
|
||||||
|
/* Windows */
|
||||||
|
#cmakedefine01 MDBX_CONFIG_MANUAL_TLS_CALLBACK
|
||||||
|
#cmakedefine01 MDBX_AVOID_CRT
|
||||||
|
|
||||||
|
/* MacOS */
|
||||||
|
#cmakedefine01 MDBX_OSX_SPEED_INSTEADOF_DURABILITY
|
||||||
|
|
||||||
|
/* POSIX */
|
||||||
|
#cmakedefine01 MDBX_USE_ROBUST
|
||||||
|
#cmakedefine01 MDBX_USE_OFDLOCKS
|
||||||
|
#cmakedefine01 MDBX_DISABLE_GNU_SOURCE
|
||||||
|
|
||||||
|
/* Simulate "AUTO" values of tristate options */
|
||||||
|
#cmakedefine MDBX_TXN_CHECKPID_AUTO
|
||||||
|
#ifdef MDBX_TXN_CHECKPID_AUTO
|
||||||
|
#undef MDBX_TXN_CHECKPID
|
||||||
|
#endif
|
||||||
|
#cmakedefine MDBX_USE_ROBUST_AUTO
|
||||||
|
#ifdef MDBX_USE_ROBUST_AUTO
|
||||||
|
#undef MDBX_USE_ROBUST
|
||||||
|
#endif
|
||||||
|
#cmakedefine MDBX_USE_OFDLOCKS_AUTO
|
||||||
|
#ifdef MDBX_USE_OFDLOCKS_AUTO
|
||||||
|
#undef MDBX_USE_OFDLOCKS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Build Info */
|
||||||
|
#cmakedefine MDBX_BUILD_TIMESTAMP "@MDBX_BUILD_TIMESTAMP@"
|
||||||
|
#cmakedefine MDBX_BUILD_TARGET "@MDBX_BUILD_TARGET@"
|
||||||
|
#cmakedefine MDBX_BUILD_CONFIG "@MDBX_BUILD_CONFIG@"
|
||||||
|
#cmakedefine MDBX_BUILD_COMPILER "@MDBX_BUILD_COMPILER@"
|
||||||
|
#cmakedefine MDBX_BUILD_FLAGS "@MDBX_BUILD_FLAGS@"
|
||||||
|
#cmakedefine MDBX_BUILD_SOURCERY @MDBX_BUILD_SOURCERY@
|
||||||
|
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
/* clang-format on */
|
||||||
16709
contrib/db/libmdbx/src/elements/core.c
Normal file
16709
contrib/db/libmdbx/src/elements/core.c
Normal file
File diff suppressed because it is too large
Load diff
450
contrib/db/libmdbx/src/elements/defs.h
Normal file
450
contrib/db/libmdbx/src/elements/defs.h
Normal file
|
|
@ -0,0 +1,450 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015-2019 Leonid Yuriev <leo@yuriev.ru>
|
||||||
|
* and other libmdbx authors: please see AUTHORS file.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted only as authorized by the OpenLDAP
|
||||||
|
* Public License.
|
||||||
|
*
|
||||||
|
* A copy of this license is available in the file LICENSE in the
|
||||||
|
* top-level directory of the distribution or, alternatively, at
|
||||||
|
* <http://www.OpenLDAP.org/license.html>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
/* *INDENT-OFF* */
|
||||||
|
/* clang-format off */
|
||||||
|
|
||||||
|
#ifndef __GNUC_PREREQ
|
||||||
|
# if defined(__GNUC__) && defined(__GNUC_MINOR__)
|
||||||
|
# define __GNUC_PREREQ(maj, min) \
|
||||||
|
((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
|
||||||
|
# else
|
||||||
|
# define __GNUC_PREREQ(maj, min) (0)
|
||||||
|
# endif
|
||||||
|
#endif /* __GNUC_PREREQ */
|
||||||
|
|
||||||
|
#ifndef __CLANG_PREREQ
|
||||||
|
# ifdef __clang__
|
||||||
|
# define __CLANG_PREREQ(maj,min) \
|
||||||
|
((__clang_major__ << 16) + __clang_minor__ >= ((maj) << 16) + (min))
|
||||||
|
# else
|
||||||
|
# define __CLANG_PREREQ(maj,min) (0)
|
||||||
|
# endif
|
||||||
|
#endif /* __CLANG_PREREQ */
|
||||||
|
|
||||||
|
#ifndef __GLIBC_PREREQ
|
||||||
|
# if defined(__GLIBC__) && defined(__GLIBC_MINOR__)
|
||||||
|
# define __GLIBC_PREREQ(maj, min) \
|
||||||
|
((__GLIBC__ << 16) + __GLIBC_MINOR__ >= ((maj) << 16) + (min))
|
||||||
|
# else
|
||||||
|
# define __GLIBC_PREREQ(maj, min) (0)
|
||||||
|
# endif
|
||||||
|
#endif /* __GLIBC_PREREQ */
|
||||||
|
|
||||||
|
#ifndef __has_attribute
|
||||||
|
# define __has_attribute(x) (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __has_feature
|
||||||
|
# define __has_feature(x) (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __has_extension
|
||||||
|
# define __has_extension(x) (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __has_builtin
|
||||||
|
# define __has_builtin(x) (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __has_warning
|
||||||
|
# define __has_warning(x) (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __has_include
|
||||||
|
# define __has_include(x) (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __has_feature(thread_sanitizer)
|
||||||
|
# define __SANITIZE_THREAD__ 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __has_feature(address_sanitizer)
|
||||||
|
# define __SANITIZE_ADDRESS__ 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __extern_C
|
||||||
|
# ifdef __cplusplus
|
||||||
|
# define __extern_C extern "C"
|
||||||
|
# else
|
||||||
|
# define __extern_C
|
||||||
|
# endif
|
||||||
|
#endif /* __extern_C */
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
# ifndef bool
|
||||||
|
# define bool _Bool
|
||||||
|
# endif
|
||||||
|
# ifndef true
|
||||||
|
# define true (1)
|
||||||
|
# endif
|
||||||
|
# ifndef false
|
||||||
|
# define false (0)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(nullptr) && !defined(__cplusplus) || (__cplusplus < 201103L && !defined(_MSC_VER))
|
||||||
|
# define nullptr NULL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __always_inline
|
||||||
|
# if defined(__GNUC__) || __has_attribute(__always_inline__)
|
||||||
|
# define __always_inline __inline __attribute__((__always_inline__))
|
||||||
|
# elif defined(_MSC_VER)
|
||||||
|
# define __always_inline __forceinline
|
||||||
|
# else
|
||||||
|
# define __always_inline
|
||||||
|
# endif
|
||||||
|
#endif /* __always_inline */
|
||||||
|
|
||||||
|
#ifndef __noinline
|
||||||
|
# if defined(__GNUC__) || __has_attribute(__noinline__)
|
||||||
|
# define __noinline __attribute__((__noinline__))
|
||||||
|
# elif defined(_MSC_VER)
|
||||||
|
# define __noinline __declspec(noinline)
|
||||||
|
# elif defined(__SUNPRO_C) || defined(__sun) || defined(sun)
|
||||||
|
# define __noinline inline
|
||||||
|
# elif !defined(__INTEL_COMPILER)
|
||||||
|
# define __noinline /* FIXME ? */
|
||||||
|
# endif
|
||||||
|
#endif /* __noinline */
|
||||||
|
|
||||||
|
#ifndef __must_check_result
|
||||||
|
# if defined(__GNUC__) || __has_attribute(__warn_unused_result__)
|
||||||
|
# define __must_check_result __attribute__((__warn_unused_result__))
|
||||||
|
# else
|
||||||
|
# define __must_check_result
|
||||||
|
# endif
|
||||||
|
#endif /* __must_check_result */
|
||||||
|
|
||||||
|
#ifndef __maybe_unused
|
||||||
|
# if defined(__GNUC__) || __has_attribute(__unused__)
|
||||||
|
# define __maybe_unused __attribute__((__unused__))
|
||||||
|
# else
|
||||||
|
# define __maybe_unused
|
||||||
|
# endif
|
||||||
|
#endif /* __maybe_unused */
|
||||||
|
|
||||||
|
#ifndef __deprecated
|
||||||
|
# if defined(__GNUC__) || __has_attribute(__deprecated__)
|
||||||
|
# define __deprecated __attribute__((__deprecated__))
|
||||||
|
# elif defined(_MSC_VER)
|
||||||
|
# define __deprecated __declspec(deprecated)
|
||||||
|
# else
|
||||||
|
# define __deprecated
|
||||||
|
# endif
|
||||||
|
#endif /* __deprecated */
|
||||||
|
|
||||||
|
#if !defined(__noop) && !defined(_MSC_VER)
|
||||||
|
# define __noop(...) do {} while(0)
|
||||||
|
#endif /* __noop */
|
||||||
|
|
||||||
|
#ifndef __fallthrough
|
||||||
|
# if __GNUC_PREREQ(7, 0) || __has_attribute(__fallthrough__)
|
||||||
|
# define __fallthrough __attribute__((__fallthrough__))
|
||||||
|
# else
|
||||||
|
# define __fallthrough __noop()
|
||||||
|
# endif
|
||||||
|
#endif /* __fallthrough */
|
||||||
|
|
||||||
|
#ifndef __unreachable
|
||||||
|
# if __GNUC_PREREQ(4,5)
|
||||||
|
# define __unreachable() __builtin_unreachable()
|
||||||
|
# elif defined(_MSC_VER)
|
||||||
|
# define __unreachable() __assume(0)
|
||||||
|
# else
|
||||||
|
# define __unreachable() __noop()
|
||||||
|
# endif
|
||||||
|
#endif /* __unreachable */
|
||||||
|
|
||||||
|
#ifndef __prefetch
|
||||||
|
# if defined(__GNUC__) || defined(__clang__)
|
||||||
|
# define __prefetch(ptr) __builtin_prefetch(ptr)
|
||||||
|
# else
|
||||||
|
# define __prefetch(ptr) __noop(ptr)
|
||||||
|
# endif
|
||||||
|
#endif /* __prefetch */
|
||||||
|
|
||||||
|
#ifndef __noreturn
|
||||||
|
# if defined(__GNUC__) || __has_attribute(__noreturn__)
|
||||||
|
# define __noreturn __attribute__((__noreturn__))
|
||||||
|
# elif defined(_MSC_VER)
|
||||||
|
# define __noreturn __declspec(noreturn)
|
||||||
|
# else
|
||||||
|
# define __noreturn
|
||||||
|
# endif
|
||||||
|
#endif /* __noreturn */
|
||||||
|
|
||||||
|
#ifndef __nothrow
|
||||||
|
# if defined(__cplusplus)
|
||||||
|
# if __cplusplus < 201703L
|
||||||
|
# define __nothrow throw()
|
||||||
|
# else
|
||||||
|
# define __nothrow noexcept(true)
|
||||||
|
# endif /* __cplusplus */
|
||||||
|
# elif defined(__GNUC__) || __has_attribute(__nothrow__)
|
||||||
|
# define __nothrow __attribute__((__nothrow__))
|
||||||
|
# elif defined(_MSC_VER) && defined(__cplusplus)
|
||||||
|
# define __nothrow __declspec(nothrow)
|
||||||
|
# else
|
||||||
|
# define __nothrow
|
||||||
|
# endif
|
||||||
|
#endif /* __nothrow */
|
||||||
|
|
||||||
|
#ifndef __pure_function
|
||||||
|
/* Many functions have no effects except the return value and their
|
||||||
|
* return value depends only on the parameters and/or global variables.
|
||||||
|
* Such a function can be subject to common subexpression elimination
|
||||||
|
* and loop optimization just as an arithmetic operator would be.
|
||||||
|
* These functions should be declared with the attribute pure. */
|
||||||
|
# if defined(__GNUC__) || __has_attribute(__pure__)
|
||||||
|
# define __pure_function __attribute__((__pure__))
|
||||||
|
# else
|
||||||
|
# define __pure_function
|
||||||
|
# endif
|
||||||
|
#endif /* __pure_function */
|
||||||
|
|
||||||
|
#ifndef __const_function
|
||||||
|
/* Many functions do not examine any values except their arguments,
|
||||||
|
* and have no effects except the return value. Basically this is just
|
||||||
|
* slightly more strict class than the PURE attribute, since function
|
||||||
|
* is not allowed to read global memory.
|
||||||
|
*
|
||||||
|
* Note that a function that has pointer arguments and examines the
|
||||||
|
* data pointed to must not be declared const. Likewise, a function
|
||||||
|
* that calls a non-const function usually must not be const.
|
||||||
|
* It does not make sense for a const function to return void. */
|
||||||
|
# if defined(__GNUC__) || __has_attribute(__const__)
|
||||||
|
# define __const_function __attribute__((__const__))
|
||||||
|
# else
|
||||||
|
# define __const_function
|
||||||
|
# endif
|
||||||
|
#endif /* __const_function */
|
||||||
|
|
||||||
|
#ifndef __hidden
|
||||||
|
# if defined(__GNUC__) || __has_attribute(__visibility__)
|
||||||
|
# define __hidden __attribute__((__visibility__("hidden")))
|
||||||
|
# else
|
||||||
|
# define __hidden
|
||||||
|
# endif
|
||||||
|
#endif /* __hidden */
|
||||||
|
|
||||||
|
#ifndef __optimize
|
||||||
|
# if defined(__OPTIMIZE__)
|
||||||
|
# if defined(__clang__) && !__has_attribute(__optimize__)
|
||||||
|
# define __optimize(ops)
|
||||||
|
# elif defined(__GNUC__) || __has_attribute(__optimize__)
|
||||||
|
# define __optimize(ops) __attribute__((__optimize__(ops)))
|
||||||
|
# else
|
||||||
|
# define __optimize(ops)
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
# define __optimize(ops)
|
||||||
|
# endif
|
||||||
|
#endif /* __optimize */
|
||||||
|
|
||||||
|
#ifndef __hot
|
||||||
|
# if defined(__OPTIMIZE__)
|
||||||
|
# if defined(__e2k__)
|
||||||
|
# define __hot __attribute__((__hot__)) __optimize(3)
|
||||||
|
# elif defined(__clang__) && !__has_attribute(__hot_) \
|
||||||
|
&& __has_attribute(__section__) && (defined(__linux__) || defined(__gnu_linux__))
|
||||||
|
/* just put frequently used functions in separate section */
|
||||||
|
# define __hot __attribute__((__section__("text.hot"))) __optimize("O3")
|
||||||
|
# elif defined(__GNUC__) || __has_attribute(__hot__)
|
||||||
|
# define __hot __attribute__((__hot__)) __optimize("O3")
|
||||||
|
# else
|
||||||
|
# define __hot __optimize("O3")
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
# define __hot
|
||||||
|
# endif
|
||||||
|
#endif /* __hot */
|
||||||
|
|
||||||
|
#ifndef __cold
|
||||||
|
# if defined(__OPTIMIZE__)
|
||||||
|
# if defined(__e2k__)
|
||||||
|
# define __cold __attribute__((__cold__)) __optimize(1)
|
||||||
|
# elif defined(__clang__) && !__has_attribute(cold) \
|
||||||
|
&& __has_attribute(__section__) && (defined(__linux__) || defined(__gnu_linux__))
|
||||||
|
/* just put infrequently used functions in separate section */
|
||||||
|
# define __cold __attribute__((__section__("text.unlikely"))) __optimize("Os")
|
||||||
|
# elif defined(__GNUC__) || __has_attribute(cold)
|
||||||
|
# define __cold __attribute__((__cold__)) __optimize("Os")
|
||||||
|
# else
|
||||||
|
# define __cold __optimize("Os")
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
# define __cold
|
||||||
|
# endif
|
||||||
|
#endif /* __cold */
|
||||||
|
|
||||||
|
#ifndef __flatten
|
||||||
|
# if defined(__OPTIMIZE__) && (defined(__GNUC__) || __has_attribute(__flatten__))
|
||||||
|
# define __flatten __attribute__((__flatten__))
|
||||||
|
# else
|
||||||
|
# define __flatten
|
||||||
|
# endif
|
||||||
|
#endif /* __flatten */
|
||||||
|
|
||||||
|
#ifndef likely
|
||||||
|
# if (defined(__GNUC__) || defined(__clang__)) && !defined(__COVERITY__)
|
||||||
|
# define likely(cond) __builtin_expect(!!(cond), 1)
|
||||||
|
# else
|
||||||
|
# define likely(x) (x)
|
||||||
|
# endif
|
||||||
|
#endif /* likely */
|
||||||
|
|
||||||
|
#ifndef unlikely
|
||||||
|
# if (defined(__GNUC__) || defined(__clang__)) && !defined(__COVERITY__)
|
||||||
|
# define unlikely(cond) __builtin_expect(!!(cond), 0)
|
||||||
|
# else
|
||||||
|
# define unlikely(x) (x)
|
||||||
|
# endif
|
||||||
|
#endif /* unlikely */
|
||||||
|
|
||||||
|
/* Workaround for Coverity Scan */
|
||||||
|
#if defined(__COVERITY__) && __GNUC_PREREQ(7, 0) && !defined(__cplusplus)
|
||||||
|
typedef float _Float32;
|
||||||
|
typedef double _Float32x;
|
||||||
|
typedef double _Float64;
|
||||||
|
typedef long double _Float64x;
|
||||||
|
typedef float _Float128 __attribute__((__mode__(__TF__)));
|
||||||
|
typedef __complex__ float __cfloat128 __attribute__ ((__mode__ (__TC__)));
|
||||||
|
typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__)));
|
||||||
|
#endif /* Workaround for Coverity Scan */
|
||||||
|
|
||||||
|
#ifndef __printf_args
|
||||||
|
# if defined(__GNUC__) || __has_attribute(__format__)
|
||||||
|
# define __printf_args(format_index, first_arg) \
|
||||||
|
__attribute__((__format__(printf, format_index, first_arg)))
|
||||||
|
# else
|
||||||
|
# define __printf_args(format_index, first_arg)
|
||||||
|
# endif
|
||||||
|
#endif /* __printf_args */
|
||||||
|
|
||||||
|
#ifndef __anonymous_struct_extension__
|
||||||
|
# if defined(__GNUC__)
|
||||||
|
# define __anonymous_struct_extension__ __extension__
|
||||||
|
# else
|
||||||
|
# define __anonymous_struct_extension__
|
||||||
|
# endif
|
||||||
|
#endif /* __anonymous_struct_extension__ */
|
||||||
|
|
||||||
|
#ifndef __Wpedantic_format_voidptr
|
||||||
|
static __inline const void* __pure_function
|
||||||
|
__Wpedantic_format_voidptr(const void* ptr) {return ptr;}
|
||||||
|
# define __Wpedantic_format_voidptr(ARG) __Wpedantic_format_voidptr(ARG)
|
||||||
|
#endif /* __Wpedantic_format_voidptr */
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if defined(MDBX_USE_VALGRIND)
|
||||||
|
# include <valgrind/memcheck.h>
|
||||||
|
# ifndef VALGRIND_DISABLE_ADDR_ERROR_REPORTING_IN_RANGE
|
||||||
|
/* LY: available since Valgrind 3.10 */
|
||||||
|
# define VALGRIND_DISABLE_ADDR_ERROR_REPORTING_IN_RANGE(a,s)
|
||||||
|
# define VALGRIND_ENABLE_ADDR_ERROR_REPORTING_IN_RANGE(a,s)
|
||||||
|
# endif
|
||||||
|
#elif !defined(RUNNING_ON_VALGRIND)
|
||||||
|
# define VALGRIND_CREATE_MEMPOOL(h,r,z)
|
||||||
|
# define VALGRIND_DESTROY_MEMPOOL(h)
|
||||||
|
# define VALGRIND_MEMPOOL_TRIM(h,a,s)
|
||||||
|
# define VALGRIND_MEMPOOL_ALLOC(h,a,s)
|
||||||
|
# define VALGRIND_MEMPOOL_FREE(h,a)
|
||||||
|
# define VALGRIND_MEMPOOL_CHANGE(h,a,b,s)
|
||||||
|
# define VALGRIND_MAKE_MEM_NOACCESS(a,s)
|
||||||
|
# define VALGRIND_MAKE_MEM_DEFINED(a,s)
|
||||||
|
# define VALGRIND_MAKE_MEM_UNDEFINED(a,s)
|
||||||
|
# define VALGRIND_DISABLE_ADDR_ERROR_REPORTING_IN_RANGE(a,s)
|
||||||
|
# define VALGRIND_ENABLE_ADDR_ERROR_REPORTING_IN_RANGE(a,s)
|
||||||
|
# define VALGRIND_CHECK_MEM_IS_ADDRESSABLE(a,s) (0)
|
||||||
|
# define VALGRIND_CHECK_MEM_IS_DEFINED(a,s) (0)
|
||||||
|
# define RUNNING_ON_VALGRIND (0)
|
||||||
|
#endif /* MDBX_USE_VALGRIND */
|
||||||
|
|
||||||
|
#ifdef __SANITIZE_ADDRESS__
|
||||||
|
# include <sanitizer/asan_interface.h>
|
||||||
|
#elif !defined(ASAN_POISON_MEMORY_REGION)
|
||||||
|
# define ASAN_POISON_MEMORY_REGION(addr, size) \
|
||||||
|
((void)(addr), (void)(size))
|
||||||
|
# define ASAN_UNPOISON_MEMORY_REGION(addr, size) \
|
||||||
|
((void)(addr), (void)(size))
|
||||||
|
#endif /* __SANITIZE_ADDRESS__ */
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef ARRAY_LENGTH
|
||||||
|
# ifdef __cplusplus
|
||||||
|
template <typename T, size_t N>
|
||||||
|
char (&__ArraySizeHelper(T (&array)[N]))[N];
|
||||||
|
# define ARRAY_LENGTH(array) (sizeof(::__ArraySizeHelper(array)))
|
||||||
|
# else
|
||||||
|
# define ARRAY_LENGTH(array) (sizeof(array) / sizeof(array[0]))
|
||||||
|
# endif
|
||||||
|
#endif /* ARRAY_LENGTH */
|
||||||
|
|
||||||
|
#ifndef ARRAY_END
|
||||||
|
# define ARRAY_END(array) (&array[ARRAY_LENGTH(array)])
|
||||||
|
#endif /* ARRAY_END */
|
||||||
|
|
||||||
|
#ifndef STRINGIFY
|
||||||
|
# define STRINGIFY_HELPER(x) #x
|
||||||
|
# define STRINGIFY(x) STRINGIFY_HELPER(x)
|
||||||
|
#endif /* STRINGIFY */
|
||||||
|
|
||||||
|
#define CONCAT(a,b) a##b
|
||||||
|
#define XCONCAT(a,b) CONCAT(a,b)
|
||||||
|
|
||||||
|
#ifndef offsetof
|
||||||
|
# define offsetof(type, member) __builtin_offsetof(type, member)
|
||||||
|
#endif /* offsetof */
|
||||||
|
|
||||||
|
#ifndef container_of
|
||||||
|
# define container_of(ptr, type, member) \
|
||||||
|
((type *)((char *)(ptr) - offsetof(type, member)))
|
||||||
|
#endif /* container_of */
|
||||||
|
|
||||||
|
#define MDBX_TETRAD(a, b, c, d) \
|
||||||
|
((uint32_t)(a) << 24 | (uint32_t)(b) << 16 | (uint32_t)(c) << 8 | (d))
|
||||||
|
|
||||||
|
#define MDBX_STRING_TETRAD(str) MDBX_TETRAD(str[0], str[1], str[2], str[3])
|
||||||
|
|
||||||
|
#define FIXME "FIXME: " __FILE__ ", " STRINGIFY(__LINE__)
|
||||||
|
|
||||||
|
#ifndef STATIC_ASSERT_MSG
|
||||||
|
# if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) \
|
||||||
|
|| __has_feature(c_static_assert)
|
||||||
|
# define STATIC_ASSERT_MSG(expr, msg) _Static_assert(expr, msg)
|
||||||
|
# elif defined(static_assert)
|
||||||
|
# define STATIC_ASSERT_MSG(expr, msg) static_assert(expr, msg)
|
||||||
|
# elif defined(_MSC_VER)
|
||||||
|
# include <crtdbg.h>
|
||||||
|
# define STATIC_ASSERT_MSG(expr, msg) _STATIC_ASSERT(expr)
|
||||||
|
# else
|
||||||
|
# define STATIC_ASSERT_MSG(expr, msg) switch (0) {case 0:case (expr):;}
|
||||||
|
# endif
|
||||||
|
#endif /* STATIC_ASSERT */
|
||||||
|
|
||||||
|
#ifndef STATIC_ASSERT
|
||||||
|
# define STATIC_ASSERT(expr) STATIC_ASSERT_MSG(expr, #expr)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
/* clang-format on */
|
||||||
1367
contrib/db/libmdbx/src/elements/internals.h
Normal file
1367
contrib/db/libmdbx/src/elements/internals.h
Normal file
File diff suppressed because it is too large
Load diff
551
contrib/db/libmdbx/src/elements/lck-posix.c
Normal file
551
contrib/db/libmdbx/src/elements/lck-posix.c
Normal file
|
|
@ -0,0 +1,551 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015-2019 Leonid Yuriev <leo@yuriev.ru>
|
||||||
|
* and other libmdbx authors: please see AUTHORS file.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted only as authorized by the OpenLDAP
|
||||||
|
* Public License.
|
||||||
|
*
|
||||||
|
* A copy of this license is available in the file LICENSE in the
|
||||||
|
* top-level directory of the distribution or, alternatively, at
|
||||||
|
* <http://www.OpenLDAP.org/license.html>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "internals.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* global constructor/destructor */
|
||||||
|
|
||||||
|
#if defined(__linux__) || defined(__gnu_linux__)
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
#ifndef MDBX_ALLOY
|
||||||
|
uint32_t mdbx_linux_kernel_version;
|
||||||
|
#endif /* MDBX_ALLOY */
|
||||||
|
#endif /* Linux */
|
||||||
|
|
||||||
|
static __cold __attribute__((__constructor__)) void
|
||||||
|
mdbx_global_constructor(void) {
|
||||||
|
#if defined(__linux__) || defined(__gnu_linux__)
|
||||||
|
struct utsname buffer;
|
||||||
|
if (uname(&buffer) == 0) {
|
||||||
|
int i = 0;
|
||||||
|
char *p = buffer.release;
|
||||||
|
while (*p && i < 4) {
|
||||||
|
if (*p >= '0' && *p <= '9') {
|
||||||
|
long number = strtol(p, &p, 10);
|
||||||
|
if (number > 0) {
|
||||||
|
if (number > 255)
|
||||||
|
number = 255;
|
||||||
|
mdbx_linux_kernel_version += number << (24 - i * 8);
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
} else {
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* Linux */
|
||||||
|
|
||||||
|
mdbx_rthc_global_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
static __cold __attribute__((__destructor__)) void
|
||||||
|
mdbx_global_destructor(void) {
|
||||||
|
mdbx_rthc_global_dtor();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* lck */
|
||||||
|
|
||||||
|
/* Описание реализации блокировок для POSIX & Linux:
|
||||||
|
*
|
||||||
|
* lck-файл отображается в память, в нём организуется таблица читателей и
|
||||||
|
* размещаются совместно используемые posix-мьютексы (futex). Посредством
|
||||||
|
* этих мьютексов (см struct MDBX_lockinfo) реализуются:
|
||||||
|
* - Блокировка таблицы читателей для регистрации,
|
||||||
|
* т.е. функции mdbx_rdt_lock() и mdbx_rdt_unlock().
|
||||||
|
* - Блокировка БД для пишущих транзакций,
|
||||||
|
* т.е. функции mdbx_txn_lock() и mdbx_txn_unlock().
|
||||||
|
*
|
||||||
|
* Остальной функционал реализуется отдельно посредством файловых блокировок:
|
||||||
|
* - Первоначальный захват БД в режиме exclusive/shared и последующий перевод
|
||||||
|
* в операционный режим, функции mdbx_lck_seize() и mdbx_lck_downgrade().
|
||||||
|
* - Проверка присутствие процессов-читателей,
|
||||||
|
* т.е. функции mdbx_rpid_set(), mdbx_rpid_clear() и mdbx_rpid_check().
|
||||||
|
*
|
||||||
|
* Для блокировки файлов используется fcntl(F_SETLK), так как:
|
||||||
|
* - lockf() оперирует только эксклюзивной блокировкой и требует
|
||||||
|
* открытия файла в RW-режиме.
|
||||||
|
* - flock() не гарантирует атомарности при смене блокировок
|
||||||
|
* и оперирует только всем файлом целиком.
|
||||||
|
* - Для контроля процессов-читателей используются однобайтовые
|
||||||
|
* range-блокировки lck-файла посредством fcntl(F_SETLK). При этом
|
||||||
|
* в качестве позиции используется pid процесса-читателя.
|
||||||
|
* - Для первоначального захвата и shared/exclusive выполняется блокировка
|
||||||
|
* основного файла БД и при успехе lck-файла.
|
||||||
|
*
|
||||||
|
* ----------------------------------------------------------------------------
|
||||||
|
* УДЕРЖИВАЕМЫЕ БЛОКИРОВКИ В ЗАВИСИМОСТИ ОТ РЕЖИМА И СОСТОЯНИЯ
|
||||||
|
*
|
||||||
|
* Эксклюзивный режим без lck-файла:
|
||||||
|
* = заблокирован весь dxb-файл посредством F_RDLCK или F_WRLCK,
|
||||||
|
* в зависимости от MDBX_RDONLY.
|
||||||
|
*
|
||||||
|
* Не-операционный режим на время пере-инициализации и разрушении lck-файла:
|
||||||
|
* = F_WRLCK блокировка первого байта lck-файла, другие процессы ждут её
|
||||||
|
* снятия при получении F_RDLCK через F_SETLKW.
|
||||||
|
* - блокировки dxb-файла могут меняться до снятие эксклюзивной блокировки
|
||||||
|
* lck-файла:
|
||||||
|
* + для НЕ-эксклюзивного режима блокировка pid-байта в dxb-файле
|
||||||
|
* посредством F_RDLCK или F_WRLCK, в зависимости от MDBX_RDONLY.
|
||||||
|
* + для ЭКСКЛЮЗИВНОГО режима блокировка pid-байта всего dxb-файла
|
||||||
|
* посредством F_RDLCK или F_WRLCK, в зависимости от MDBX_RDONLY.
|
||||||
|
*
|
||||||
|
* ОПЕРАЦИОННЫЙ режим с lck-файлом:
|
||||||
|
* = F_RDLCK блокировка первого байта lck-файла, другие процессы не могут
|
||||||
|
* получить F_WRLCK и таким образом видят что БД используется.
|
||||||
|
* + F_WRLCK блокировка pid-байта в clk-файле после первой транзакции чтения.
|
||||||
|
* + для НЕ-эксклюзивного режима блокировка pid-байта в dxb-файле
|
||||||
|
* посредством F_RDLCK или F_WRLCK, в зависимости от MDBX_RDONLY.
|
||||||
|
* + для ЭКСКЛЮЗИВНОГО режима блокировка pid-байта всего dxb-файла
|
||||||
|
* посредством F_RDLCK или F_WRLCK, в зависимости от MDBX_RDONLY.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if MDBX_USE_OFDLOCKS
|
||||||
|
static int op_setlk, op_setlkw, op_getlk;
|
||||||
|
static void __cold choice_fcntl() {
|
||||||
|
assert(!op_setlk && !op_setlkw && !op_getlk);
|
||||||
|
if ((mdbx_runtime_flags & MDBX_DBG_LEGACY_MULTIOPEN) == 0
|
||||||
|
#if defined(__linux__) || defined(__gnu_linux__)
|
||||||
|
&& mdbx_linux_kernel_version >
|
||||||
|
0x030f0000 /* OFD locks are available since 3.15, but engages here
|
||||||
|
only for 3.16 and larer kernels (LTS) for reliability reasons */
|
||||||
|
#endif /* linux */
|
||||||
|
) {
|
||||||
|
op_setlk = F_OFD_SETLK;
|
||||||
|
op_setlkw = F_OFD_SETLKW;
|
||||||
|
op_getlk = F_OFD_GETLK;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
op_setlk = F_SETLK;
|
||||||
|
op_setlkw = F_SETLKW;
|
||||||
|
op_getlk = F_GETLK;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define op_setlk F_SETLK
|
||||||
|
#define op_setlkw F_SETLKW
|
||||||
|
#define op_getlk F_GETLK
|
||||||
|
#endif /* MDBX_USE_OFDLOCKS */
|
||||||
|
|
||||||
|
#ifndef OFF_T_MAX
|
||||||
|
#define OFF_T_MAX \
|
||||||
|
((sizeof(off_t) > 4 ? INT64_MAX : INT32_MAX) & ~(size_t)0xffff)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int lck_op(mdbx_filehandle_t fd, int cmd, int lck, off_t offset,
|
||||||
|
off_t len) {
|
||||||
|
mdbx_jitter4testing(true);
|
||||||
|
for (;;) {
|
||||||
|
struct flock lock_op;
|
||||||
|
memset(&lock_op, 0, sizeof(lock_op));
|
||||||
|
lock_op.l_type = lck;
|
||||||
|
lock_op.l_whence = SEEK_SET;
|
||||||
|
lock_op.l_start = offset;
|
||||||
|
lock_op.l_len = len;
|
||||||
|
int rc = fcntl(fd, cmd, &lock_op);
|
||||||
|
mdbx_jitter4testing(true);
|
||||||
|
if (rc != -1) {
|
||||||
|
if (cmd == op_getlk) {
|
||||||
|
/* Checks reader by pid. Returns:
|
||||||
|
* MDBX_RESULT_TRUE - if pid is live (unable to acquire lock)
|
||||||
|
* MDBX_RESULT_FALSE - if pid is dead (lock acquired). */
|
||||||
|
return (lock_op.l_type == F_UNLCK) ? MDBX_RESULT_FALSE
|
||||||
|
: MDBX_RESULT_TRUE;
|
||||||
|
}
|
||||||
|
return MDBX_SUCCESS;
|
||||||
|
}
|
||||||
|
rc = errno;
|
||||||
|
if (rc != EINTR || cmd == op_setlkw) {
|
||||||
|
mdbx_assert(nullptr, MDBX_IS_ERROR(rc));
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_rpid_set(MDBX_env *env) {
|
||||||
|
assert(env->me_lfd != INVALID_HANDLE_VALUE);
|
||||||
|
assert(env->me_pid > 0);
|
||||||
|
if (unlikely(mdbx_getpid() != env->me_pid))
|
||||||
|
return MDBX_PANIC;
|
||||||
|
return lck_op(env->me_lfd, op_setlk, F_WRLCK, env->me_pid, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_rpid_clear(MDBX_env *env) {
|
||||||
|
assert(env->me_lfd != INVALID_HANDLE_VALUE);
|
||||||
|
assert(env->me_pid > 0);
|
||||||
|
return lck_op(env->me_lfd, op_setlk, F_UNLCK, env->me_pid, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_rpid_check(MDBX_env *env, uint32_t pid) {
|
||||||
|
assert(env->me_lfd != INVALID_HANDLE_VALUE);
|
||||||
|
assert(pid > 0);
|
||||||
|
return lck_op(env->me_lfd, op_getlk, F_WRLCK, pid, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int __cold mdbx_lck_seize(MDBX_env *env) {
|
||||||
|
assert(env->me_fd != INVALID_HANDLE_VALUE);
|
||||||
|
if (unlikely(mdbx_getpid() != env->me_pid))
|
||||||
|
return MDBX_PANIC;
|
||||||
|
#if MDBX_USE_OFDLOCKS
|
||||||
|
if (unlikely(op_setlk == 0))
|
||||||
|
choice_fcntl();
|
||||||
|
#endif /* MDBX_USE_OFDLOCKS */
|
||||||
|
|
||||||
|
int rc;
|
||||||
|
if (env->me_lfd == INVALID_HANDLE_VALUE) {
|
||||||
|
/* LY: without-lck mode (e.g. exclusive or on read-only filesystem) */
|
||||||
|
rc =
|
||||||
|
lck_op(env->me_fd, op_setlk,
|
||||||
|
(env->me_flags & MDBX_RDONLY) ? F_RDLCK : F_WRLCK, 0, OFF_T_MAX);
|
||||||
|
if (rc != MDBX_SUCCESS) {
|
||||||
|
mdbx_error("%s(%s) failed: errcode %u", __func__, "without-lck", rc);
|
||||||
|
mdbx_assert(env, MDBX_IS_ERROR(rc));
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
return MDBX_RESULT_TRUE /* Done: return with exclusive locking. */;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Firstly try to get exclusive locking. */
|
||||||
|
rc = lck_op(env->me_lfd, op_setlk, F_WRLCK, 0, 1);
|
||||||
|
if (rc == MDBX_SUCCESS) {
|
||||||
|
continue_dxb_exclusive:
|
||||||
|
rc =
|
||||||
|
lck_op(env->me_fd, op_setlk,
|
||||||
|
(env->me_flags & MDBX_RDONLY) ? F_RDLCK : F_WRLCK, 0, OFF_T_MAX);
|
||||||
|
if (rc == MDBX_SUCCESS)
|
||||||
|
return MDBX_RESULT_TRUE /* Done: return with exclusive locking. */;
|
||||||
|
|
||||||
|
/* the cause may be a collision with POSIX's file-lock recovery. */
|
||||||
|
if (!(rc == EAGAIN || rc == EACCES || rc == EBUSY || rc == EWOULDBLOCK ||
|
||||||
|
rc == EDEADLK)) {
|
||||||
|
mdbx_error("%s(%s) failed: errcode %u", __func__, "dxb-exclusive", rc);
|
||||||
|
mdbx_assert(env, MDBX_IS_ERROR(rc));
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fallback to lck-shared */
|
||||||
|
rc = lck_op(env->me_lfd, op_setlk, F_RDLCK, 0, 1);
|
||||||
|
if (rc != MDBX_SUCCESS) {
|
||||||
|
mdbx_error("%s(%s) failed: errcode %u", __func__, "fallback-shared", rc);
|
||||||
|
mdbx_assert(env, MDBX_IS_ERROR(rc));
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
/* Done: return with shared locking. */
|
||||||
|
return MDBX_RESULT_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wait for lck-shared now. */
|
||||||
|
/* Here may be await during transient processes, for instance until another
|
||||||
|
* competing process doesn't call lck_downgrade(). */
|
||||||
|
rc = lck_op(env->me_lfd, op_setlkw, F_RDLCK, 0, 1);
|
||||||
|
if (rc != MDBX_SUCCESS) {
|
||||||
|
mdbx_error("%s(%s) failed: errcode %u", __func__, "try-shared", rc);
|
||||||
|
mdbx_assert(env, MDBX_IS_ERROR(rc));
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Lock against another process operating in without-lck or exclusive mode. */
|
||||||
|
rc =
|
||||||
|
lck_op(env->me_fd, op_setlk,
|
||||||
|
(env->me_flags & MDBX_RDONLY) ? F_RDLCK : F_WRLCK, env->me_pid, 1);
|
||||||
|
if (rc != MDBX_SUCCESS) {
|
||||||
|
mdbx_error("%s(%s) failed: errcode %u", __func__,
|
||||||
|
"lock-against-without-lck", rc);
|
||||||
|
mdbx_assert(env, MDBX_IS_ERROR(rc));
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* got shared, retry exclusive */
|
||||||
|
rc = lck_op(env->me_lfd, op_setlk, F_WRLCK, 0, 1);
|
||||||
|
if (rc == MDBX_SUCCESS)
|
||||||
|
goto continue_dxb_exclusive;
|
||||||
|
|
||||||
|
if (rc == EAGAIN || rc == EACCES || rc == EBUSY || rc == EWOULDBLOCK ||
|
||||||
|
rc == EDEADLK)
|
||||||
|
return MDBX_RESULT_FALSE /* Done: exclusive is unavailable,
|
||||||
|
but shared locks are alive. */
|
||||||
|
;
|
||||||
|
|
||||||
|
mdbx_error("%s(%s) failed: errcode %u", __func__, "try-exclusive", rc);
|
||||||
|
mdbx_assert(env, MDBX_IS_ERROR(rc));
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_lck_downgrade(MDBX_env *env) {
|
||||||
|
assert(env->me_lfd != INVALID_HANDLE_VALUE);
|
||||||
|
if (unlikely(mdbx_getpid() != env->me_pid))
|
||||||
|
return MDBX_PANIC;
|
||||||
|
|
||||||
|
int rc = MDBX_SUCCESS;
|
||||||
|
if ((env->me_flags & MDBX_EXCLUSIVE) == 0) {
|
||||||
|
rc = lck_op(env->me_fd, op_setlk, F_UNLCK, 0, env->me_pid);
|
||||||
|
if (rc == MDBX_SUCCESS)
|
||||||
|
rc = lck_op(env->me_fd, op_setlk, F_UNLCK, env->me_pid + 1,
|
||||||
|
OFF_T_MAX - env->me_pid - 1);
|
||||||
|
}
|
||||||
|
if (rc == MDBX_SUCCESS)
|
||||||
|
rc = lck_op(env->me_lfd, op_setlk, F_RDLCK, 0, 1);
|
||||||
|
if (unlikely(rc != 0)) {
|
||||||
|
mdbx_error("%s(%s) failed: errcode %u", __func__, "lck", rc);
|
||||||
|
assert(MDBX_IS_ERROR(rc));
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int __cold mdbx_lck_destroy(MDBX_env *env,
|
||||||
|
MDBX_env *inprocess_neighbor) {
|
||||||
|
if (unlikely(mdbx_getpid() != env->me_pid))
|
||||||
|
return MDBX_PANIC;
|
||||||
|
|
||||||
|
int rc = MDBX_SUCCESS;
|
||||||
|
if (env->me_lfd != INVALID_HANDLE_VALUE && !inprocess_neighbor &&
|
||||||
|
env->me_lck &&
|
||||||
|
/* try get exclusive access */
|
||||||
|
lck_op(env->me_lfd, op_setlk, F_WRLCK, 0, OFF_T_MAX) == 0 &&
|
||||||
|
lck_op(env->me_fd, op_setlk,
|
||||||
|
(env->me_flags & MDBX_RDONLY) ? F_RDLCK : F_WRLCK, 0, OFF_T_MAX)) {
|
||||||
|
mdbx_verbose("%s: got exclusive, drown mutexes", __func__);
|
||||||
|
rc = pthread_mutex_destroy(&env->me_lck->mti_rmutex);
|
||||||
|
if (rc == 0)
|
||||||
|
rc = pthread_mutex_destroy(&env->me_lck->mti_wmutex);
|
||||||
|
mdbx_assert(env, rc == 0);
|
||||||
|
if (rc == 0) {
|
||||||
|
memset(env->me_lck, 0x81, sizeof(MDBX_lockinfo));
|
||||||
|
msync(env->me_lck, env->me_os_psize, MS_ASYNC);
|
||||||
|
}
|
||||||
|
mdbx_jitter4testing(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 1) POSIX's fcntl() locks (i.e. when op_setlk == F_SETLK) should be restored
|
||||||
|
* after file was closed.
|
||||||
|
*
|
||||||
|
* 2) File locks would be released (by kernel) while the file-descriptors will
|
||||||
|
* be closed. But to avoid false-positive EACCESS and EDEADLK from the kernel,
|
||||||
|
* locks should be released here explicitly with properly order. */
|
||||||
|
|
||||||
|
/* close dxb and restore lock */
|
||||||
|
if (env->me_fd != INVALID_HANDLE_VALUE) {
|
||||||
|
if (unlikely(close(env->me_fd) != 0) && rc == MDBX_SUCCESS)
|
||||||
|
rc = errno;
|
||||||
|
env->me_fd = INVALID_HANDLE_VALUE;
|
||||||
|
if (op_setlk == F_SETLK && inprocess_neighbor && rc == MDBX_SUCCESS) {
|
||||||
|
/* restore file-lock */
|
||||||
|
rc = lck_op(
|
||||||
|
inprocess_neighbor->me_fd, F_SETLKW,
|
||||||
|
(inprocess_neighbor->me_flags & MDBX_RDONLY) ? F_RDLCK : F_WRLCK,
|
||||||
|
(inprocess_neighbor->me_flags & MDBX_EXCLUSIVE)
|
||||||
|
? 0
|
||||||
|
: inprocess_neighbor->me_pid,
|
||||||
|
(inprocess_neighbor->me_flags & MDBX_EXCLUSIVE) ? OFF_T_MAX : 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* close clk and restore locks */
|
||||||
|
if (env->me_lfd != INVALID_HANDLE_VALUE) {
|
||||||
|
if (unlikely(close(env->me_lfd) != 0) && rc == MDBX_SUCCESS)
|
||||||
|
rc = errno;
|
||||||
|
env->me_lfd = INVALID_HANDLE_VALUE;
|
||||||
|
if (op_setlk == F_SETLK && inprocess_neighbor && rc == MDBX_SUCCESS) {
|
||||||
|
/* restore file-locks */
|
||||||
|
rc = lck_op(inprocess_neighbor->me_lfd, F_SETLKW, F_RDLCK, 0, 1);
|
||||||
|
if (rc == MDBX_SUCCESS && inprocess_neighbor->me_live_reader)
|
||||||
|
rc = mdbx_rpid_set(inprocess_neighbor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inprocess_neighbor && rc != MDBX_SUCCESS)
|
||||||
|
inprocess_neighbor->me_flags |= MDBX_FATAL_ERROR;
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static int mdbx_mutex_failed(MDBX_env *env, pthread_mutex_t *mutex,
|
||||||
|
const int rc);
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int __cold mdbx_lck_init(MDBX_env *env,
|
||||||
|
MDBX_env *inprocess_neighbor,
|
||||||
|
int global_uniqueness_flag) {
|
||||||
|
if (inprocess_neighbor)
|
||||||
|
return MDBX_SUCCESS /* currently don't need any initialization
|
||||||
|
if LCK already opened/used inside current process */
|
||||||
|
;
|
||||||
|
|
||||||
|
/* FIXME: Unfortunately, there is no other reliable way but to long testing
|
||||||
|
* on each platform. On the other hand, behavior like FreeBSD is incorrect
|
||||||
|
* and we can expect it to be rare. Moreover, even on FreeBSD without
|
||||||
|
* additional in-process initialization, the probability of an problem
|
||||||
|
* occurring is vanishingly small, and the symptom is a return of EINVAL
|
||||||
|
* while locking a mutex. In other words, in the worst case, the problem
|
||||||
|
* results in an EINVAL error at the start of the transaction, but NOT data
|
||||||
|
* loss, nor database corruption, nor other fatal troubles. Thus, the code
|
||||||
|
* below I am inclined to think the workaround for erroneous platforms (like
|
||||||
|
* FreeBSD), rather than a defect of libmdbx. */
|
||||||
|
#if defined(__FreeBSD__)
|
||||||
|
/* seems that shared mutexes on FreeBSD required in-process initialization */
|
||||||
|
(void)global_uniqueness_flag;
|
||||||
|
#else
|
||||||
|
/* shared mutexes on many other platforms (including Darwin and Linux's
|
||||||
|
* futexes) doesn't need any addition in-process initialization */
|
||||||
|
if (global_uniqueness_flag != MDBX_RESULT_TRUE)
|
||||||
|
return MDBX_SUCCESS;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pthread_mutexattr_t ma;
|
||||||
|
int rc = pthread_mutexattr_init(&ma);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
rc = pthread_mutexattr_setpshared(&ma, PTHREAD_PROCESS_SHARED);
|
||||||
|
if (rc)
|
||||||
|
goto bailout;
|
||||||
|
|
||||||
|
#if MDBX_USE_ROBUST
|
||||||
|
#if defined(__GLIBC__) && !__GLIBC_PREREQ(2, 12) && \
|
||||||
|
!defined(pthread_mutex_consistent) && _POSIX_C_SOURCE < 200809L
|
||||||
|
rc = pthread_mutexattr_setrobust_np(&ma, PTHREAD_MUTEX_ROBUST_NP);
|
||||||
|
#else
|
||||||
|
rc = pthread_mutexattr_setrobust(&ma, PTHREAD_MUTEX_ROBUST);
|
||||||
|
#endif
|
||||||
|
if (rc)
|
||||||
|
goto bailout;
|
||||||
|
#endif /* MDBX_USE_ROBUST */
|
||||||
|
|
||||||
|
#if _POSIX_C_SOURCE >= 199506L && !defined(MDBX_SAFE4QEMU)
|
||||||
|
rc = pthread_mutexattr_setprotocol(&ma, PTHREAD_PRIO_INHERIT);
|
||||||
|
if (rc == ENOTSUP)
|
||||||
|
rc = pthread_mutexattr_setprotocol(&ma, PTHREAD_PRIO_NONE);
|
||||||
|
if (rc)
|
||||||
|
goto bailout;
|
||||||
|
#endif /* PTHREAD_PRIO_INHERIT */
|
||||||
|
|
||||||
|
rc = pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_ERRORCHECK);
|
||||||
|
if (rc)
|
||||||
|
goto bailout;
|
||||||
|
|
||||||
|
rc = pthread_mutex_init(&env->me_lck->mti_rmutex, &ma);
|
||||||
|
if (rc)
|
||||||
|
goto bailout;
|
||||||
|
rc = pthread_mutex_init(&env->me_lck->mti_wmutex, &ma);
|
||||||
|
|
||||||
|
bailout:
|
||||||
|
pthread_mutexattr_destroy(&ma);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mdbx_robust_lock(MDBX_env *env, pthread_mutex_t *mutex) {
|
||||||
|
mdbx_jitter4testing(true);
|
||||||
|
int rc = pthread_mutex_lock(mutex);
|
||||||
|
if (unlikely(rc != 0))
|
||||||
|
rc = mdbx_mutex_failed(env, mutex, rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mdbx_robust_trylock(MDBX_env *env, pthread_mutex_t *mutex) {
|
||||||
|
mdbx_jitter4testing(true);
|
||||||
|
int rc = pthread_mutex_trylock(mutex);
|
||||||
|
if (unlikely(rc != 0 && rc != EBUSY))
|
||||||
|
rc = mdbx_mutex_failed(env, mutex, rc);
|
||||||
|
return (rc != EBUSY) ? rc : MDBX_BUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mdbx_robust_unlock(MDBX_env *env, pthread_mutex_t *mutex) {
|
||||||
|
int rc = pthread_mutex_unlock(mutex);
|
||||||
|
mdbx_jitter4testing(true);
|
||||||
|
if (unlikely(rc != 0))
|
||||||
|
env->me_flags |= MDBX_FATAL_ERROR;
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_rdt_lock(MDBX_env *env) {
|
||||||
|
mdbx_trace("%s", ">>");
|
||||||
|
int rc = mdbx_robust_lock(env, &env->me_lck->mti_rmutex);
|
||||||
|
mdbx_trace("<< rc %d", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC void mdbx_rdt_unlock(MDBX_env *env) {
|
||||||
|
mdbx_trace("%s", ">>");
|
||||||
|
int rc = mdbx_robust_unlock(env, &env->me_lck->mti_rmutex);
|
||||||
|
mdbx_trace("<< rc %d", rc);
|
||||||
|
if (unlikely(MDBX_IS_ERROR(rc)))
|
||||||
|
mdbx_panic("%s() failed: errcode %d\n", __func__, rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
int mdbx_txn_lock(MDBX_env *env, bool dontwait) {
|
||||||
|
mdbx_trace("%s", ">>");
|
||||||
|
int rc = dontwait ? mdbx_robust_trylock(env, env->me_wmutex)
|
||||||
|
: mdbx_robust_lock(env, env->me_wmutex);
|
||||||
|
mdbx_trace("<< rc %d", rc);
|
||||||
|
return MDBX_IS_ERROR(rc) ? rc : MDBX_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mdbx_txn_unlock(MDBX_env *env) {
|
||||||
|
mdbx_trace("%s", ">>");
|
||||||
|
int rc = mdbx_robust_unlock(env, env->me_wmutex);
|
||||||
|
mdbx_trace("<< rc %d", rc);
|
||||||
|
if (unlikely(MDBX_IS_ERROR(rc)))
|
||||||
|
mdbx_panic("%s() failed: errcode %d\n", __func__, rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __cold mdbx_mutex_failed(MDBX_env *env, pthread_mutex_t *mutex,
|
||||||
|
const int err) {
|
||||||
|
int rc = err;
|
||||||
|
#if MDBX_USE_ROBUST
|
||||||
|
if (err == EOWNERDEAD) {
|
||||||
|
/* We own the mutex. Clean up after dead previous owner. */
|
||||||
|
|
||||||
|
int rlocked = (env->me_lck && mutex == &env->me_lck->mti_rmutex);
|
||||||
|
rc = MDBX_SUCCESS;
|
||||||
|
if (!rlocked) {
|
||||||
|
if (unlikely(env->me_txn)) {
|
||||||
|
/* env is hosed if the dead thread was ours */
|
||||||
|
env->me_flags |= MDBX_FATAL_ERROR;
|
||||||
|
env->me_txn = NULL;
|
||||||
|
rc = MDBX_PANIC;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mdbx_notice("%cmutex owner died, %s", (rlocked ? 'r' : 'w'),
|
||||||
|
(rc ? "this process' env is hosed" : "recovering"));
|
||||||
|
|
||||||
|
int check_rc = mdbx_reader_check0(env, rlocked, NULL);
|
||||||
|
check_rc = (check_rc == MDBX_SUCCESS) ? MDBX_RESULT_TRUE : check_rc;
|
||||||
|
|
||||||
|
#if defined(__GLIBC__) && !__GLIBC_PREREQ(2, 12) && \
|
||||||
|
!defined(pthread_mutex_consistent) && _POSIX_C_SOURCE < 200809L
|
||||||
|
int mreco_rc = pthread_mutex_consistent_np(mutex);
|
||||||
|
#else
|
||||||
|
int mreco_rc = pthread_mutex_consistent(mutex);
|
||||||
|
#endif
|
||||||
|
check_rc = (mreco_rc == 0) ? check_rc : mreco_rc;
|
||||||
|
|
||||||
|
if (unlikely(mreco_rc))
|
||||||
|
mdbx_error("mutex recovery failed, %s", mdbx_strerror(mreco_rc));
|
||||||
|
|
||||||
|
rc = (rc == MDBX_SUCCESS) ? check_rc : rc;
|
||||||
|
if (MDBX_IS_ERROR(rc))
|
||||||
|
pthread_mutex_unlock(mutex);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
(void)mutex;
|
||||||
|
#endif /* MDBX_USE_ROBUST */
|
||||||
|
|
||||||
|
mdbx_error("mutex (un)lock failed, %s", mdbx_strerror(err));
|
||||||
|
if (rc != EDEADLK)
|
||||||
|
env->me_flags |= MDBX_FATAL_ERROR;
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
777
contrib/db/libmdbx/src/elements/lck-windows.c
Normal file
777
contrib/db/libmdbx/src/elements/lck-windows.c
Normal file
|
|
@ -0,0 +1,777 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2015-2019 Leonid Yuriev <leo@yuriev.ru>
|
||||||
|
* and other libmdbx authors: please see AUTHORS file.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted only as authorized by the OpenLDAP
|
||||||
|
* Public License.
|
||||||
|
*
|
||||||
|
* A copy of this license is available in the file LICENSE in the
|
||||||
|
* top-level directory of the distribution or, alternatively, at
|
||||||
|
* <http://www.OpenLDAP.org/license.html>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "internals.h"
|
||||||
|
|
||||||
|
/* PREAMBLE FOR WINDOWS:
|
||||||
|
*
|
||||||
|
* We are not concerned for performance here.
|
||||||
|
* If you are running Windows a performance could NOT be the goal.
|
||||||
|
* Otherwise please use Linux.
|
||||||
|
*
|
||||||
|
* Regards,
|
||||||
|
* LY
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void mdbx_winnt_import(void);
|
||||||
|
|
||||||
|
#if MDBX_BUILD_SHARED_LIBRARY
|
||||||
|
#if MDBX_AVOID_CRT && defined(NDEBUG)
|
||||||
|
/* DEBUG/CHECKED builds still require MSVC's CRT for runtime checks.
|
||||||
|
*
|
||||||
|
* Define dll's entry point only for Release build when NDEBUG is defined and
|
||||||
|
* MDBX_AVOID_CRT=ON. if the entry point isn't defined then MSVC's will
|
||||||
|
* automatically use DllMainCRTStartup() from CRT library, which also
|
||||||
|
* automatically call DllMain() from our mdbx.dll */
|
||||||
|
#pragma comment(linker, "/ENTRY:DllMain")
|
||||||
|
#endif /* MDBX_AVOID_CRT */
|
||||||
|
|
||||||
|
BOOL APIENTRY DllMain(HANDLE module, DWORD reason, LPVOID reserved)
|
||||||
|
#else
|
||||||
|
#if !MDBX_CONFIG_MANUAL_TLS_CALLBACK
|
||||||
|
static
|
||||||
|
#endif /* !MDBX_CONFIG_MANUAL_TLS_CALLBACK */
|
||||||
|
void NTAPI
|
||||||
|
mdbx_dll_handler(PVOID module, DWORD reason, PVOID reserved)
|
||||||
|
#endif /* MDBX_BUILD_SHARED_LIBRARY */
|
||||||
|
{
|
||||||
|
(void)reserved;
|
||||||
|
switch (reason) {
|
||||||
|
case DLL_PROCESS_ATTACH:
|
||||||
|
mdbx_winnt_import();
|
||||||
|
mdbx_rthc_global_init();
|
||||||
|
break;
|
||||||
|
case DLL_PROCESS_DETACH:
|
||||||
|
mdbx_rthc_global_dtor();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DLL_THREAD_ATTACH:
|
||||||
|
break;
|
||||||
|
case DLL_THREAD_DETACH:
|
||||||
|
mdbx_rthc_thread_dtor(module);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#if MDBX_BUILD_SHARED_LIBRARY
|
||||||
|
return TRUE;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !MDBX_BUILD_SHARED_LIBRARY && !MDBX_CONFIG_MANUAL_TLS_CALLBACK
|
||||||
|
/* *INDENT-OFF* */
|
||||||
|
/* clang-format off */
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
# pragma const_seg(push)
|
||||||
|
# pragma data_seg(push)
|
||||||
|
|
||||||
|
# ifdef _WIN64
|
||||||
|
/* kick a linker to create the TLS directory if not already done */
|
||||||
|
# pragma comment(linker, "/INCLUDE:_tls_used")
|
||||||
|
/* Force some symbol references. */
|
||||||
|
# pragma comment(linker, "/INCLUDE:mdbx_tls_anchor")
|
||||||
|
/* specific const-segment for WIN64 */
|
||||||
|
# pragma const_seg(".CRT$XLB")
|
||||||
|
const
|
||||||
|
# else
|
||||||
|
/* kick a linker to create the TLS directory if not already done */
|
||||||
|
# pragma comment(linker, "/INCLUDE:__tls_used")
|
||||||
|
/* Force some symbol references. */
|
||||||
|
# pragma comment(linker, "/INCLUDE:_mdbx_tls_anchor")
|
||||||
|
/* specific data-segment for WIN32 */
|
||||||
|
# pragma data_seg(".CRT$XLB")
|
||||||
|
# endif
|
||||||
|
|
||||||
|
__declspec(allocate(".CRT$XLB")) PIMAGE_TLS_CALLBACK mdbx_tls_anchor = mdbx_dll_handler;
|
||||||
|
# pragma data_seg(pop)
|
||||||
|
# pragma const_seg(pop)
|
||||||
|
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
# ifdef _WIN64
|
||||||
|
const
|
||||||
|
# endif
|
||||||
|
PIMAGE_TLS_CALLBACK mdbx_tls_anchor __attribute__((__section__(".CRT$XLB"), used)) = mdbx_dll_handler;
|
||||||
|
#else
|
||||||
|
# error FIXME
|
||||||
|
#endif
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
/* clang-format on */
|
||||||
|
#endif /* !MDBX_BUILD_SHARED_LIBRARY && !MDBX_CONFIG_MANUAL_TLS_CALLBACK */
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define LCK_SHARED 0
|
||||||
|
#define LCK_EXCLUSIVE LOCKFILE_EXCLUSIVE_LOCK
|
||||||
|
#define LCK_WAITFOR 0
|
||||||
|
#define LCK_DONTWAIT LOCKFILE_FAIL_IMMEDIATELY
|
||||||
|
|
||||||
|
static __inline BOOL flock(mdbx_filehandle_t fd, DWORD flags, uint64_t offset,
|
||||||
|
size_t bytes) {
|
||||||
|
OVERLAPPED ov;
|
||||||
|
ov.hEvent = 0;
|
||||||
|
ov.Offset = (DWORD)offset;
|
||||||
|
ov.OffsetHigh = HIGH_DWORD(offset);
|
||||||
|
return LockFileEx(fd, flags, 0, (DWORD)bytes, HIGH_DWORD(bytes), &ov);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline BOOL funlock(mdbx_filehandle_t fd, uint64_t offset,
|
||||||
|
size_t bytes) {
|
||||||
|
return UnlockFile(fd, (DWORD)offset, HIGH_DWORD(offset), (DWORD)bytes,
|
||||||
|
HIGH_DWORD(bytes));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* global `write` lock for write-txt processing,
|
||||||
|
* exclusive locking both meta-pages) */
|
||||||
|
|
||||||
|
#define LCK_MAXLEN (1u + (size_t)(MAXSSIZE_T))
|
||||||
|
#define LCK_META_OFFSET 0
|
||||||
|
#define LCK_META_LEN 0x10000u
|
||||||
|
#define LCK_BODY_OFFSET LCK_META_LEN
|
||||||
|
#define LCK_BODY_LEN (LCK_MAXLEN - LCK_BODY_OFFSET)
|
||||||
|
#define LCK_META LCK_META_OFFSET, LCK_META_LEN
|
||||||
|
#define LCK_BODY LCK_BODY_OFFSET, LCK_BODY_LEN
|
||||||
|
#define LCK_WHOLE 0, LCK_MAXLEN
|
||||||
|
|
||||||
|
int mdbx_txn_lock(MDBX_env *env, bool dontwait) {
|
||||||
|
if (dontwait) {
|
||||||
|
if (!TryEnterCriticalSection(&env->me_windowsbug_lock))
|
||||||
|
return MDBX_BUSY;
|
||||||
|
} else {
|
||||||
|
EnterCriticalSection(&env->me_windowsbug_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((env->me_flags & MDBX_EXCLUSIVE) ||
|
||||||
|
flock(env->me_fd,
|
||||||
|
dontwait ? (LCK_EXCLUSIVE | LCK_DONTWAIT)
|
||||||
|
: (LCK_EXCLUSIVE | LCK_WAITFOR),
|
||||||
|
LCK_BODY))
|
||||||
|
return MDBX_SUCCESS;
|
||||||
|
int rc = GetLastError();
|
||||||
|
LeaveCriticalSection(&env->me_windowsbug_lock);
|
||||||
|
return (!dontwait || rc != ERROR_LOCK_VIOLATION) ? rc : MDBX_BUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mdbx_txn_unlock(MDBX_env *env) {
|
||||||
|
int rc =
|
||||||
|
(env->me_flags & MDBX_EXCLUSIVE) ? TRUE : funlock(env->me_fd, LCK_BODY);
|
||||||
|
LeaveCriticalSection(&env->me_windowsbug_lock);
|
||||||
|
if (!rc)
|
||||||
|
mdbx_panic("%s failed: errcode %u", __func__, GetLastError());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* global `read` lock for readers registration,
|
||||||
|
* exclusive locking `mti_numreaders` (second) cacheline */
|
||||||
|
|
||||||
|
#define LCK_LO_OFFSET 0
|
||||||
|
#define LCK_LO_LEN offsetof(MDBX_lockinfo, mti_numreaders)
|
||||||
|
#define LCK_UP_OFFSET LCK_LO_LEN
|
||||||
|
#define LCK_UP_LEN (sizeof(MDBX_lockinfo) - LCK_UP_OFFSET)
|
||||||
|
#define LCK_LOWER LCK_LO_OFFSET, LCK_LO_LEN
|
||||||
|
#define LCK_UPPER LCK_UP_OFFSET, LCK_UP_LEN
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_rdt_lock(MDBX_env *env) {
|
||||||
|
mdbx_srwlock_AcquireShared(&env->me_remap_guard);
|
||||||
|
if (env->me_lfd == INVALID_HANDLE_VALUE)
|
||||||
|
return MDBX_SUCCESS; /* readonly database in readonly filesystem */
|
||||||
|
|
||||||
|
/* transite from S-? (used) to S-E (locked), e.g. exclusive lock upper-part */
|
||||||
|
if ((env->me_flags & MDBX_EXCLUSIVE) ||
|
||||||
|
flock(env->me_lfd, LCK_EXCLUSIVE | LCK_WAITFOR, LCK_UPPER))
|
||||||
|
return MDBX_SUCCESS;
|
||||||
|
|
||||||
|
int rc = GetLastError();
|
||||||
|
mdbx_srwlock_ReleaseShared(&env->me_remap_guard);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC void mdbx_rdt_unlock(MDBX_env *env) {
|
||||||
|
if (env->me_lfd != INVALID_HANDLE_VALUE) {
|
||||||
|
/* transite from S-E (locked) to S-? (used), e.g. unlock upper-part */
|
||||||
|
if ((env->me_flags & MDBX_EXCLUSIVE) == 0 &&
|
||||||
|
!funlock(env->me_lfd, LCK_UPPER))
|
||||||
|
mdbx_panic("%s failed: errcode %u", __func__, GetLastError());
|
||||||
|
}
|
||||||
|
mdbx_srwlock_ReleaseShared(&env->me_remap_guard);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int suspend_and_append(mdbx_handle_array_t **array,
|
||||||
|
const DWORD ThreadId) {
|
||||||
|
const unsigned limit = (*array)->limit;
|
||||||
|
if ((*array)->count == limit) {
|
||||||
|
void *ptr = mdbx_realloc(
|
||||||
|
(limit > ARRAY_LENGTH((*array)->handles))
|
||||||
|
? *array
|
||||||
|
: /* don't free initial array on the stack */ NULL,
|
||||||
|
sizeof(mdbx_handle_array_t) +
|
||||||
|
sizeof(HANDLE) * (limit * 2 - ARRAY_LENGTH((*array)->handles)));
|
||||||
|
if (!ptr)
|
||||||
|
return MDBX_ENOMEM;
|
||||||
|
if (limit == ARRAY_LENGTH((*array)->handles))
|
||||||
|
memcpy(ptr, *array, sizeof(mdbx_handle_array_t));
|
||||||
|
*array = (mdbx_handle_array_t *)ptr;
|
||||||
|
(*array)->limit = limit * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
HANDLE hThread = OpenThread(THREAD_SUSPEND_RESUME | THREAD_QUERY_INFORMATION,
|
||||||
|
FALSE, ThreadId);
|
||||||
|
if (hThread == NULL)
|
||||||
|
return GetLastError();
|
||||||
|
|
||||||
|
if (SuspendThread(hThread) == -1) {
|
||||||
|
int err = GetLastError();
|
||||||
|
DWORD ExitCode;
|
||||||
|
if (err == /* workaround for Win10 UCRT bug */ ERROR_ACCESS_DENIED ||
|
||||||
|
!GetExitCodeThread(hThread, &ExitCode) || ExitCode != STILL_ACTIVE)
|
||||||
|
err = MDBX_SUCCESS;
|
||||||
|
CloseHandle(hThread);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*array)->handles[(*array)->count++] = hThread;
|
||||||
|
return MDBX_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int
|
||||||
|
mdbx_suspend_threads_before_remap(MDBX_env *env, mdbx_handle_array_t **array) {
|
||||||
|
const size_t CurrentTid = GetCurrentThreadId();
|
||||||
|
int rc;
|
||||||
|
if (env->me_lck) {
|
||||||
|
/* Scan LCK for threads of the current process */
|
||||||
|
const MDBX_reader *const begin = env->me_lck->mti_readers;
|
||||||
|
const MDBX_reader *const end = begin + env->me_lck->mti_numreaders;
|
||||||
|
const size_t WriteTxnOwner = env->me_txn0 ? env->me_txn0->mt_owner : 0;
|
||||||
|
for (const MDBX_reader *reader = begin; reader < end; ++reader) {
|
||||||
|
if (reader->mr_pid != env->me_pid || !reader->mr_tid) {
|
||||||
|
skip_lck:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (reader->mr_tid == CurrentTid || reader->mr_tid == WriteTxnOwner)
|
||||||
|
goto skip_lck;
|
||||||
|
if (env->me_flags & MDBX_NOTLS) {
|
||||||
|
/* Skip duplicates in no-tls mode */
|
||||||
|
for (const MDBX_reader *scan = reader; --scan >= begin;)
|
||||||
|
if (scan->mr_tid == reader->mr_tid)
|
||||||
|
goto skip_lck;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = suspend_and_append(array, (mdbx_tid_t)reader->mr_tid);
|
||||||
|
if (rc != MDBX_SUCCESS) {
|
||||||
|
bailout_lck:
|
||||||
|
(void)mdbx_resume_threads_after_remap(*array);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (WriteTxnOwner && WriteTxnOwner != CurrentTid) {
|
||||||
|
rc = suspend_and_append(array, (mdbx_tid_t)WriteTxnOwner);
|
||||||
|
if (rc != MDBX_SUCCESS)
|
||||||
|
goto bailout_lck;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* Without LCK (i.e. read-only mode).
|
||||||
|
* Walk thougth a snapshot of all running threads */
|
||||||
|
mdbx_assert(env,
|
||||||
|
env->me_txn0 == NULL || (env->me_flags & MDBX_EXCLUSIVE) != 0);
|
||||||
|
const HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
|
||||||
|
if (hSnapshot == INVALID_HANDLE_VALUE)
|
||||||
|
return GetLastError();
|
||||||
|
|
||||||
|
THREADENTRY32 entry;
|
||||||
|
entry.dwSize = sizeof(THREADENTRY32);
|
||||||
|
|
||||||
|
if (!Thread32First(hSnapshot, &entry)) {
|
||||||
|
rc = GetLastError();
|
||||||
|
bailout_toolhelp:
|
||||||
|
CloseHandle(hSnapshot);
|
||||||
|
(void)mdbx_resume_threads_after_remap(*array);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (entry.th32OwnerProcessID != env->me_pid ||
|
||||||
|
entry.th32ThreadID == CurrentTid)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
rc = suspend_and_append(array, entry.th32ThreadID);
|
||||||
|
if (rc != MDBX_SUCCESS)
|
||||||
|
goto bailout_toolhelp;
|
||||||
|
|
||||||
|
} while (Thread32Next(hSnapshot, &entry));
|
||||||
|
|
||||||
|
rc = GetLastError();
|
||||||
|
if (rc != ERROR_NO_MORE_FILES)
|
||||||
|
goto bailout_toolhelp;
|
||||||
|
CloseHandle(hSnapshot);
|
||||||
|
}
|
||||||
|
|
||||||
|
return MDBX_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int
|
||||||
|
mdbx_resume_threads_after_remap(mdbx_handle_array_t *array) {
|
||||||
|
int rc = MDBX_SUCCESS;
|
||||||
|
for (unsigned i = 0; i < array->count; ++i) {
|
||||||
|
const HANDLE hThread = array->handles[i];
|
||||||
|
if (ResumeThread(hThread) == -1) {
|
||||||
|
const int err = GetLastError();
|
||||||
|
DWORD ExitCode;
|
||||||
|
if (err != /* workaround for Win10 UCRT bug */ ERROR_ACCESS_DENIED &&
|
||||||
|
GetExitCodeThread(hThread, &ExitCode) && ExitCode == STILL_ACTIVE)
|
||||||
|
rc = err;
|
||||||
|
}
|
||||||
|
CloseHandle(hThread);
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* global `initial` lock for lockfile initialization,
|
||||||
|
* exclusive/shared locking first cacheline */
|
||||||
|
|
||||||
|
/* Briefly descritpion of locking schema/algorithm:
|
||||||
|
* - Windows does not support upgrading or downgrading for file locking.
|
||||||
|
* - Therefore upgrading/downgrading is emulated by shared and exclusive
|
||||||
|
* locking of upper and lower halves.
|
||||||
|
* - In other words, we have FSM with possible 9 states,
|
||||||
|
* i.e. free/shared/exclusive x free/shared/exclusive == 9.
|
||||||
|
* Only 6 states of FSM are used, which 2 of ones are transitive.
|
||||||
|
*
|
||||||
|
* The mdbx_lck_seize() moves the locking-FSM from the initial free/unlocked
|
||||||
|
* state to the "exclusive write" (and returns MDBX_RESULT_TRUE) if possible,
|
||||||
|
* or to the "used" (and returns MDBX_RESULT_FALSE).
|
||||||
|
*
|
||||||
|
* The mdbx_lck_downgrade() moves the locking-FSM from "exclusive write"
|
||||||
|
* state to the "used" (i.e. shared) state.
|
||||||
|
*
|
||||||
|
* States:
|
||||||
|
* ?-? = free, i.e. unlocked
|
||||||
|
* S-? = used, i.e. shared lock
|
||||||
|
* E-? = exclusive-read, i.e. operational exclusive
|
||||||
|
* ?-S
|
||||||
|
* ?-E = middle (transitive state)
|
||||||
|
* S-S
|
||||||
|
* S-E = locked (transitive state)
|
||||||
|
* E-S
|
||||||
|
* E-E = exclusive-write, i.e. exclusive due (re)initialization
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void lck_unlock(MDBX_env *env) {
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (env->me_lfd != INVALID_HANDLE_VALUE) {
|
||||||
|
/* double `unlock` for robustly remove overlapped shared/exclusive locks */
|
||||||
|
while (funlock(env->me_lfd, LCK_LOWER))
|
||||||
|
;
|
||||||
|
rc = GetLastError();
|
||||||
|
assert(rc == ERROR_NOT_LOCKED);
|
||||||
|
(void)rc;
|
||||||
|
SetLastError(ERROR_SUCCESS);
|
||||||
|
|
||||||
|
while (funlock(env->me_lfd, LCK_UPPER))
|
||||||
|
;
|
||||||
|
rc = GetLastError();
|
||||||
|
assert(rc == ERROR_NOT_LOCKED);
|
||||||
|
(void)rc;
|
||||||
|
SetLastError(ERROR_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (env->me_fd != INVALID_HANDLE_VALUE) {
|
||||||
|
/* explicitly unlock to avoid latency for other processes (windows kernel
|
||||||
|
* releases such locks via deferred queues) */
|
||||||
|
while (funlock(env->me_fd, LCK_BODY))
|
||||||
|
;
|
||||||
|
rc = GetLastError();
|
||||||
|
assert(rc == ERROR_NOT_LOCKED);
|
||||||
|
(void)rc;
|
||||||
|
SetLastError(ERROR_SUCCESS);
|
||||||
|
|
||||||
|
while (funlock(env->me_fd, LCK_META))
|
||||||
|
;
|
||||||
|
rc = GetLastError();
|
||||||
|
assert(rc == ERROR_NOT_LOCKED);
|
||||||
|
(void)rc;
|
||||||
|
SetLastError(ERROR_SUCCESS);
|
||||||
|
|
||||||
|
while (funlock(env->me_fd, LCK_WHOLE))
|
||||||
|
;
|
||||||
|
rc = GetLastError();
|
||||||
|
assert(rc == ERROR_NOT_LOCKED);
|
||||||
|
(void)rc;
|
||||||
|
SetLastError(ERROR_SUCCESS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_lck_init(MDBX_env *env,
|
||||||
|
MDBX_env *inprocess_neighbor,
|
||||||
|
int global_uniqueness_flag) {
|
||||||
|
(void)env;
|
||||||
|
(void)inprocess_neighbor;
|
||||||
|
(void)global_uniqueness_flag;
|
||||||
|
return MDBX_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_lck_destroy(MDBX_env *env,
|
||||||
|
MDBX_env *inprocess_neighbor) {
|
||||||
|
(void)inprocess_neighbor;
|
||||||
|
|
||||||
|
/* LY: should unmap before releasing the locks to avoid race condition and
|
||||||
|
* STATUS_USER_MAPPED_FILE/ERROR_USER_MAPPED_FILE */
|
||||||
|
if (env->me_map)
|
||||||
|
mdbx_munmap(&env->me_dxb_mmap);
|
||||||
|
if (env->me_lck)
|
||||||
|
mdbx_munmap(&env->me_lck_mmap);
|
||||||
|
|
||||||
|
lck_unlock(env);
|
||||||
|
return MDBX_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Seize state as 'exclusive-write' (E-E and returns MDBX_RESULT_TRUE)
|
||||||
|
* or as 'used' (S-? and returns MDBX_RESULT_FALSE).
|
||||||
|
* Oherwise returns an error. */
|
||||||
|
static int internal_seize_lck(HANDLE lfd) {
|
||||||
|
int rc;
|
||||||
|
assert(lfd != INVALID_HANDLE_VALUE);
|
||||||
|
|
||||||
|
/* 1) now on ?-? (free), get ?-E (middle) */
|
||||||
|
mdbx_jitter4testing(false);
|
||||||
|
if (!flock(lfd, LCK_EXCLUSIVE | LCK_WAITFOR, LCK_UPPER)) {
|
||||||
|
rc = GetLastError() /* 2) something went wrong, give up */;
|
||||||
|
mdbx_error("%s(%s) failed: errcode %u", __func__,
|
||||||
|
"?-?(free) >> ?-E(middle)", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 3) now on ?-E (middle), try E-E (exclusive-write) */
|
||||||
|
mdbx_jitter4testing(false);
|
||||||
|
if (flock(lfd, LCK_EXCLUSIVE | LCK_DONTWAIT, LCK_LOWER))
|
||||||
|
return MDBX_RESULT_TRUE /* 4) got E-E (exclusive-write), done */;
|
||||||
|
|
||||||
|
/* 5) still on ?-E (middle) */
|
||||||
|
rc = GetLastError();
|
||||||
|
mdbx_jitter4testing(false);
|
||||||
|
if (rc != ERROR_SHARING_VIOLATION && rc != ERROR_LOCK_VIOLATION) {
|
||||||
|
/* 6) something went wrong, give up */
|
||||||
|
if (!funlock(lfd, LCK_UPPER))
|
||||||
|
mdbx_panic("%s(%s) failed: errcode %u", __func__,
|
||||||
|
"?-E(middle) >> ?-?(free)", GetLastError());
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 7) still on ?-E (middle), try S-E (locked) */
|
||||||
|
mdbx_jitter4testing(false);
|
||||||
|
rc = flock(lfd, LCK_SHARED | LCK_DONTWAIT, LCK_LOWER) ? MDBX_RESULT_FALSE
|
||||||
|
: GetLastError();
|
||||||
|
|
||||||
|
mdbx_jitter4testing(false);
|
||||||
|
if (rc != MDBX_RESULT_FALSE)
|
||||||
|
mdbx_error("%s(%s) failed: errcode %u", __func__,
|
||||||
|
"?-E(middle) >> S-E(locked)", rc);
|
||||||
|
|
||||||
|
/* 8) now on S-E (locked) or still on ?-E (middle),
|
||||||
|
* transite to S-? (used) or ?-? (free) */
|
||||||
|
if (!funlock(lfd, LCK_UPPER))
|
||||||
|
mdbx_panic("%s(%s) failed: errcode %u", __func__,
|
||||||
|
"X-E(locked/middle) >> X-?(used/free)", GetLastError());
|
||||||
|
|
||||||
|
/* 9) now on S-? (used, DONE) or ?-? (free, FAILURE) */
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_lck_seize(MDBX_env *env) {
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
assert(env->me_fd != INVALID_HANDLE_VALUE);
|
||||||
|
if (env->me_flags & MDBX_EXCLUSIVE)
|
||||||
|
return MDBX_RESULT_TRUE /* nope since files were must be opened
|
||||||
|
non-shareable */
|
||||||
|
;
|
||||||
|
|
||||||
|
if (env->me_lfd == INVALID_HANDLE_VALUE) {
|
||||||
|
/* LY: without-lck mode (e.g. on read-only filesystem) */
|
||||||
|
mdbx_jitter4testing(false);
|
||||||
|
if (!flock(env->me_fd, LCK_SHARED | LCK_DONTWAIT, LCK_WHOLE)) {
|
||||||
|
rc = GetLastError();
|
||||||
|
mdbx_error("%s(%s) failed: errcode %u", __func__, "without-lck", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
return MDBX_RESULT_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = internal_seize_lck(env->me_lfd);
|
||||||
|
mdbx_jitter4testing(false);
|
||||||
|
if (rc == MDBX_RESULT_TRUE && (env->me_flags & MDBX_RDONLY) == 0) {
|
||||||
|
/* Check that another process don't operates in without-lck mode.
|
||||||
|
* Doing such check by exclusive locking the body-part of db. Should be
|
||||||
|
* noted:
|
||||||
|
* - we need an exclusive lock for do so;
|
||||||
|
* - we can't lock meta-pages, otherwise other process could get an error
|
||||||
|
* while opening db in valid (non-conflict) mode. */
|
||||||
|
if (!flock(env->me_fd, LCK_EXCLUSIVE | LCK_DONTWAIT, LCK_BODY)) {
|
||||||
|
rc = GetLastError();
|
||||||
|
mdbx_error("%s(%s) failed: errcode %u", __func__,
|
||||||
|
"lock-against-without-lck", rc);
|
||||||
|
mdbx_jitter4testing(false);
|
||||||
|
lck_unlock(env);
|
||||||
|
} else {
|
||||||
|
mdbx_jitter4testing(false);
|
||||||
|
if (!funlock(env->me_fd, LCK_BODY))
|
||||||
|
mdbx_panic("%s(%s) failed: errcode %u", __func__,
|
||||||
|
"unlock-against-without-lck", GetLastError());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_lck_downgrade(MDBX_env *env) {
|
||||||
|
/* Transite from exclusive state (E-?) to used (S-?) */
|
||||||
|
assert(env->me_fd != INVALID_HANDLE_VALUE);
|
||||||
|
assert(env->me_lfd != INVALID_HANDLE_VALUE);
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
if (env->me_flags & MDBX_EXCLUSIVE)
|
||||||
|
return MDBX_SUCCESS /* nope since files were must be opened non-shareable */
|
||||||
|
;
|
||||||
|
#else
|
||||||
|
/* 1) must be at E-E (exclusive-write) */
|
||||||
|
if (env->me_flags & MDBX_EXCLUSIVE) {
|
||||||
|
/* transite from E-E to E_? (exclusive-read) */
|
||||||
|
if (!funlock(env->me_lfd, LCK_UPPER))
|
||||||
|
mdbx_panic("%s(%s) failed: errcode %u", __func__,
|
||||||
|
"E-E(exclusive-write) >> E-?(exclusive-read)", GetLastError());
|
||||||
|
return MDBX_SUCCESS /* 2) now at E-? (exclusive-read), done */;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 3) now at E-E (exclusive-write), transite to ?_E (middle) */
|
||||||
|
if (!funlock(env->me_lfd, LCK_LOWER))
|
||||||
|
mdbx_panic("%s(%s) failed: errcode %u", __func__,
|
||||||
|
"E-E(exclusive-write) >> ?-E(middle)", GetLastError());
|
||||||
|
|
||||||
|
/* 4) now at ?-E (middle), transite to S-E (locked) */
|
||||||
|
if (!flock(env->me_lfd, LCK_SHARED | LCK_DONTWAIT, LCK_LOWER)) {
|
||||||
|
int rc = GetLastError() /* 5) something went wrong, give up */;
|
||||||
|
mdbx_error("%s(%s) failed: errcode %u", __func__,
|
||||||
|
"?-E(middle) >> S-E(locked)", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 6) got S-E (locked), continue transition to S-? (used) */
|
||||||
|
if (!funlock(env->me_lfd, LCK_UPPER))
|
||||||
|
mdbx_panic("%s(%s) failed: errcode %u", __func__,
|
||||||
|
"S-E(locked) >> S-?(used)", GetLastError());
|
||||||
|
|
||||||
|
return MDBX_SUCCESS /* 7) now at S-? (used), done */;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* reader checking (by pid) */
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_rpid_set(MDBX_env *env) {
|
||||||
|
(void)env;
|
||||||
|
return MDBX_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_rpid_clear(MDBX_env *env) {
|
||||||
|
(void)env;
|
||||||
|
return MDBX_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Checks reader by pid.
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* MDBX_RESULT_TRUE, if pid is live (unable to acquire lock)
|
||||||
|
* MDBX_RESULT_FALSE, if pid is dead (lock acquired)
|
||||||
|
* or otherwise the errcode. */
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_rpid_check(MDBX_env *env, uint32_t pid) {
|
||||||
|
(void)env;
|
||||||
|
HANDLE hProcess = OpenProcess(SYNCHRONIZE, FALSE, pid);
|
||||||
|
int rc;
|
||||||
|
if (likely(hProcess)) {
|
||||||
|
rc = WaitForSingleObject(hProcess, 0);
|
||||||
|
if (unlikely(rc == WAIT_FAILED))
|
||||||
|
rc = GetLastError();
|
||||||
|
CloseHandle(hProcess);
|
||||||
|
} else {
|
||||||
|
rc = GetLastError();
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (rc) {
|
||||||
|
case ERROR_INVALID_PARAMETER:
|
||||||
|
/* pid seems invalid */
|
||||||
|
return MDBX_RESULT_FALSE;
|
||||||
|
case WAIT_OBJECT_0:
|
||||||
|
/* process just exited */
|
||||||
|
return MDBX_RESULT_FALSE;
|
||||||
|
case WAIT_TIMEOUT:
|
||||||
|
/* pid running */
|
||||||
|
return MDBX_RESULT_TRUE;
|
||||||
|
default:
|
||||||
|
/* failure */
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
// Stub for slim read-write lock
|
||||||
|
// Copyright (C) 1995-2002 Brad Wilson
|
||||||
|
|
||||||
|
static void WINAPI stub_srwlock_Init(MDBX_srwlock *srwl) {
|
||||||
|
srwl->readerCount = srwl->writerCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void WINAPI stub_srwlock_AcquireShared(MDBX_srwlock *srwl) {
|
||||||
|
while (true) {
|
||||||
|
assert(srwl->writerCount >= 0 && srwl->readerCount >= 0);
|
||||||
|
|
||||||
|
// If there's a writer already, spin without unnecessarily
|
||||||
|
// interlocking the CPUs
|
||||||
|
if (srwl->writerCount != 0) {
|
||||||
|
YieldProcessor();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add to the readers list
|
||||||
|
_InterlockedIncrement(&srwl->readerCount);
|
||||||
|
|
||||||
|
// Check for writers again (we may have been pre-empted). If
|
||||||
|
// there are no writers writing or waiting, then we're done.
|
||||||
|
if (srwl->writerCount == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Remove from the readers list, spin, try again
|
||||||
|
_InterlockedDecrement(&srwl->readerCount);
|
||||||
|
YieldProcessor();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void WINAPI stub_srwlock_ReleaseShared(MDBX_srwlock *srwl) {
|
||||||
|
assert(srwl->readerCount > 0);
|
||||||
|
_InterlockedDecrement(&srwl->readerCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void WINAPI stub_srwlock_AcquireExclusive(MDBX_srwlock *srwl) {
|
||||||
|
while (true) {
|
||||||
|
assert(srwl->writerCount >= 0 && srwl->readerCount >= 0);
|
||||||
|
|
||||||
|
// If there's a writer already, spin without unnecessarily
|
||||||
|
// interlocking the CPUs
|
||||||
|
if (srwl->writerCount != 0) {
|
||||||
|
YieldProcessor();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// See if we can become the writer (expensive, because it inter-
|
||||||
|
// locks the CPUs, so writing should be an infrequent process)
|
||||||
|
if (_InterlockedExchange(&srwl->writerCount, 1) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now we're the writer, but there may be outstanding readers.
|
||||||
|
// Spin until there aren't any more; new readers will wait now
|
||||||
|
// that we're the writer.
|
||||||
|
while (srwl->readerCount != 0) {
|
||||||
|
assert(srwl->writerCount >= 0 && srwl->readerCount >= 0);
|
||||||
|
YieldProcessor();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void WINAPI stub_srwlock_ReleaseExclusive(MDBX_srwlock *srwl) {
|
||||||
|
assert(srwl->writerCount == 1 && srwl->readerCount >= 0);
|
||||||
|
srwl->writerCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
MDBX_srwlock_function mdbx_srwlock_Init, mdbx_srwlock_AcquireShared,
|
||||||
|
mdbx_srwlock_ReleaseShared, mdbx_srwlock_AcquireExclusive,
|
||||||
|
mdbx_srwlock_ReleaseExclusive;
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if 0 /* LY: unused for now */
|
||||||
|
static DWORD WINAPI stub_DiscardVirtualMemory(PVOID VirtualAddress,
|
||||||
|
SIZE_T Size) {
|
||||||
|
return VirtualAlloc(VirtualAddress, Size, MEM_RESET, PAGE_NOACCESS)
|
||||||
|
? ERROR_SUCCESS
|
||||||
|
: GetLastError();
|
||||||
|
}
|
||||||
|
#endif /* unused for now */
|
||||||
|
|
||||||
|
static uint64_t WINAPI stub_GetTickCount64(void) {
|
||||||
|
LARGE_INTEGER Counter, Frequency;
|
||||||
|
return (QueryPerformanceFrequency(&Frequency) &&
|
||||||
|
QueryPerformanceCounter(&Counter))
|
||||||
|
? Counter.QuadPart * 1000ul / Frequency.QuadPart
|
||||||
|
: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
#ifndef MDBX_ALLOY
|
||||||
|
MDBX_GetFileInformationByHandleEx mdbx_GetFileInformationByHandleEx;
|
||||||
|
MDBX_GetVolumeInformationByHandleW mdbx_GetVolumeInformationByHandleW;
|
||||||
|
MDBX_GetFinalPathNameByHandleW mdbx_GetFinalPathNameByHandleW;
|
||||||
|
MDBX_SetFileInformationByHandle mdbx_SetFileInformationByHandle;
|
||||||
|
MDBX_NtFsControlFile mdbx_NtFsControlFile;
|
||||||
|
MDBX_PrefetchVirtualMemory mdbx_PrefetchVirtualMemory;
|
||||||
|
MDBX_GetTickCount64 mdbx_GetTickCount64;
|
||||||
|
#if 0 /* LY: unused for now */
|
||||||
|
MDBX_DiscardVirtualMemory mdbx_DiscardVirtualMemory;
|
||||||
|
MDBX_OfferVirtualMemory mdbx_OfferVirtualMemory;
|
||||||
|
MDBX_ReclaimVirtualMemory mdbx_ReclaimVirtualMemory;
|
||||||
|
#endif /* unused for now */
|
||||||
|
#endif /* MDBX_ALLOY */
|
||||||
|
|
||||||
|
static void mdbx_winnt_import(void) {
|
||||||
|
const HINSTANCE hKernel32dll = GetModuleHandleA("kernel32.dll");
|
||||||
|
const MDBX_srwlock_function init =
|
||||||
|
(MDBX_srwlock_function)GetProcAddress(hKernel32dll, "InitializeSRWLock");
|
||||||
|
if (init != NULL) {
|
||||||
|
mdbx_srwlock_Init = init;
|
||||||
|
mdbx_srwlock_AcquireShared = (MDBX_srwlock_function)GetProcAddress(
|
||||||
|
hKernel32dll, "AcquireSRWLockShared");
|
||||||
|
mdbx_srwlock_ReleaseShared = (MDBX_srwlock_function)GetProcAddress(
|
||||||
|
hKernel32dll, "ReleaseSRWLockShared");
|
||||||
|
mdbx_srwlock_AcquireExclusive = (MDBX_srwlock_function)GetProcAddress(
|
||||||
|
hKernel32dll, "AcquireSRWLockExclusive");
|
||||||
|
mdbx_srwlock_ReleaseExclusive = (MDBX_srwlock_function)GetProcAddress(
|
||||||
|
hKernel32dll, "ReleaseSRWLockExclusive");
|
||||||
|
} else {
|
||||||
|
mdbx_srwlock_Init = stub_srwlock_Init;
|
||||||
|
mdbx_srwlock_AcquireShared = stub_srwlock_AcquireShared;
|
||||||
|
mdbx_srwlock_ReleaseShared = stub_srwlock_ReleaseShared;
|
||||||
|
mdbx_srwlock_AcquireExclusive = stub_srwlock_AcquireExclusive;
|
||||||
|
mdbx_srwlock_ReleaseExclusive = stub_srwlock_ReleaseExclusive;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define GET_KERNEL32_PROC(ENTRY) \
|
||||||
|
mdbx_##ENTRY = (MDBX_##ENTRY)GetProcAddress(hKernel32dll, #ENTRY)
|
||||||
|
GET_KERNEL32_PROC(GetFileInformationByHandleEx);
|
||||||
|
GET_KERNEL32_PROC(GetVolumeInformationByHandleW);
|
||||||
|
GET_KERNEL32_PROC(GetFinalPathNameByHandleW);
|
||||||
|
GET_KERNEL32_PROC(SetFileInformationByHandle);
|
||||||
|
GET_KERNEL32_PROC(PrefetchVirtualMemory);
|
||||||
|
GET_KERNEL32_PROC(GetTickCount64);
|
||||||
|
if (!mdbx_GetTickCount64)
|
||||||
|
mdbx_GetTickCount64 = stub_GetTickCount64;
|
||||||
|
#if 0 /* LY: unused for now */
|
||||||
|
GET_KERNEL32_PROC(DiscardVirtualMemory);
|
||||||
|
if (!mdbx_DiscardVirtualMemory)
|
||||||
|
mdbx_DiscardVirtualMemory = stub_DiscardVirtualMemory;
|
||||||
|
GET_KERNEL32_PROC(OfferVirtualMemory);
|
||||||
|
GET_KERNEL32_PROC(ReclaimVirtualMemory);
|
||||||
|
#endif /* unused for now */
|
||||||
|
#undef GET_KERNEL32_PROC
|
||||||
|
|
||||||
|
const HINSTANCE hNtdll = GetModuleHandleA("ntdll.dll");
|
||||||
|
mdbx_NtFsControlFile =
|
||||||
|
(MDBX_NtFsControlFile)GetProcAddress(hNtdll, "NtFsControlFile");
|
||||||
|
}
|
||||||
1244
contrib/db/libmdbx/src/elements/ntdll.def
Normal file
1244
contrib/db/libmdbx/src/elements/ntdll.def
Normal file
File diff suppressed because it is too large
Load diff
1899
contrib/db/libmdbx/src/elements/osal.c
Normal file
1899
contrib/db/libmdbx/src/elements/osal.c
Normal file
File diff suppressed because it is too large
Load diff
959
contrib/db/libmdbx/src/elements/osal.h
Normal file
959
contrib/db/libmdbx/src/elements/osal.h
Normal file
|
|
@ -0,0 +1,959 @@
|
||||||
|
/* https://en.wikipedia.org/wiki/Operating_system_abstraction_layer */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2015-2019 Leonid Yuriev <leo@yuriev.ru>
|
||||||
|
* and other libmdbx authors: please see AUTHORS file.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted only as authorized by the OpenLDAP
|
||||||
|
* Public License.
|
||||||
|
*
|
||||||
|
* A copy of this license is available in the file LICENSE in the
|
||||||
|
* top-level directory of the distribution or, alternatively, at
|
||||||
|
* <http://www.OpenLDAP.org/license.html>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* Microsoft compiler generates a lot of warning for self includes... */
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(push, 1)
|
||||||
|
#pragma warning(disable : 4548) /* expression before comma has no effect; \
|
||||||
|
expected expression with side - effect */
|
||||||
|
#pragma warning(disable : 4530) /* C++ exception handler used, but unwind \
|
||||||
|
* semantics are not enabled. Specify /EHsc */
|
||||||
|
#pragma warning(disable : 4577) /* 'noexcept' used with no exception handling \
|
||||||
|
* mode specified; termination on exception is \
|
||||||
|
* not guaranteed. Specify /EHsc */
|
||||||
|
#endif /* _MSC_VER (warnings) */
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
#if !defined(_CRT_SECURE_NO_WARNINGS)
|
||||||
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
|
#endif
|
||||||
|
#if !defined(_NO_CRT_STDIO_INLINE) && MDBX_BUILD_SHARED_LIBRARY && \
|
||||||
|
!defined(MDBX_TOOLS)
|
||||||
|
#define _NO_CRT_STDIO_INLINE
|
||||||
|
#endif
|
||||||
|
#endif /* Windows */
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* C99 includes */
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
/* C11 stdalign.h */
|
||||||
|
#if __has_include(<stdalign.h>)
|
||||||
|
#include <stdalign.h>
|
||||||
|
#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
|
||||||
|
#define alignas(N) _Alignas(N)
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
#define alignas(N) __declspec(align(N))
|
||||||
|
#elif __has_attribute(__aligned__) || defined(__GNUC__)
|
||||||
|
#define alignas(N) __attribute__((__aligned__(N)))
|
||||||
|
#else
|
||||||
|
#error "FIXME: Required _alignas() or equivalent."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* Systems includes */
|
||||||
|
|
||||||
|
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \
|
||||||
|
defined(__BSD__) || defined(__NETBSD__) || defined(__bsdi__) || \
|
||||||
|
defined(__DragonFly__) || defined(__APPLE__) || defined(__MACH__)
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#include <sys/sysctl.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#if defined(__FreeBSD__) || defined(__DragonFly__)
|
||||||
|
#include <vm/vm_param.h>
|
||||||
|
#elif defined(__OpenBSD__) || defined(__NetBSD__)
|
||||||
|
#include <uvm/uvm_param.h>
|
||||||
|
#else
|
||||||
|
#define SYSCTL_LEGACY_NONCONST_MIB
|
||||||
|
#endif
|
||||||
|
#include <sys/vmmeter.h>
|
||||||
|
#else
|
||||||
|
#include <malloc.h>
|
||||||
|
#ifndef _POSIX_C_SOURCE
|
||||||
|
#ifdef _POSIX_SOURCE
|
||||||
|
#define _POSIX_C_SOURCE 1
|
||||||
|
#else
|
||||||
|
#define _POSIX_C_SOURCE 0
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif /* !xBSD */
|
||||||
|
|
||||||
|
#if defined(__FreeBSD__) || defined(__OpenBSD__) || __has_include(<malloc_np.h>)
|
||||||
|
#include <malloc_np.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__APPLE__) || defined(__MACH__) || __has_include(<malloc/malloc.h>)
|
||||||
|
#include <malloc/malloc.h>
|
||||||
|
#endif /* MacOS */
|
||||||
|
|
||||||
|
#if defined(__MACH__)
|
||||||
|
#include <mach/host_info.h>
|
||||||
|
#include <mach/mach_host.h>
|
||||||
|
#include <mach/mach_port.h>
|
||||||
|
#include <uuid/uuid.h>
|
||||||
|
#undef P_DIRTY
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__linux__) || defined(__gnu_linux__)
|
||||||
|
#include <linux/sysctl.h>
|
||||||
|
#include <sys/sendfile.h>
|
||||||
|
#include <sys/statvfs.h>
|
||||||
|
#endif /* Linux */
|
||||||
|
|
||||||
|
#ifndef _XOPEN_SOURCE
|
||||||
|
#define _XOPEN_SOURCE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _XOPEN_SOURCE_EXTENDED
|
||||||
|
#define _XOPEN_SOURCE_EXTENDED 0
|
||||||
|
#else
|
||||||
|
#include <utmpx.h>
|
||||||
|
#endif /* _XOPEN_SOURCE_EXTENDED */
|
||||||
|
|
||||||
|
#if defined(__sun) || defined(__SVR4) || defined(__svr4__)
|
||||||
|
#include <kstat.h>
|
||||||
|
#endif /* SunOS/Solaris */
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <tlhelp32.h>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <winnt.h>
|
||||||
|
#include <winternl.h>
|
||||||
|
#define HAVE_SYS_STAT_H
|
||||||
|
#define HAVE_SYS_TYPES_H
|
||||||
|
typedef HANDLE mdbx_thread_t;
|
||||||
|
typedef unsigned mdbx_thread_key_t;
|
||||||
|
#define MDBX_OSAL_SECTION HANDLE
|
||||||
|
#define MAP_FAILED NULL
|
||||||
|
#define HIGH_DWORD(v) ((DWORD)((sizeof(v) > 4) ? ((uint64_t)(v) >> 32) : 0))
|
||||||
|
#define THREAD_CALL WINAPI
|
||||||
|
#define THREAD_RESULT DWORD
|
||||||
|
typedef struct {
|
||||||
|
HANDLE mutex;
|
||||||
|
HANDLE event;
|
||||||
|
} mdbx_condmutex_t;
|
||||||
|
typedef CRITICAL_SECTION mdbx_fastmutex_t;
|
||||||
|
|
||||||
|
#if MDBX_AVOID_CRT
|
||||||
|
#ifndef mdbx_malloc
|
||||||
|
static inline void *mdbx_malloc(size_t bytes) {
|
||||||
|
return LocalAlloc(LMEM_FIXED, bytes);
|
||||||
|
}
|
||||||
|
#endif /* mdbx_malloc */
|
||||||
|
|
||||||
|
#ifndef mdbx_calloc
|
||||||
|
static inline void *mdbx_calloc(size_t nelem, size_t size) {
|
||||||
|
return LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, nelem * size);
|
||||||
|
}
|
||||||
|
#endif /* mdbx_calloc */
|
||||||
|
|
||||||
|
#ifndef mdbx_realloc
|
||||||
|
static inline void *mdbx_realloc(void *ptr, size_t bytes) {
|
||||||
|
return LocalReAlloc(ptr, bytes, LMEM_MOVEABLE);
|
||||||
|
}
|
||||||
|
#endif /* mdbx_realloc */
|
||||||
|
|
||||||
|
#ifndef mdbx_free
|
||||||
|
#define mdbx_free LocalFree
|
||||||
|
#endif /* mdbx_free */
|
||||||
|
#else
|
||||||
|
#define mdbx_malloc malloc
|
||||||
|
#define mdbx_calloc calloc
|
||||||
|
#define mdbx_realloc realloc
|
||||||
|
#define mdbx_free free
|
||||||
|
#define mdbx_strdup _strdup
|
||||||
|
#endif /* MDBX_AVOID_CRT */
|
||||||
|
|
||||||
|
#ifndef snprintf
|
||||||
|
#define snprintf _snprintf /* ntdll */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef vsnprintf
|
||||||
|
#define vsnprintf _vsnprintf /* ntdll */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else /*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <sys/file.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/uio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
typedef pthread_t mdbx_thread_t;
|
||||||
|
typedef pthread_key_t mdbx_thread_key_t;
|
||||||
|
#define INVALID_HANDLE_VALUE (-1)
|
||||||
|
#define THREAD_CALL
|
||||||
|
#define THREAD_RESULT void *
|
||||||
|
typedef struct {
|
||||||
|
pthread_mutex_t mutex;
|
||||||
|
pthread_cond_t cond;
|
||||||
|
} mdbx_condmutex_t;
|
||||||
|
typedef pthread_mutex_t mdbx_fastmutex_t;
|
||||||
|
#define mdbx_malloc malloc
|
||||||
|
#define mdbx_calloc calloc
|
||||||
|
#define mdbx_realloc realloc
|
||||||
|
#define mdbx_free free
|
||||||
|
#define mdbx_strdup strdup
|
||||||
|
#endif /* Platform */
|
||||||
|
|
||||||
|
#if __GLIBC_PREREQ(2, 12) || defined(__FreeBSD__) || defined(malloc_usable_size)
|
||||||
|
/* malloc_usable_size() already provided */
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
#define malloc_usable_size(ptr) malloc_size(ptr)
|
||||||
|
#elif defined(_MSC_VER) && !MDBX_AVOID_CRT
|
||||||
|
#define malloc_usable_size(ptr) _msize(ptr)
|
||||||
|
#endif /* malloc_usable_size */
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
|
/* clang-format off */
|
||||||
|
#if defined(HAVE_SYS_STAT_H) || __has_include(<sys/stat.h>)
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_SYS_TYPES_H) || __has_include(<sys/types.h>)
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_SYS_FILE_H) || __has_include(<sys/file.h>)
|
||||||
|
#include <sys/file.h>
|
||||||
|
#endif
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
/* clang-format on */
|
||||||
|
|
||||||
|
#ifndef SSIZE_MAX
|
||||||
|
#define SSIZE_MAX INTPTR_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(MADV_DODUMP) && defined(MADV_CORE)
|
||||||
|
#define MADV_DODUMP MADV_CORE
|
||||||
|
#endif /* MADV_CORE -> MADV_DODUMP */
|
||||||
|
|
||||||
|
#if !defined(MADV_DONTDUMP) && defined(MADV_NOCORE)
|
||||||
|
#define MADV_DONTDUMP MADV_NOCORE
|
||||||
|
#endif /* MADV_NOCORE -> MADV_DONTDUMP */
|
||||||
|
|
||||||
|
#if defined(i386) || defined(__386) || defined(__i386) || defined(__i386__) || \
|
||||||
|
defined(i486) || defined(__i486) || defined(__i486__) || \
|
||||||
|
defined(i586) | defined(__i586) || defined(__i586__) || defined(i686) || \
|
||||||
|
defined(__i686) || defined(__i686__) || defined(_M_IX86) || \
|
||||||
|
defined(_X86_) || defined(__THW_INTEL__) || defined(__I86__) || \
|
||||||
|
defined(__INTEL__) || defined(__x86_64) || defined(__x86_64__) || \
|
||||||
|
defined(__amd64__) || defined(__amd64) || defined(_M_X64) || \
|
||||||
|
defined(_M_AMD64) || defined(__IA32__) || defined(__INTEL__)
|
||||||
|
#ifndef __ia32__
|
||||||
|
/* LY: define neutral __ia32__ for x86 and x86-64 archs */
|
||||||
|
#define __ia32__ 1
|
||||||
|
#endif /* __ia32__ */
|
||||||
|
#if !defined(__amd64__) && (defined(__x86_64) || defined(__x86_64__) || \
|
||||||
|
defined(__amd64) || defined(_M_X64))
|
||||||
|
/* LY: define trusty __amd64__ for all AMD64/x86-64 arch */
|
||||||
|
#define __amd64__ 1
|
||||||
|
#endif /* __amd64__ */
|
||||||
|
#endif /* all x86 */
|
||||||
|
|
||||||
|
#if !defined(MDBX_UNALIGNED_OK)
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#define MDBX_UNALIGNED_OK 1 /* avoid MSVC misoptimization */
|
||||||
|
#elif __CLANG_PREREQ(5, 0) || __GNUC_PREREQ(5, 0)
|
||||||
|
#define MDBX_UNALIGNED_OK 0 /* expecting optimization is well done */
|
||||||
|
#elif (defined(__ia32__) || defined(__ARM_FEATURE_UNALIGNED)) && \
|
||||||
|
!defined(__ALIGNED__)
|
||||||
|
#define MDBX_UNALIGNED_OK 1
|
||||||
|
#else
|
||||||
|
#define MDBX_UNALIGNED_OK 0
|
||||||
|
#endif
|
||||||
|
#endif /* MDBX_UNALIGNED_OK */
|
||||||
|
|
||||||
|
#if (-6 & 5) || CHAR_BIT != 8 || UINT_MAX < 0xffffffff || ULONG_MAX % 0xFFFF
|
||||||
|
#error \
|
||||||
|
"Sanity checking failed: Two's complement, reasonably sized integer types"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* Compiler's includes for builtins/intrinsics */
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) || defined(__INTEL_COMPILER)
|
||||||
|
#include <intrin.h>
|
||||||
|
#elif __GNUC_PREREQ(4, 4) || defined(__clang__)
|
||||||
|
#if defined(__ia32__) || defined(__e2k__)
|
||||||
|
#include <x86intrin.h>
|
||||||
|
#endif /* __ia32__ */
|
||||||
|
#if defined(__ia32__)
|
||||||
|
#include <cpuid.h>
|
||||||
|
#endif /* __ia32__ */
|
||||||
|
#elif defined(__SUNPRO_C) || defined(__sun) || defined(sun)
|
||||||
|
#include <mbarrier.h>
|
||||||
|
#elif (defined(_HPUX_SOURCE) || defined(__hpux) || defined(__HP_aCC)) && \
|
||||||
|
(defined(HP_IA64) || defined(__ia64))
|
||||||
|
#include <machine/sys/inline.h>
|
||||||
|
#elif defined(__IBMC__) && defined(__powerpc)
|
||||||
|
#include <atomic.h>
|
||||||
|
#elif defined(_AIX)
|
||||||
|
#include <builtins.h>
|
||||||
|
#include <sys/atomic_op.h>
|
||||||
|
#elif (defined(__osf__) && defined(__DECC)) || defined(__alpha)
|
||||||
|
#include <c_asm.h>
|
||||||
|
#include <machine/builtins.h>
|
||||||
|
#elif defined(__MWERKS__)
|
||||||
|
/* CodeWarrior - troubles ? */
|
||||||
|
#pragma gcc_extensions
|
||||||
|
#elif defined(__SNC__)
|
||||||
|
/* Sony PS3 - troubles ? */
|
||||||
|
#elif defined(__hppa__) || defined(__hppa)
|
||||||
|
#include <machine/inline.h>
|
||||||
|
#else
|
||||||
|
#error Unsupported C compiler, please use GNU C 4.4 or newer
|
||||||
|
#endif /* Compiler */
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* Byteorder */
|
||||||
|
|
||||||
|
#if !defined(__BYTE_ORDER__) || !defined(__ORDER_LITTLE_ENDIAN__) || \
|
||||||
|
!defined(__ORDER_BIG_ENDIAN__)
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
|
/* clang-format off */
|
||||||
|
#if defined(__GLIBC__) || defined(__GNU_LIBRARY__) || defined(__ANDROID__) || \
|
||||||
|
defined(HAVE_ENDIAN_H) || __has_include(<endian.h>)
|
||||||
|
#include <endian.h>
|
||||||
|
#elif defined(__APPLE__) || defined(__MACH__) || defined(__OpenBSD__) || \
|
||||||
|
defined(HAVE_MACHINE_ENDIAN_H) || __has_include(<machine/endian.h>)
|
||||||
|
#include <machine/endian.h>
|
||||||
|
#elif defined(HAVE_SYS_ISA_DEFS_H) || __has_include(<sys/isa_defs.h>)
|
||||||
|
#include <sys/isa_defs.h>
|
||||||
|
#elif (defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_ENDIAN_H)) || \
|
||||||
|
(__has_include(<sys/types.h>) && __has_include(<sys/endian.h>))
|
||||||
|
#include <sys/endian.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#elif defined(__bsdi__) || defined(__DragonFly__) || defined(__FreeBSD__) || \
|
||||||
|
defined(__NETBSD__) || defined(__NetBSD__) || \
|
||||||
|
defined(HAVE_SYS_PARAM_H) || __has_include(<sys/param.h>)
|
||||||
|
#include <sys/param.h>
|
||||||
|
#endif /* OS */
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
/* clang-format on */
|
||||||
|
|
||||||
|
#if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && defined(__BIG_ENDIAN)
|
||||||
|
#define __ORDER_LITTLE_ENDIAN__ __LITTLE_ENDIAN
|
||||||
|
#define __ORDER_BIG_ENDIAN__ __BIG_ENDIAN
|
||||||
|
#define __BYTE_ORDER__ __BYTE_ORDER
|
||||||
|
#elif defined(_BYTE_ORDER) && defined(_LITTLE_ENDIAN) && defined(_BIG_ENDIAN)
|
||||||
|
#define __ORDER_LITTLE_ENDIAN__ _LITTLE_ENDIAN
|
||||||
|
#define __ORDER_BIG_ENDIAN__ _BIG_ENDIAN
|
||||||
|
#define __BYTE_ORDER__ _BYTE_ORDER
|
||||||
|
#else
|
||||||
|
#define __ORDER_LITTLE_ENDIAN__ 1234
|
||||||
|
#define __ORDER_BIG_ENDIAN__ 4321
|
||||||
|
|
||||||
|
#if defined(__LITTLE_ENDIAN__) || \
|
||||||
|
(defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)) || \
|
||||||
|
defined(__ARMEL__) || defined(__THUMBEL__) || defined(__AARCH64EL__) || \
|
||||||
|
defined(__MIPSEL__) || defined(_MIPSEL) || defined(__MIPSEL) || \
|
||||||
|
defined(_M_ARM) || defined(_M_ARM64) || defined(__e2k__) || \
|
||||||
|
defined(__elbrus_4c__) || defined(__elbrus_8c__) || defined(__bfin__) || \
|
||||||
|
defined(__BFIN__) || defined(__ia64__) || defined(_IA64) || \
|
||||||
|
defined(__IA64__) || defined(__ia64) || defined(_M_IA64) || \
|
||||||
|
defined(__itanium__) || defined(__ia32__) || defined(__CYGWIN__) || \
|
||||||
|
defined(_WIN64) || defined(_WIN32) || defined(__TOS_WIN__) || \
|
||||||
|
defined(__WINDOWS__)
|
||||||
|
#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
|
||||||
|
|
||||||
|
#elif defined(__BIG_ENDIAN__) || \
|
||||||
|
(defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)) || \
|
||||||
|
defined(__ARMEB__) || defined(__THUMBEB__) || defined(__AARCH64EB__) || \
|
||||||
|
defined(__MIPSEB__) || defined(_MIPSEB) || defined(__MIPSEB) || \
|
||||||
|
defined(__m68k__) || defined(M68000) || defined(__hppa__) || \
|
||||||
|
defined(__hppa) || defined(__HPPA__) || defined(__sparc__) || \
|
||||||
|
defined(__sparc) || defined(__370__) || defined(__THW_370__) || \
|
||||||
|
defined(__s390__) || defined(__s390x__) || defined(__SYSC_ZARCH__)
|
||||||
|
#define __BYTE_ORDER__ __ORDER_BIG_ENDIAN__
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error __BYTE_ORDER__ should be defined.
|
||||||
|
#endif /* Arch */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif /* __BYTE_ORDER__ || __ORDER_LITTLE_ENDIAN__ || __ORDER_BIG_ENDIAN__ */
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* Memory/Compiler barriers, cache coherence */
|
||||||
|
|
||||||
|
static __maybe_unused __inline void mdbx_compiler_barrier(void) {
|
||||||
|
#if defined(__clang__) || defined(__GNUC__)
|
||||||
|
__asm__ __volatile__("" ::: "memory");
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
_ReadWriteBarrier();
|
||||||
|
#elif defined(__INTEL_COMPILER) /* LY: Intel Compiler may mimic GCC and MSC */
|
||||||
|
__memory_barrier();
|
||||||
|
if (type > MDBX_BARRIER_COMPILER)
|
||||||
|
#if defined(__ia64__) || defined(__ia64) || defined(_M_IA64)
|
||||||
|
__mf();
|
||||||
|
#elif defined(__i386__) || defined(__x86_64__)
|
||||||
|
_mm_mfence();
|
||||||
|
#else
|
||||||
|
#error "Unknown target for Intel Compiler, please report to us."
|
||||||
|
#endif
|
||||||
|
#elif defined(__SUNPRO_C) || defined(__sun) || defined(sun)
|
||||||
|
__compiler_barrier();
|
||||||
|
#elif (defined(_HPUX_SOURCE) || defined(__hpux) || defined(__HP_aCC)) && \
|
||||||
|
(defined(HP_IA64) || defined(__ia64))
|
||||||
|
_Asm_sched_fence(/* LY: no-arg meaning 'all expect ALU', e.g. 0x3D3D */);
|
||||||
|
#elif defined(_AIX) || defined(__ppc__) || defined(__powerpc__) || \
|
||||||
|
defined(__ppc64__) || defined(__powerpc64__)
|
||||||
|
__fence();
|
||||||
|
#else
|
||||||
|
#error "Could not guess the kind of compiler, please report to us."
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __maybe_unused __inline void mdbx_memory_barrier(void) {
|
||||||
|
#if __has_extension(c_atomic) || __has_extension(cxx_atomic)
|
||||||
|
__c11_atomic_thread_fence(__ATOMIC_SEQ_CST);
|
||||||
|
#elif defined(__ATOMIC_SEQ_CST)
|
||||||
|
__atomic_thread_fence(__ATOMIC_SEQ_CST);
|
||||||
|
#elif defined(__clang__) || defined(__GNUC__)
|
||||||
|
__sync_synchronize();
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
MemoryBarrier();
|
||||||
|
#elif defined(__INTEL_COMPILER) /* LY: Intel Compiler may mimic GCC and MSC */
|
||||||
|
#if defined(__ia64__) || defined(__ia64) || defined(_M_IA64)
|
||||||
|
__mf();
|
||||||
|
#elif defined(__i386__) || defined(__x86_64__)
|
||||||
|
_mm_mfence();
|
||||||
|
#else
|
||||||
|
#error "Unknown target for Intel Compiler, please report to us."
|
||||||
|
#endif
|
||||||
|
#elif defined(__SUNPRO_C) || defined(__sun) || defined(sun)
|
||||||
|
__machine_rw_barrier();
|
||||||
|
#elif (defined(_HPUX_SOURCE) || defined(__hpux) || defined(__HP_aCC)) && \
|
||||||
|
(defined(HP_IA64) || defined(__ia64))
|
||||||
|
_Asm_mf();
|
||||||
|
#elif defined(_AIX) || defined(__ppc__) || defined(__powerpc__) || \
|
||||||
|
defined(__ppc64__) || defined(__powerpc64__)
|
||||||
|
__lwsync();
|
||||||
|
#else
|
||||||
|
#error "Could not guess the kind of compiler, please report to us."
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* Cache coherence and invalidation */
|
||||||
|
|
||||||
|
#ifndef MDBX_CPU_WRITEBACK_IS_COHERENT
|
||||||
|
#if defined(__ia32__) || defined(__e2k__) || defined(__hppa) || \
|
||||||
|
defined(__hppa__)
|
||||||
|
#define MDBX_CPU_WRITEBACK_IS_COHERENT 1
|
||||||
|
#else
|
||||||
|
#define MDBX_CPU_WRITEBACK_IS_COHERENT 0
|
||||||
|
#endif
|
||||||
|
#endif /* MDBX_CPU_WRITEBACK_IS_COHERENT */
|
||||||
|
|
||||||
|
#ifndef MDBX_CACHELINE_SIZE
|
||||||
|
#if defined(SYSTEM_CACHE_ALIGNMENT_SIZE)
|
||||||
|
#define MDBX_CACHELINE_SIZE SYSTEM_CACHE_ALIGNMENT_SIZE
|
||||||
|
#elif defined(__ia64__) || defined(__ia64) || defined(_M_IA64)
|
||||||
|
#define MDBX_CACHELINE_SIZE 128
|
||||||
|
#else
|
||||||
|
#define MDBX_CACHELINE_SIZE 64
|
||||||
|
#endif
|
||||||
|
#endif /* MDBX_CACHELINE_SIZE */
|
||||||
|
|
||||||
|
#if MDBX_CPU_WRITEBACK_IS_COHERENT
|
||||||
|
#define mdbx_flush_noncoherent_cpu_writeback() mdbx_compiler_barrier()
|
||||||
|
#else
|
||||||
|
#define mdbx_flush_noncoherent_cpu_writeback() mdbx_memory_barrier()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __has_include(<sys/cachectl.h>)
|
||||||
|
#include <sys/cachectl.h>
|
||||||
|
#elif defined(__mips) || defined(__mips__) || defined(__mips64) || \
|
||||||
|
defined(__mips64__) || defined(_M_MRX000) || defined(_MIPS_) || \
|
||||||
|
defined(__MWERKS__) || defined(__sgi)
|
||||||
|
/* MIPS should have explicit cache control */
|
||||||
|
#include <sys/cachectl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MDBX_CPU_CACHE_MMAP_NONCOHERENT
|
||||||
|
#if defined(__mips) || defined(__mips__) || defined(__mips64) || \
|
||||||
|
defined(__mips64__) || defined(_M_MRX000) || defined(_MIPS_) || \
|
||||||
|
defined(__MWERKS__) || defined(__sgi)
|
||||||
|
/* MIPS has cache coherency issues. */
|
||||||
|
#define MDBX_CPU_CACHE_MMAP_NONCOHERENT 1
|
||||||
|
#else
|
||||||
|
/* LY: assume no relevant mmap/dcache issues. */
|
||||||
|
#define MDBX_CPU_CACHE_MMAP_NONCOHERENT 0
|
||||||
|
#endif
|
||||||
|
#endif /* ndef MDBX_CPU_CACHE_MMAP_NONCOHERENT */
|
||||||
|
|
||||||
|
static __maybe_unused __inline void
|
||||||
|
mdbx_invalidate_mmap_noncoherent_cache(void *addr, size_t nbytes) {
|
||||||
|
#if MDBX_CPU_CACHE_MMAP_NONCOHERENT
|
||||||
|
#ifdef DCACHE
|
||||||
|
/* MIPS has cache coherency issues.
|
||||||
|
* Note: for any nbytes >= on-chip cache size, entire is flushed. */
|
||||||
|
cacheflush(addr, nbytes, DCACHE);
|
||||||
|
#else
|
||||||
|
#error "Oops, cacheflush() not available"
|
||||||
|
#endif /* DCACHE */
|
||||||
|
#else /* MDBX_CPU_CACHE_MMAP_NONCOHERENT */
|
||||||
|
(void)addr;
|
||||||
|
(void)nbytes;
|
||||||
|
#endif /* MDBX_CPU_CACHE_MMAP_NONCOHERENT */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* libc compatibility stuff */
|
||||||
|
|
||||||
|
#if (!defined(__GLIBC__) && __GLIBC_PREREQ(2, 1)) && \
|
||||||
|
(defined(_GNU_SOURCE) || defined(_BSD_SOURCE))
|
||||||
|
#define mdbx_asprintf asprintf
|
||||||
|
#define mdbx_vasprintf vasprintf
|
||||||
|
#else
|
||||||
|
MDBX_INTERNAL_FUNC __printf_args(2, 3) int __maybe_unused
|
||||||
|
mdbx_asprintf(char **strp, const char *fmt, ...);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_vasprintf(char **strp, const char *fmt, va_list ap);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* OS abstraction layer stuff */
|
||||||
|
|
||||||
|
/* max bytes to write in one call */
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
#define MAX_WRITE UINT32_C(0x01000000)
|
||||||
|
#else
|
||||||
|
#define MAX_WRITE UINT32_C(0x3fff0000)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__linux__) || defined(__gnu_linux__)
|
||||||
|
MDBX_INTERNAL_VAR uint32_t mdbx_linux_kernel_version;
|
||||||
|
#endif /* Linux */
|
||||||
|
|
||||||
|
/* Get the size of a memory page for the system.
|
||||||
|
* This is the basic size that the platform's memory manager uses, and is
|
||||||
|
* fundamental to the use of memory-mapped files. */
|
||||||
|
static __maybe_unused __inline size_t mdbx_syspagesize(void) {
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
SYSTEM_INFO si;
|
||||||
|
GetSystemInfo(&si);
|
||||||
|
return si.dwPageSize;
|
||||||
|
#else
|
||||||
|
return sysconf(_SC_PAGE_SIZE);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef mdbx_strdup
|
||||||
|
LIBMDBX_API char *mdbx_strdup(const char *str);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static __maybe_unused __inline int mdbx_get_errno(void) {
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
DWORD rc = GetLastError();
|
||||||
|
#else
|
||||||
|
int rc = errno;
|
||||||
|
#endif
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef mdbx_memalign_alloc
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_memalign_alloc(size_t alignment, size_t bytes,
|
||||||
|
void **result);
|
||||||
|
#endif
|
||||||
|
#ifndef mdbx_memalign_free
|
||||||
|
MDBX_INTERNAL_FUNC void mdbx_memalign_free(void *ptr);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_condmutex_init(mdbx_condmutex_t *condmutex);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_condmutex_lock(mdbx_condmutex_t *condmutex);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_condmutex_unlock(mdbx_condmutex_t *condmutex);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_condmutex_signal(mdbx_condmutex_t *condmutex);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_condmutex_wait(mdbx_condmutex_t *condmutex);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_condmutex_destroy(mdbx_condmutex_t *condmutex);
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_fastmutex_init(mdbx_fastmutex_t *fastmutex);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_fastmutex_acquire(mdbx_fastmutex_t *fastmutex);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_fastmutex_release(mdbx_fastmutex_t *fastmutex);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_fastmutex_destroy(mdbx_fastmutex_t *fastmutex);
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_pwritev(mdbx_filehandle_t fd, struct iovec *iov,
|
||||||
|
int iovcnt, uint64_t offset,
|
||||||
|
size_t expected_written);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_pread(mdbx_filehandle_t fd, void *buf, size_t count,
|
||||||
|
uint64_t offset);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_pwrite(mdbx_filehandle_t fd, const void *buf,
|
||||||
|
size_t count, uint64_t offset);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_write(mdbx_filehandle_t fd, const void *buf,
|
||||||
|
size_t count);
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int
|
||||||
|
mdbx_thread_create(mdbx_thread_t *thread,
|
||||||
|
THREAD_RESULT(THREAD_CALL *start_routine)(void *),
|
||||||
|
void *arg);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_thread_join(mdbx_thread_t thread);
|
||||||
|
|
||||||
|
enum mdbx_syncmode_bits {
|
||||||
|
MDBX_SYNC_DATA = 1,
|
||||||
|
MDBX_SYNC_SIZE = 2,
|
||||||
|
MDBX_SYNC_IODQ = 4
|
||||||
|
};
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_filesync(mdbx_filehandle_t fd,
|
||||||
|
enum mdbx_syncmode_bits mode_bits);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_ftruncate(mdbx_filehandle_t fd, uint64_t length);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_fseek(mdbx_filehandle_t fd, uint64_t pos);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_filesize(mdbx_filehandle_t fd, uint64_t *length);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_openfile(const char *pathname, int flags,
|
||||||
|
mode_t mode, mdbx_filehandle_t *fd,
|
||||||
|
bool exclusive);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_closefile(mdbx_filehandle_t fd);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_removefile(const char *pathname);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_is_pipe(mdbx_filehandle_t fd);
|
||||||
|
|
||||||
|
typedef struct mdbx_mmap_param {
|
||||||
|
union {
|
||||||
|
void *address;
|
||||||
|
uint8_t *dxb;
|
||||||
|
struct MDBX_lockinfo *lck;
|
||||||
|
};
|
||||||
|
mdbx_filehandle_t fd;
|
||||||
|
size_t limit; /* mapping length, but NOT a size of file nor DB */
|
||||||
|
size_t current; /* mapped region size, i.e. the size of file and DB */
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
uint64_t filesize /* in-process cache of a file size. */;
|
||||||
|
#endif
|
||||||
|
#ifdef MDBX_OSAL_SECTION
|
||||||
|
MDBX_OSAL_SECTION section;
|
||||||
|
#endif
|
||||||
|
} mdbx_mmap_t;
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_mmap(const int flags, mdbx_mmap_t *map,
|
||||||
|
const size_t must, const size_t limit,
|
||||||
|
const bool truncate);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_munmap(mdbx_mmap_t *map);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_mresize(int flags, mdbx_mmap_t *map, size_t current,
|
||||||
|
size_t wanna);
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
typedef struct {
|
||||||
|
unsigned limit, count;
|
||||||
|
HANDLE handles[31];
|
||||||
|
} mdbx_handle_array_t;
|
||||||
|
MDBX_INTERNAL_FUNC int
|
||||||
|
mdbx_suspend_threads_before_remap(MDBX_env *env, mdbx_handle_array_t **array);
|
||||||
|
MDBX_INTERNAL_FUNC int
|
||||||
|
mdbx_resume_threads_after_remap(mdbx_handle_array_t *array);
|
||||||
|
#endif /* Windows */
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_msync(mdbx_mmap_t *map, size_t offset,
|
||||||
|
size_t length, int async);
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_check4nonlocal(mdbx_filehandle_t handle, int flags);
|
||||||
|
|
||||||
|
static __maybe_unused __inline uint32_t mdbx_getpid(void) {
|
||||||
|
STATIC_ASSERT(sizeof(mdbx_pid_t) <= sizeof(uint32_t));
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
return GetCurrentProcessId();
|
||||||
|
#else
|
||||||
|
return getpid();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __maybe_unused __inline size_t mdbx_thread_self(void) {
|
||||||
|
STATIC_ASSERT(sizeof(mdbx_tid_t) <= sizeof(size_t));
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
return GetCurrentThreadId();
|
||||||
|
#else
|
||||||
|
return (size_t)pthread_self();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC void __maybe_unused mdbx_osal_jitter(bool tiny);
|
||||||
|
MDBX_INTERNAL_FUNC uint64_t mdbx_osal_monotime(void);
|
||||||
|
MDBX_INTERNAL_FUNC uint64_t
|
||||||
|
mdbx_osal_16dot16_to_monotime(uint32_t seconds_16dot16);
|
||||||
|
MDBX_INTERNAL_FUNC uint32_t mdbx_osal_monotime_to_16dot16(uint64_t monotime);
|
||||||
|
|
||||||
|
typedef union bin128 {
|
||||||
|
__anonymous_struct_extension__ struct { uint64_t x, y; };
|
||||||
|
__anonymous_struct_extension__ struct { uint32_t a, b, c, d; };
|
||||||
|
} bin128_t;
|
||||||
|
|
||||||
|
MDBX_INTERNAL_FUNC bin128_t mdbx_osal_bootid(void);
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* lck stuff */
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
#undef MDBX_OSAL_LOCK
|
||||||
|
#define MDBX_OSAL_LOCK_SIGN UINT32_C(0xF10C)
|
||||||
|
#else
|
||||||
|
#define MDBX_OSAL_LOCK pthread_mutex_t
|
||||||
|
#define MDBX_OSAL_LOCK_SIGN UINT32_C(0x8017)
|
||||||
|
#endif /* MDBX_OSAL_LOCK */
|
||||||
|
|
||||||
|
/// \brief Initialization of synchronization primitives linked with MDBX_env
|
||||||
|
/// instance both in LCK-file and within the current process.
|
||||||
|
/// \param
|
||||||
|
/// global_uniqueness_flag = true - denotes that there are no other processes
|
||||||
|
/// working with DB and LCK-file. Thus the function MUST initialize
|
||||||
|
/// shared synchronization objects in memory-mapped LCK-file.
|
||||||
|
/// global_uniqueness_flag = false - denotes that at least one process is
|
||||||
|
/// already working with DB and LCK-file, including the case when DB
|
||||||
|
/// has already been opened in the current process. Thus the function
|
||||||
|
/// MUST NOT initialize shared synchronization objects in memory-mapped
|
||||||
|
/// LCK-file that are already in use.
|
||||||
|
/// \return Error code or zero on success.
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_lck_init(MDBX_env *env,
|
||||||
|
MDBX_env *inprocess_neighbor,
|
||||||
|
int global_uniqueness_flag);
|
||||||
|
|
||||||
|
/// \brief Disconnects from shared interprocess objects and destructs
|
||||||
|
/// synchronization objects linked with MDBX_env instance
|
||||||
|
/// within the current process.
|
||||||
|
/// \param
|
||||||
|
/// inprocess_neighbor = NULL - if the current process does not have other
|
||||||
|
/// instances of MDBX_env linked with the DB being closed.
|
||||||
|
/// Thus the function MUST check for other processes working with DB or
|
||||||
|
/// LCK-file, and keep or destroy shared synchronization objects in
|
||||||
|
/// memory-mapped LCK-file depending on the result.
|
||||||
|
/// inprocess_neighbor = not-NULL - pointer to another instance of MDBX_env
|
||||||
|
/// (anyone of there is several) working with DB or LCK-file within the
|
||||||
|
/// current process. Thus the function MUST NOT try to acquire exclusive
|
||||||
|
/// lock and/or try to destruct shared synchronization objects linked with
|
||||||
|
/// DB or LCK-file. Moreover, the implementation MUST ensure correct work
|
||||||
|
/// of other instances of MDBX_env within the current process, e.g.
|
||||||
|
/// restore POSIX-fcntl locks after the closing of file descriptors.
|
||||||
|
/// \return Error code (MDBX_PANIC) or zero on success.
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_lck_destroy(MDBX_env *env,
|
||||||
|
MDBX_env *inprocess_neighbor);
|
||||||
|
|
||||||
|
/// \brief Connects to shared interprocess locking objects and tries to acquire
|
||||||
|
/// the maximum lock level (shared if exclusive is not available)
|
||||||
|
/// Depending on implementation or/and platform (Windows) this function may
|
||||||
|
/// acquire the non-OS super-level lock (e.g. for shared synchronization
|
||||||
|
/// objects initialization), which will be downgraded to OS-exclusive or
|
||||||
|
/// shared via explicit calling of mdbx_lck_downgrade().
|
||||||
|
/// \return
|
||||||
|
/// MDBX_RESULT_TRUE (-1) - if an exclusive lock was acquired and thus
|
||||||
|
/// the current process is the first and only after the last use of DB.
|
||||||
|
/// MDBX_RESULT_FALSE (0) - if a shared lock was acquired and thus
|
||||||
|
/// DB has already been opened and now is used by other processes.
|
||||||
|
/// Otherwise (not 0 and not -1) - error code.
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_lck_seize(MDBX_env *env);
|
||||||
|
|
||||||
|
/// \brief Downgrades the level of initially acquired lock to
|
||||||
|
/// operational level specified by agrument. The reson for such downgrade:
|
||||||
|
/// - unblocking of other processes that are waiting for access, i.e.
|
||||||
|
/// if (env->me_flags & MDBX_EXCLUSIVE) != 0, then other processes
|
||||||
|
/// should be made aware that access is unavailable rather than
|
||||||
|
/// wait for it.
|
||||||
|
/// - freeing locks that interfere file operation (expecially for Windows)
|
||||||
|
/// (env->me_flags & MDBX_EXCLUSIVE) == 0 - downgrade to shared lock.
|
||||||
|
/// (env->me_flags & MDBX_EXCLUSIVE) != 0 - downgrade to exclusive
|
||||||
|
/// operational lock.
|
||||||
|
/// \return Error code or zero on success
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_lck_downgrade(MDBX_env *env);
|
||||||
|
|
||||||
|
/// \brief Locks LCK-file or/and table of readers for (de)registering.
|
||||||
|
/// \return Error code or zero on success
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_rdt_lock(MDBX_env *env);
|
||||||
|
|
||||||
|
/// \brief Unlocks LCK-file or/and table of readers after (de)registering.
|
||||||
|
MDBX_INTERNAL_FUNC void mdbx_rdt_unlock(MDBX_env *env);
|
||||||
|
|
||||||
|
/// \brief Acquires lock for DB change (on writing transaction start)
|
||||||
|
/// Reading transactions will not be blocked.
|
||||||
|
/// Declared as LIBMDBX_API because it is used in mdbx_chk.
|
||||||
|
/// \return Error code or zero on success
|
||||||
|
LIBMDBX_API int mdbx_txn_lock(MDBX_env *env, bool dontwait);
|
||||||
|
|
||||||
|
/// \brief Releases lock once DB changes is made (after writing transaction
|
||||||
|
/// has finished).
|
||||||
|
/// Declared as LIBMDBX_API because it is used in mdbx_chk.
|
||||||
|
LIBMDBX_API void mdbx_txn_unlock(MDBX_env *env);
|
||||||
|
|
||||||
|
/// \brief Sets alive-flag of reader presence (indicative lock) for PID of
|
||||||
|
/// the current process. The function does no more than needed for
|
||||||
|
/// the correct working of mdbx_rpid_check() in other processes.
|
||||||
|
/// \return Error code or zero on success
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_rpid_set(MDBX_env *env);
|
||||||
|
|
||||||
|
/// \brief Resets alive-flag of reader presence (indicative lock)
|
||||||
|
/// for PID of the current process. The function does no more than needed
|
||||||
|
/// for the correct working of mdbx_rpid_check() in other processes.
|
||||||
|
/// \return Error code or zero on success
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_rpid_clear(MDBX_env *env);
|
||||||
|
|
||||||
|
/// \brief Checks for reading process status with the given pid with help of
|
||||||
|
/// alive-flag of presence (indicative lock) or using another way.
|
||||||
|
/// \return
|
||||||
|
/// MDBX_RESULT_TRUE (-1) - if the reader process with the given PID is alive
|
||||||
|
/// and working with DB (indicative lock is present).
|
||||||
|
/// MDBX_RESULT_FALSE (0) - if the reader process with the given PID is absent
|
||||||
|
/// or not working with DB (indicative lock is not present).
|
||||||
|
/// Otherwise (not 0 and not -1) - error code.
|
||||||
|
MDBX_INTERNAL_FUNC int mdbx_rpid_check(MDBX_env *env, uint32_t pid);
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
typedef union MDBX_srwlock {
|
||||||
|
struct {
|
||||||
|
long volatile readerCount;
|
||||||
|
long volatile writerCount;
|
||||||
|
};
|
||||||
|
RTL_SRWLOCK native;
|
||||||
|
} MDBX_srwlock;
|
||||||
|
|
||||||
|
typedef void(WINAPI *MDBX_srwlock_function)(MDBX_srwlock *);
|
||||||
|
MDBX_INTERNAL_VAR MDBX_srwlock_function mdbx_srwlock_Init,
|
||||||
|
mdbx_srwlock_AcquireShared, mdbx_srwlock_ReleaseShared,
|
||||||
|
mdbx_srwlock_AcquireExclusive, mdbx_srwlock_ReleaseExclusive;
|
||||||
|
|
||||||
|
typedef BOOL(WINAPI *MDBX_GetFileInformationByHandleEx)(
|
||||||
|
_In_ HANDLE hFile, _In_ FILE_INFO_BY_HANDLE_CLASS FileInformationClass,
|
||||||
|
_Out_ LPVOID lpFileInformation, _In_ DWORD dwBufferSize);
|
||||||
|
MDBX_INTERNAL_VAR MDBX_GetFileInformationByHandleEx
|
||||||
|
mdbx_GetFileInformationByHandleEx;
|
||||||
|
|
||||||
|
typedef BOOL(WINAPI *MDBX_GetVolumeInformationByHandleW)(
|
||||||
|
_In_ HANDLE hFile, _Out_opt_ LPWSTR lpVolumeNameBuffer,
|
||||||
|
_In_ DWORD nVolumeNameSize, _Out_opt_ LPDWORD lpVolumeSerialNumber,
|
||||||
|
_Out_opt_ LPDWORD lpMaximumComponentLength,
|
||||||
|
_Out_opt_ LPDWORD lpFileSystemFlags,
|
||||||
|
_Out_opt_ LPWSTR lpFileSystemNameBuffer, _In_ DWORD nFileSystemNameSize);
|
||||||
|
MDBX_INTERNAL_VAR MDBX_GetVolumeInformationByHandleW
|
||||||
|
mdbx_GetVolumeInformationByHandleW;
|
||||||
|
|
||||||
|
typedef DWORD(WINAPI *MDBX_GetFinalPathNameByHandleW)(_In_ HANDLE hFile,
|
||||||
|
_Out_ LPWSTR lpszFilePath,
|
||||||
|
_In_ DWORD cchFilePath,
|
||||||
|
_In_ DWORD dwFlags);
|
||||||
|
MDBX_INTERNAL_VAR MDBX_GetFinalPathNameByHandleW mdbx_GetFinalPathNameByHandleW;
|
||||||
|
|
||||||
|
typedef BOOL(WINAPI *MDBX_SetFileInformationByHandle)(
|
||||||
|
_In_ HANDLE hFile, _In_ FILE_INFO_BY_HANDLE_CLASS FileInformationClass,
|
||||||
|
_Out_ LPVOID lpFileInformation, _In_ DWORD dwBufferSize);
|
||||||
|
MDBX_INTERNAL_VAR MDBX_SetFileInformationByHandle
|
||||||
|
mdbx_SetFileInformationByHandle;
|
||||||
|
|
||||||
|
typedef NTSTATUS(NTAPI *MDBX_NtFsControlFile)(
|
||||||
|
IN HANDLE FileHandle, IN OUT HANDLE Event,
|
||||||
|
IN OUT PVOID /* PIO_APC_ROUTINE */ ApcRoutine, IN OUT PVOID ApcContext,
|
||||||
|
OUT PIO_STATUS_BLOCK IoStatusBlock, IN ULONG FsControlCode,
|
||||||
|
IN OUT PVOID InputBuffer, IN ULONG InputBufferLength,
|
||||||
|
OUT OPTIONAL PVOID OutputBuffer, IN ULONG OutputBufferLength);
|
||||||
|
MDBX_INTERNAL_VAR MDBX_NtFsControlFile mdbx_NtFsControlFile;
|
||||||
|
|
||||||
|
typedef uint64_t(WINAPI *MDBX_GetTickCount64)(void);
|
||||||
|
MDBX_INTERNAL_VAR MDBX_GetTickCount64 mdbx_GetTickCount64;
|
||||||
|
|
||||||
|
#if !defined(_WIN32_WINNT_WIN8) || _WIN32_WINNT < _WIN32_WINNT_WIN8
|
||||||
|
typedef struct _WIN32_MEMORY_RANGE_ENTRY {
|
||||||
|
PVOID VirtualAddress;
|
||||||
|
SIZE_T NumberOfBytes;
|
||||||
|
} WIN32_MEMORY_RANGE_ENTRY, *PWIN32_MEMORY_RANGE_ENTRY;
|
||||||
|
#endif /* Windows 8.x */
|
||||||
|
|
||||||
|
typedef BOOL(WINAPI *MDBX_PrefetchVirtualMemory)(
|
||||||
|
HANDLE hProcess, ULONG_PTR NumberOfEntries,
|
||||||
|
PWIN32_MEMORY_RANGE_ENTRY VirtualAddresses, ULONG Flags);
|
||||||
|
MDBX_INTERNAL_VAR MDBX_PrefetchVirtualMemory mdbx_PrefetchVirtualMemory;
|
||||||
|
|
||||||
|
#if 0 /* LY: unused for now */
|
||||||
|
#if !defined(_WIN32_WINNT_WIN81) || _WIN32_WINNT < _WIN32_WINNT_WIN81
|
||||||
|
typedef enum OFFER_PRIORITY {
|
||||||
|
VmOfferPriorityVeryLow = 1,
|
||||||
|
VmOfferPriorityLow,
|
||||||
|
VmOfferPriorityBelowNormal,
|
||||||
|
VmOfferPriorityNormal
|
||||||
|
} OFFER_PRIORITY;
|
||||||
|
#endif /* Windows 8.1 */
|
||||||
|
|
||||||
|
typedef DWORD(WINAPI *MDBX_DiscardVirtualMemory)(PVOID VirtualAddress,
|
||||||
|
SIZE_T Size);
|
||||||
|
MDBX_INTERNAL_VAR MDBX_DiscardVirtualMemory mdbx_DiscardVirtualMemory;
|
||||||
|
|
||||||
|
typedef DWORD(WINAPI *MDBX_ReclaimVirtualMemory)(PVOID VirtualAddress,
|
||||||
|
SIZE_T Size);
|
||||||
|
MDBX_INTERNAL_VAR MDBX_ReclaimVirtualMemory mdbx_ReclaimVirtualMemory;
|
||||||
|
|
||||||
|
typedef DWORD(WINAPI *MDBX_OfferVirtualMemory(
|
||||||
|
PVOID VirtualAddress,
|
||||||
|
SIZE_T Size,
|
||||||
|
OFFER_PRIORITY Priority
|
||||||
|
);
|
||||||
|
MDBX_INTERNAL_VAR MDBX_OfferVirtualMemory mdbx_OfferVirtualMemory;
|
||||||
|
#endif /* unused for now */
|
||||||
|
|
||||||
|
#endif /* Windows */
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* Atomics */
|
||||||
|
|
||||||
|
#if !defined(__cplusplus) && (__STDC_VERSION__ >= 201112L) && \
|
||||||
|
!defined(__STDC_NO_ATOMICS__) && \
|
||||||
|
(__GNUC_PREREQ(4, 9) || __CLANG_PREREQ(3, 8) || \
|
||||||
|
!(defined(__GNUC__) || defined(__clang__)))
|
||||||
|
#include <stdatomic.h>
|
||||||
|
#elif defined(__GNUC__) || defined(__clang__)
|
||||||
|
/* LY: nothing required */
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
#pragma warning(disable : 4163) /* 'xyz': not available as an intrinsic */
|
||||||
|
#pragma warning(disable : 4133) /* 'function': incompatible types - from \
|
||||||
|
'size_t' to 'LONGLONG' */
|
||||||
|
#pragma warning(disable : 4244) /* 'return': conversion from 'LONGLONG' to \
|
||||||
|
'std::size_t', possible loss of data */
|
||||||
|
#pragma warning(disable : 4267) /* 'function': conversion from 'size_t' to \
|
||||||
|
'long', possible loss of data */
|
||||||
|
#pragma intrinsic(_InterlockedExchangeAdd, _InterlockedCompareExchange)
|
||||||
|
#pragma intrinsic(_InterlockedExchangeAdd64, _InterlockedCompareExchange64)
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
#include <libkern/OSAtomic.h>
|
||||||
|
#else
|
||||||
|
#error FIXME atomic-ops
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) && _MSC_VER >= 1900
|
||||||
|
/* LY: MSVC 2015/2017/2019 has buggy/inconsistent PRIuPTR/PRIxPTR macros
|
||||||
|
* for internal format-args checker. */
|
||||||
|
#undef PRIuPTR
|
||||||
|
#undef PRIiPTR
|
||||||
|
#undef PRIdPTR
|
||||||
|
#undef PRIxPTR
|
||||||
|
#define PRIuPTR "Iu"
|
||||||
|
#define PRIiPTR "Ii"
|
||||||
|
#define PRIdPTR "Id"
|
||||||
|
#define PRIxPTR "Ix"
|
||||||
|
#define PRIuSIZE "zu"
|
||||||
|
#define PRIiSIZE "zi"
|
||||||
|
#define PRIdSIZE "zd"
|
||||||
|
#define PRIxSIZE "zx"
|
||||||
|
#endif /* fix PRI*PTR for _MSC_VER */
|
||||||
|
|
||||||
|
#ifndef PRIuSIZE
|
||||||
|
#define PRIuSIZE PRIuPTR
|
||||||
|
#define PRIiSIZE PRIiPTR
|
||||||
|
#define PRIdSIZE PRIdPTR
|
||||||
|
#define PRIxSIZE PRIxPTR
|
||||||
|
#endif /* PRI*SIZE macros for MSVC */
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
46
contrib/db/libmdbx/src/elements/version.c.in
Normal file
46
contrib/db/libmdbx/src/elements/version.c.in
Normal file
|
|
@ -0,0 +1,46 @@
|
||||||
|
/* This is CMake-template for libmdbx's version.c
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#include "internals.h"
|
||||||
|
|
||||||
|
//#if MDBX_VERSION_MAJOR != ${MDBX_VERSION_MAJOR} || \
|
||||||
|
// MDBX_VERSION_MINOR != ${MDBX_VERSION_MINOR}
|
||||||
|
//#error "API version mismatch! Had `git fetch --tags` done?"
|
||||||
|
//#endif
|
||||||
|
|
||||||
|
static const char sourcery[] = STRINGIFY(MDBX_BUILD_SOURCERY);
|
||||||
|
|
||||||
|
__dll_export
|
||||||
|
#ifdef __attribute_used__
|
||||||
|
__attribute_used__
|
||||||
|
#elif defined(__GNUC__) || __has_attribute(__used__)
|
||||||
|
__attribute__((__used__))
|
||||||
|
#endif
|
||||||
|
#ifdef __attribute_externally_visible__
|
||||||
|
__attribute_externally_visible__
|
||||||
|
#elif (defined(__GNUC__) && !defined(__clang__)) || \
|
||||||
|
__has_attribute(__externally_visible__)
|
||||||
|
__attribute__((__externally_visible__))
|
||||||
|
#endif
|
||||||
|
const mdbx_version_info mdbx_version = {
|
||||||
|
${MDBX_VERSION_MAJOR},
|
||||||
|
${MDBX_VERSION_MINOR},
|
||||||
|
${MDBX_VERSION_RELEASE},
|
||||||
|
${MDBX_VERSION_REVISION},
|
||||||
|
{"@MDBX_GIT_TIMESTAMP@", "@MDBX_GIT_TREE@", "@MDBX_GIT_COMMIT@",
|
||||||
|
"@MDBX_GIT_DESCRIBE@"},
|
||||||
|
sourcery};
|
||||||
|
|
||||||
|
__dll_export
|
||||||
|
#ifdef __attribute_used__
|
||||||
|
__attribute_used__
|
||||||
|
#elif defined(__GNUC__) || __has_attribute(__used__)
|
||||||
|
__attribute__((__used__))
|
||||||
|
#endif
|
||||||
|
#ifdef __attribute_externally_visible__
|
||||||
|
__attribute_externally_visible__
|
||||||
|
#elif (defined(__GNUC__) && !defined(__clang__)) || \
|
||||||
|
__has_attribute(__externally_visible__)
|
||||||
|
__attribute__((__externally_visible__))
|
||||||
|
#endif
|
||||||
|
const char *const mdbx_sourcery_anchor = sourcery;
|
||||||
87
contrib/db/libmdbx/src/man1/mdbx_chk.1
Normal file
87
contrib/db/libmdbx/src/man1/mdbx_chk.1
Normal file
|
|
@ -0,0 +1,87 @@
|
||||||
|
.\" Copyright 2015-2019 Leonid Yuriev <leo@yuriev.ru>.
|
||||||
|
.\" Copying restrictions apply. See COPYRIGHT/LICENSE.
|
||||||
|
.TH MDBX_CHK 1 "2019-09-10" "MDBX 0.x"
|
||||||
|
.SH NAME
|
||||||
|
mdbx_chk \- MDBX checking tool
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B mdbx_chk
|
||||||
|
[\c
|
||||||
|
.BR \-V ]
|
||||||
|
[\c
|
||||||
|
.BR \-v [ v [ v ]]]
|
||||||
|
[\c
|
||||||
|
.BR \-n ]
|
||||||
|
[\c
|
||||||
|
.BR \-q ]
|
||||||
|
[\c
|
||||||
|
.BR \-w ]
|
||||||
|
[\c
|
||||||
|
.BR \-d ]
|
||||||
|
[\c
|
||||||
|
.BI \-s \ subdb\fR]
|
||||||
|
[\c
|
||||||
|
.BR \-c ]
|
||||||
|
[\c
|
||||||
|
.BR \-i ]
|
||||||
|
.BR \ envpath
|
||||||
|
.SH DESCRIPTION
|
||||||
|
The
|
||||||
|
.B mdbx_chk
|
||||||
|
utility intended to check an MDBX database file.
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
.BR \-V
|
||||||
|
Write the library version number to the standard output, and exit.
|
||||||
|
.TP
|
||||||
|
.BR \-v
|
||||||
|
Produce verbose output, including summarize space and page usage statistics.
|
||||||
|
If \fB\-vv\fP is given, be more verbose, show summarized B-tree info
|
||||||
|
and space allocation.
|
||||||
|
If \fB\-vvv\fP is given, be more verbose, include summarized statistics
|
||||||
|
of leaf B-tree pages.
|
||||||
|
If \fB\-vvvv\fP is given, be even more verbose, show info of each page
|
||||||
|
during B-tree traversal and basic info of each GC record.
|
||||||
|
If \fB\-vvvvv\fP is given, turn maximal verbosity, display the full list
|
||||||
|
of page IDs in the GC records and size of each key-value pair of database(s).
|
||||||
|
.TP
|
||||||
|
.BR \-n
|
||||||
|
Open MDBX environment(s) which do not use subdirectories.
|
||||||
|
.TP
|
||||||
|
.BR \-q
|
||||||
|
Be quiet; do not output anything even if an error was detected.
|
||||||
|
.TP
|
||||||
|
.BR \-w
|
||||||
|
Open environment in read-write mode and lock for writing while checking.
|
||||||
|
This could be impossible if environment already used by another process(s)
|
||||||
|
in an incompatible read-write mode. This allow rollback to last steady commit
|
||||||
|
(in case environment was not closed properly) and then check transaction IDs
|
||||||
|
of meta-pages. Otherwise, without \fB\-w\fP option environment will be
|
||||||
|
opened in read-only mode.
|
||||||
|
.TP
|
||||||
|
.BR \-d
|
||||||
|
Disable page-by-page traversal of B-tree. In this case, without B-tree
|
||||||
|
traversal, it is unable to check for lost-unused pages nor for double-used
|
||||||
|
pages.
|
||||||
|
.TP
|
||||||
|
.BR \-s \ subdb
|
||||||
|
Verify and show info only for a specific subdatabase.
|
||||||
|
.TP
|
||||||
|
.BR \-c
|
||||||
|
Force using cooperative mode while opening environment, i.e. don't try to open
|
||||||
|
in exclusive/monopolistic mode. Only exclusive/monopolistic mode allow complete
|
||||||
|
check, including full check of all meta-pages and actual size of database file.
|
||||||
|
.TP
|
||||||
|
.BR \-i
|
||||||
|
Ignore wrong order errors, which will likely false-positive if custom
|
||||||
|
comparator(s) was used.
|
||||||
|
.SH DIAGNOSTICS
|
||||||
|
Exit status is zero if no errors occur. Errors result in a non-zero exit status
|
||||||
|
and a diagnostic message being written to standard error
|
||||||
|
if no quiet mode was requested.
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.BR mdbx_stat (1),
|
||||||
|
.BR mdbx_copy (1),
|
||||||
|
.BR mdbx_dump (1),
|
||||||
|
.BR mdbx_load (1)
|
||||||
|
.SH AUTHOR
|
||||||
|
Leonid Yuriev <https://github.com/leo-yuriev>
|
||||||
60
contrib/db/libmdbx/src/man1/mdbx_copy.1
Normal file
60
contrib/db/libmdbx/src/man1/mdbx_copy.1
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
.\" Copyright 2015-2019 Leonid Yuriev <leo@yuriev.ru>.
|
||||||
|
.\" Copyright 2012-2015 Howard Chu, Symas Corp. All Rights Reserved.
|
||||||
|
.\" Copyright 2015,2016 Peter-Service R&D LLC <http://billing.ru/>.
|
||||||
|
.\" Copying restrictions apply. See COPYRIGHT/LICENSE.
|
||||||
|
.TH MDBX_COPY 1 "2019-09-10" "MDBX 0.x"
|
||||||
|
.SH NAME
|
||||||
|
mdbx_copy \- MDBX environment copy tool
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B mdbx_copy
|
||||||
|
[\c
|
||||||
|
.BR \-V ]
|
||||||
|
[\c
|
||||||
|
.BR \-c ]
|
||||||
|
[\c
|
||||||
|
.BR \-n ]
|
||||||
|
.B srcpath
|
||||||
|
[\c
|
||||||
|
.BR dstpath ]
|
||||||
|
.SH DESCRIPTION
|
||||||
|
The
|
||||||
|
.B mdbx_copy
|
||||||
|
utility copies an MDBX environment. The environment can
|
||||||
|
be copied regardless of whether it is currently in use.
|
||||||
|
No lockfile is created, since it gets recreated at need.
|
||||||
|
|
||||||
|
If
|
||||||
|
.I dstpath
|
||||||
|
is specified it must be the path of an empty directory
|
||||||
|
for storing the backup. Otherwise, the backup will be
|
||||||
|
written to stdout.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
.BR \-V
|
||||||
|
Write the library version number to the standard output, and exit.
|
||||||
|
.TP
|
||||||
|
.BR \-c
|
||||||
|
Compact while copying. Only current data pages will be copied; freed
|
||||||
|
or unused pages will be omitted from the copy. This option will
|
||||||
|
slow down the backup process as it is more CPU-intensive.
|
||||||
|
Currently it fails if the environment has suffered a page leak.
|
||||||
|
.TP
|
||||||
|
.BR \-n
|
||||||
|
Open MDBX environment(s) which do not use subdirectories.
|
||||||
|
|
||||||
|
.SH DIAGNOSTICS
|
||||||
|
Exit status is zero if no errors occur.
|
||||||
|
Errors result in a non-zero exit status and
|
||||||
|
a diagnostic message being written to standard error.
|
||||||
|
.SH CAVEATS
|
||||||
|
This utility can trigger significant file size growth if run
|
||||||
|
in parallel with write transactions, because pages which they
|
||||||
|
free during copying cannot be reused until the copy is done.
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.BR mdbx_dump (1),
|
||||||
|
.BR mdbx_chk (1),
|
||||||
|
.BR mdbx_stat (1),
|
||||||
|
.BR mdbx_load (1)
|
||||||
|
.SH AUTHOR
|
||||||
|
Howard Chu of Symas Corporation <http://www.symas.com>
|
||||||
80
contrib/db/libmdbx/src/man1/mdbx_dump.1
Normal file
80
contrib/db/libmdbx/src/man1/mdbx_dump.1
Normal file
|
|
@ -0,0 +1,80 @@
|
||||||
|
.\" Copyright 2015-2019 Leonid Yuriev <leo@yuriev.ru>.
|
||||||
|
.\" Copyright 2014-2015 Howard Chu, Symas Corp. All Rights Reserved.
|
||||||
|
.\" Copyright 2015,2016 Peter-Service R&D LLC <http://billing.ru/>.
|
||||||
|
.\" Copying restrictions apply. See COPYRIGHT/LICENSE.
|
||||||
|
.TH MDBX_DUMP 1 "2019-09-10" "MDBX 0.x"
|
||||||
|
.SH NAME
|
||||||
|
mdbx_dump \- MDBX environment export tool
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B mdbx_dump
|
||||||
|
[\c
|
||||||
|
.BR \-V ]
|
||||||
|
[\c
|
||||||
|
.BI \-f \ file\fR]
|
||||||
|
[\c
|
||||||
|
.BR \-l ]
|
||||||
|
[\c
|
||||||
|
.BR \-n ]
|
||||||
|
[\c
|
||||||
|
.BR \-p ]
|
||||||
|
[\c
|
||||||
|
.BR \-a \ |
|
||||||
|
.BI \-s \ subdb\fR]
|
||||||
|
.BR \ envpath
|
||||||
|
.SH DESCRIPTION
|
||||||
|
The
|
||||||
|
.B mdbx_dump
|
||||||
|
utility reads a database and writes its contents to the
|
||||||
|
standard output using a portable flat-text format
|
||||||
|
understood by the
|
||||||
|
.BR mdbx_load (1)
|
||||||
|
utility.
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
.BR \-V
|
||||||
|
Write the library version number to the standard output, and exit.
|
||||||
|
.TP
|
||||||
|
.BR \-f \ file
|
||||||
|
Write to the specified file instead of to the standard output.
|
||||||
|
.TP
|
||||||
|
.BR \-l
|
||||||
|
List the databases stored in the environment. Just the
|
||||||
|
names will be listed, no data will be output.
|
||||||
|
.TP
|
||||||
|
.BR \-n
|
||||||
|
Dump an MDBX database which does not use subdirectories.
|
||||||
|
.TP
|
||||||
|
.BR \-p
|
||||||
|
If characters in either the key or data items are printing characters (as
|
||||||
|
defined by isprint(3)), output them directly. This option permits users to
|
||||||
|
use standard text editors and tools to modify the contents of databases.
|
||||||
|
|
||||||
|
Note: different systems may have different notions about what characters
|
||||||
|
are considered printing characters, and databases dumped in this manner may
|
||||||
|
be less portable to external systems.
|
||||||
|
.TP
|
||||||
|
.BR \-a
|
||||||
|
Dump all of the subdatabases in the environment.
|
||||||
|
.TP
|
||||||
|
.BR \-s \ subdb
|
||||||
|
Dump a specific subdatabase. If no database is specified, only the main database is dumped.
|
||||||
|
.SH DIAGNOSTICS
|
||||||
|
Exit status is zero if no errors occur.
|
||||||
|
Errors result in a non-zero exit status and
|
||||||
|
a diagnostic message being written to standard error.
|
||||||
|
|
||||||
|
Dumping and reloading databases that use user-defined comparison functions
|
||||||
|
will result in new databases that use the default comparison functions.
|
||||||
|
\fBIn this case it is quite likely that the reloaded database will be
|
||||||
|
damaged beyond repair permitting neither record storage nor retrieval.\fP
|
||||||
|
|
||||||
|
The only available workaround is to modify the source for the
|
||||||
|
.BR mdbx_load (1)
|
||||||
|
utility to load the database using the correct comparison functions.
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.BR mdbx_load (1),
|
||||||
|
.BR mdbx_copy (1),
|
||||||
|
.BR mdbx_chk (1),
|
||||||
|
.BR mdbx_stat (1)
|
||||||
|
.SH AUTHOR
|
||||||
|
Howard Chu of Symas Corporation <http://www.symas.com>
|
||||||
89
contrib/db/libmdbx/src/man1/mdbx_load.1
Normal file
89
contrib/db/libmdbx/src/man1/mdbx_load.1
Normal file
|
|
@ -0,0 +1,89 @@
|
||||||
|
.\" Copyright 2015-2019 Leonid Yuriev <leo@yuriev.ru>.
|
||||||
|
.\" Copyright 2014-2015 Howard Chu, Symas Corp. All Rights Reserved.
|
||||||
|
.\" Copyright 2015,2016 Peter-Service R&D LLC <http://billing.ru/>.
|
||||||
|
.\" Copying restrictions apply. See COPYRIGHT/LICENSE.
|
||||||
|
.TH MDBX_LOAD 1 "2019-09-10" "MDBX 0.x"
|
||||||
|
.SH NAME
|
||||||
|
mdbx_load \- MDBX environment import tool
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B mdbx_load
|
||||||
|
[\c
|
||||||
|
.BR \-V ]
|
||||||
|
[\c
|
||||||
|
.BI \-f \ file\fR]
|
||||||
|
[\c
|
||||||
|
.BR \-n ]
|
||||||
|
[\c
|
||||||
|
.BI \-s \ subdb\fR]
|
||||||
|
[\c
|
||||||
|
.BR \-N ]
|
||||||
|
[\c
|
||||||
|
.BR \-T ]
|
||||||
|
.BR \ envpath
|
||||||
|
.SH DESCRIPTION
|
||||||
|
The
|
||||||
|
.B mdbx_load
|
||||||
|
utility reads from the standard input and loads it into the
|
||||||
|
MDBX environment
|
||||||
|
.BR envpath .
|
||||||
|
|
||||||
|
The input to
|
||||||
|
.B mdbx_load
|
||||||
|
must be in the output format specified by the
|
||||||
|
.BR mdbx_dump (1)
|
||||||
|
utility or as specified by the
|
||||||
|
.B -T
|
||||||
|
option below.
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
.BR \-V
|
||||||
|
Write the library version number to the standard output, and exit.
|
||||||
|
.TP
|
||||||
|
.BR \-a
|
||||||
|
Append all records in the order they appear in the input. The input is assumed to already be
|
||||||
|
in correctly sorted order and no sorting or checking for redundant values will be performed.
|
||||||
|
This option must be used to reload data that was produced by running
|
||||||
|
.B mdbx_dump
|
||||||
|
on a database that uses custom compare functions.
|
||||||
|
.TP
|
||||||
|
.BR \-f \ file
|
||||||
|
Read from the specified file instead of from the standard input.
|
||||||
|
.TP
|
||||||
|
.BR \-n
|
||||||
|
Load an MDBX database which does not use subdirectories.
|
||||||
|
.TP
|
||||||
|
.BR \-s \ subdb
|
||||||
|
Load a specific subdatabase. If no database is specified, data is loaded into the main database.
|
||||||
|
.TP
|
||||||
|
.BR \-N
|
||||||
|
Don't overwrite existing records when loading into an already existing database; just skip them.
|
||||||
|
.TP
|
||||||
|
.BR \-T
|
||||||
|
Load data from simple text files. The input must be paired lines of text, where the first
|
||||||
|
line of the pair is the key item, and the second line of the pair is its corresponding
|
||||||
|
data item.
|
||||||
|
|
||||||
|
A simple escape mechanism, where newline and backslash (\\) characters are special, is
|
||||||
|
applied to the text input. Newline characters are interpreted as record separators.
|
||||||
|
Backslash characters in the text will be interpreted in one of two ways: If the backslash
|
||||||
|
character precedes another backslash character, the pair will be interpreted as a literal
|
||||||
|
backslash. If the backslash character precedes any other character, the two characters
|
||||||
|
following the backslash will be interpreted as a hexadecimal specification of a single
|
||||||
|
character; for example, \\0a is a newline character in the ASCII character set.
|
||||||
|
|
||||||
|
For this reason, any backslash or newline characters that naturally occur in the text
|
||||||
|
input must be escaped to avoid misinterpretation by
|
||||||
|
.BR mdbx_load .
|
||||||
|
|
||||||
|
.SH DIAGNOSTICS
|
||||||
|
Exit status is zero if no errors occur.
|
||||||
|
Errors result in a non-zero exit status and
|
||||||
|
a diagnostic message being written to standard error.
|
||||||
|
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.BR mdbx_dump (1),
|
||||||
|
.BR mdbx_chk (1),
|
||||||
|
.BR mdbx_stat (1),
|
||||||
|
.BR mdbx_copy (1)
|
||||||
|
.SH AUTHOR
|
||||||
|
Howard Chu of Symas Corporation <http://www.symas.com>
|
||||||
69
contrib/db/libmdbx/src/man1/mdbx_stat.1
Normal file
69
contrib/db/libmdbx/src/man1/mdbx_stat.1
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
.\" Copyright 2015-2019 Leonid Yuriev <leo@yuriev.ru>.
|
||||||
|
.\" Copyright 2012-2015 Howard Chu, Symas Corp. All Rights Reserved.
|
||||||
|
.\" Copyright 2015,2016 Peter-Service R&D LLC <http://billing.ru/>.
|
||||||
|
.\" Copying restrictions apply. See COPYRIGHT/LICENSE.
|
||||||
|
.TH MDBX_STAT 1 "2019-09-10" "MDBX 0.x"
|
||||||
|
.SH NAME
|
||||||
|
mdbx_stat \- MDBX environment status tool
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B mdbx_stat
|
||||||
|
[\c
|
||||||
|
.BR \-V ]
|
||||||
|
[\c
|
||||||
|
.BR \-e ]
|
||||||
|
[\c
|
||||||
|
.BR \-f [ f [ f ]]]
|
||||||
|
[\c
|
||||||
|
.BR \-n ]
|
||||||
|
[\c
|
||||||
|
.BR \-r [ r ]]
|
||||||
|
[\c
|
||||||
|
.BR \-a \ |
|
||||||
|
.BI \-s \ subdb\fR]
|
||||||
|
.BR \ envpath
|
||||||
|
.SH DESCRIPTION
|
||||||
|
The
|
||||||
|
.B mdbx_stat
|
||||||
|
utility displays the status of an MDBX environment.
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
.BR \-V
|
||||||
|
Write the library version number to the standard output, and exit.
|
||||||
|
.TP
|
||||||
|
.BR \-e
|
||||||
|
Display information about the database environment.
|
||||||
|
.TP
|
||||||
|
.BR \-f
|
||||||
|
Display information about the environment freelist.
|
||||||
|
If \fB\-ff\fP is given, summarize each freelist entry.
|
||||||
|
If \fB\-fff\fP is given, display the full list of page IDs in the freelist.
|
||||||
|
.TP
|
||||||
|
.BR \-n
|
||||||
|
Display the status of an MDBX database which does not use subdirectories.
|
||||||
|
.TP
|
||||||
|
.BR \-r
|
||||||
|
Display information about the environment reader table.
|
||||||
|
Shows the process ID, thread ID, and transaction ID for each active
|
||||||
|
reader slot. The process ID and transaction ID are in decimal, the
|
||||||
|
thread ID is in hexadecimal. The transaction ID is displayed as "-"
|
||||||
|
if the reader does not currently have a read transaction open.
|
||||||
|
If \fB\-rr\fP is given, check for stale entries in the reader
|
||||||
|
table and clear them. The reader table will be printed again
|
||||||
|
after the check is performed.
|
||||||
|
.TP
|
||||||
|
.BR \-a
|
||||||
|
Display the status of all of the subdatabases in the environment.
|
||||||
|
.TP
|
||||||
|
.BR \-s \ subdb
|
||||||
|
Display the status of a specific subdatabase.
|
||||||
|
.SH DIAGNOSTICS
|
||||||
|
Exit status is zero if no errors occur.
|
||||||
|
Errors result in a non-zero exit status and
|
||||||
|
a diagnostic message being written to standard error.
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.BR mdbx_chk (1),
|
||||||
|
.BR mdbx_copy (1),
|
||||||
|
.BR mdbx_dump (1),
|
||||||
|
.BR mdbx_load (1)
|
||||||
|
.SH AUTHOR
|
||||||
|
Howard Chu of Symas Corporation <http://www.symas.com>
|
||||||
42
contrib/db/libmdbx/src/tools/CMakeLists.txt
Normal file
42
contrib/db/libmdbx/src/tools/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
set(MDBX_TOOLS mdbx_chk mdbx_copy mdbx_dump mdbx_load mdbx_stat)
|
||||||
|
|
||||||
|
# use, i.e. don't skip the full RPATH for the build tree
|
||||||
|
set(CMAKE_SKIP_BUILD_RPATH FALSE)
|
||||||
|
|
||||||
|
# when building, don't use the install RPATH already (but later on when installing)
|
||||||
|
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
|
||||||
|
|
||||||
|
# add the automatically determined parts of the RPATH
|
||||||
|
# which point to directories outside the build tree to the install RPATH
|
||||||
|
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
|
||||||
|
|
||||||
|
# the RPATH to be used when installing, but only if it's not a system directory
|
||||||
|
list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir)
|
||||||
|
if(isSystemDir EQUAL -1)
|
||||||
|
if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
|
||||||
|
set(CMAKE_INSTALL_RPATH "@executable_path/../lib")
|
||||||
|
else()
|
||||||
|
set(CMAKE_INSTALL_RPATH "\$ORIGIN/../lib")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
foreach(TOOL ${MDBX_TOOLS})
|
||||||
|
if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
|
||||||
|
add_executable(${TOOL} ${TOOL}.c wingetopt.c wingetopt.h)
|
||||||
|
else()
|
||||||
|
add_executable(${TOOL} ${TOOL}.c)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_link_libraries(${TOOL} mdbx ${CMAKE_THREAD_LIBS_INIT})
|
||||||
|
set_target_properties(${TOOL} PROPERTIES
|
||||||
|
C_STANDARD ${MDBX_C_STANDARD} C_STANDARD_REQUIRED ON
|
||||||
|
INTERPROCEDURAL_OPTIMIZATION $<BOOL:${INTERPROCEDURAL_OPTIMIZATION}>)
|
||||||
|
|
||||||
|
# install(TARGETS ${TOOL} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin COMPONENT mdbx)
|
||||||
|
# install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../man1/${TOOL}.1 DESTINATION ${CMAKE_INSTALL_PREFIX}/man/man1 COMPONENT mdbx)
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
if(LIB_MATH)
|
||||||
|
target_link_libraries(mdbx_chk ${LIB_MATH})
|
||||||
|
target_link_libraries(mdbx_stat ${LIB_MATH})
|
||||||
|
endif()
|
||||||
1430
contrib/db/libmdbx/src/tools/mdbx_chk.c
Normal file
1430
contrib/db/libmdbx/src/tools/mdbx_chk.c
Normal file
File diff suppressed because it is too large
Load diff
130
contrib/db/libmdbx/src/tools/mdbx_copy.c
Normal file
130
contrib/db/libmdbx/src/tools/mdbx_copy.c
Normal file
|
|
@ -0,0 +1,130 @@
|
||||||
|
/* mdbx_copy.c - memory-mapped database backup tool */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2015-2019 Leonid Yuriev <leo@yuriev.ru>
|
||||||
|
* and other libmdbx authors: please see AUTHORS file.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted only as authorized by the OpenLDAP
|
||||||
|
* Public License.
|
||||||
|
*
|
||||||
|
* A copy of this license is available in the file LICENSE in the
|
||||||
|
* top-level directory of the distribution or, alternatively, at
|
||||||
|
* <http://www.OpenLDAP.org/license.html>. */
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#if _MSC_VER > 1800
|
||||||
|
#pragma warning(disable : 4464) /* relative include path contains '..' */
|
||||||
|
#endif
|
||||||
|
#pragma warning(disable : 4996) /* The POSIX name is deprecated... */
|
||||||
|
#endif /* _MSC_VER (warnings) */
|
||||||
|
|
||||||
|
#define MDBX_TOOLS /* Avoid using internal mdbx_assert() */
|
||||||
|
#include "../elements/internals.h"
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
#include "wingetopt.h"
|
||||||
|
|
||||||
|
static volatile BOOL user_break;
|
||||||
|
static BOOL WINAPI ConsoleBreakHandlerRoutine(DWORD dwCtrlType) {
|
||||||
|
(void)dwCtrlType;
|
||||||
|
user_break = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* WINDOWS */
|
||||||
|
|
||||||
|
static volatile sig_atomic_t user_break;
|
||||||
|
static void signal_handler(int sig) {
|
||||||
|
(void)sig;
|
||||||
|
user_break = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !WINDOWS */
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
int rc;
|
||||||
|
MDBX_env *env = NULL;
|
||||||
|
const char *progname = argv[0], *act;
|
||||||
|
unsigned flags = MDBX_RDONLY;
|
||||||
|
unsigned cpflags = 0;
|
||||||
|
bool quiet = false;
|
||||||
|
|
||||||
|
for (; argc > 1 && argv[1][0] == '-'; argc--, argv++) {
|
||||||
|
if (argv[1][1] == 'n' && argv[1][2] == '\0')
|
||||||
|
flags |= MDBX_NOSUBDIR;
|
||||||
|
else if (argv[1][1] == 'c' && argv[1][2] == '\0')
|
||||||
|
cpflags |= MDBX_CP_COMPACT;
|
||||||
|
else if (argv[1][1] == 'q' && argv[1][2] == '\0')
|
||||||
|
quiet = true;
|
||||||
|
else if (argv[1][1] == 'V' && argv[1][2] == '\0') {
|
||||||
|
printf("mdbx_copy version %d.%d.%d.%d\n"
|
||||||
|
" - source: %s %s, commit %s, tree %s\n"
|
||||||
|
" - anchor: %s\n"
|
||||||
|
" - build: %s for %s by %s\n"
|
||||||
|
" - flags: %s\n"
|
||||||
|
" - options: %s\n",
|
||||||
|
mdbx_version.major, mdbx_version.minor, mdbx_version.release,
|
||||||
|
mdbx_version.revision, mdbx_version.git.describe,
|
||||||
|
mdbx_version.git.datetime, mdbx_version.git.commit,
|
||||||
|
mdbx_version.git.tree, mdbx_sourcery_anchor, mdbx_build.datetime,
|
||||||
|
mdbx_build.target, mdbx_build.compiler, mdbx_build.flags,
|
||||||
|
mdbx_build.options);
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
} else
|
||||||
|
argc = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc < 2 || argc > 3) {
|
||||||
|
fprintf(stderr, "usage: %s [-V] [-q] [-c] [-n] srcpath [dstpath]\n",
|
||||||
|
progname);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
SetConsoleCtrlHandler(ConsoleBreakHandlerRoutine, true);
|
||||||
|
#else
|
||||||
|
#ifdef SIGPIPE
|
||||||
|
signal(SIGPIPE, signal_handler);
|
||||||
|
#endif
|
||||||
|
#ifdef SIGHUP
|
||||||
|
signal(SIGHUP, signal_handler);
|
||||||
|
#endif
|
||||||
|
signal(SIGINT, signal_handler);
|
||||||
|
signal(SIGTERM, signal_handler);
|
||||||
|
#endif /* !WINDOWS */
|
||||||
|
|
||||||
|
if (!quiet) {
|
||||||
|
fprintf((argc == 2) ? stderr : stdout,
|
||||||
|
"mdbx_copy %s (%s, T-%s)\nRunning for copy %s to %s...\n",
|
||||||
|
mdbx_version.git.describe, mdbx_version.git.datetime,
|
||||||
|
mdbx_version.git.tree, argv[1], (argc == 2) ? "stdout" : argv[2]);
|
||||||
|
fflush(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
act = "opening environment";
|
||||||
|
rc = mdbx_env_create(&env);
|
||||||
|
if (rc == MDBX_SUCCESS) {
|
||||||
|
rc = mdbx_env_open(env, argv[1], flags, 0640);
|
||||||
|
}
|
||||||
|
if (rc == MDBX_SUCCESS) {
|
||||||
|
act = "copying";
|
||||||
|
if (argc == 2) {
|
||||||
|
mdbx_filehandle_t fd;
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
fd = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
|
#else
|
||||||
|
fd = fileno(stdout);
|
||||||
|
#endif
|
||||||
|
rc = mdbx_env_copy2fd(env, fd, cpflags);
|
||||||
|
} else
|
||||||
|
rc = mdbx_env_copy(env, argv[2], cpflags);
|
||||||
|
}
|
||||||
|
if (rc)
|
||||||
|
fprintf(stderr, "%s: %s failed, error %d (%s)\n", progname, act, rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
mdbx_env_close(env);
|
||||||
|
|
||||||
|
return rc ? EXIT_FAILURE : EXIT_SUCCESS;
|
||||||
|
}
|
||||||
352
contrib/db/libmdbx/src/tools/mdbx_dump.c
Normal file
352
contrib/db/libmdbx/src/tools/mdbx_dump.c
Normal file
|
|
@ -0,0 +1,352 @@
|
||||||
|
/* mdbx_dump.c - memory-mapped database dump tool */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2015-2019 Leonid Yuriev <leo@yuriev.ru>
|
||||||
|
* and other libmdbx authors: please see AUTHORS file.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted only as authorized by the OpenLDAP
|
||||||
|
* Public License.
|
||||||
|
*
|
||||||
|
* A copy of this license is available in the file LICENSE in the
|
||||||
|
* top-level directory of the distribution or, alternatively, at
|
||||||
|
* <http://www.OpenLDAP.org/license.html>. */
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#if _MSC_VER > 1800
|
||||||
|
#pragma warning(disable : 4464) /* relative include path contains '..' */
|
||||||
|
#endif
|
||||||
|
#pragma warning(disable : 4996) /* The POSIX name is deprecated... */
|
||||||
|
#endif /* _MSC_VER (warnings) */
|
||||||
|
|
||||||
|
#define MDBX_TOOLS /* Avoid using internal mdbx_assert() */
|
||||||
|
#include "../elements/internals.h"
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#define PRINT 1
|
||||||
|
static int mode;
|
||||||
|
|
||||||
|
typedef struct flagbit {
|
||||||
|
int bit;
|
||||||
|
char *name;
|
||||||
|
} flagbit;
|
||||||
|
|
||||||
|
flagbit dbflags[] = {{MDBX_REVERSEKEY, "reversekey"},
|
||||||
|
{MDBX_DUPSORT, "dupsort"},
|
||||||
|
{MDBX_INTEGERKEY, "integerkey"},
|
||||||
|
{MDBX_DUPFIXED, "dupfixed"},
|
||||||
|
{MDBX_INTEGERDUP, "integerdup"},
|
||||||
|
{MDBX_REVERSEDUP, "reversedup"},
|
||||||
|
{0, NULL}};
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
#include "wingetopt.h"
|
||||||
|
|
||||||
|
static volatile BOOL user_break;
|
||||||
|
static BOOL WINAPI ConsoleBreakHandlerRoutine(DWORD dwCtrlType) {
|
||||||
|
(void)dwCtrlType;
|
||||||
|
user_break = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* WINDOWS */
|
||||||
|
|
||||||
|
static volatile sig_atomic_t user_break;
|
||||||
|
static void signal_handler(int sig) {
|
||||||
|
(void)sig;
|
||||||
|
user_break = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !WINDOWS */
|
||||||
|
|
||||||
|
static const char hexc[] = "0123456789abcdef";
|
||||||
|
|
||||||
|
static void dumpbyte(unsigned char c) {
|
||||||
|
putchar(hexc[c >> 4]);
|
||||||
|
putchar(hexc[c & 0xf]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void text(MDBX_val *v) {
|
||||||
|
unsigned char *c, *end;
|
||||||
|
|
||||||
|
putchar(' ');
|
||||||
|
c = v->iov_base;
|
||||||
|
end = c + v->iov_len;
|
||||||
|
while (c < end) {
|
||||||
|
if (isprint(*c) && *c != '\\') {
|
||||||
|
putchar(*c);
|
||||||
|
} else {
|
||||||
|
putchar('\\');
|
||||||
|
dumpbyte(*c);
|
||||||
|
}
|
||||||
|
c++;
|
||||||
|
}
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dumpval(MDBX_val *v) {
|
||||||
|
unsigned char *c, *end;
|
||||||
|
|
||||||
|
putchar(' ');
|
||||||
|
c = v->iov_base;
|
||||||
|
end = c + v->iov_len;
|
||||||
|
while (c < end) {
|
||||||
|
dumpbyte(*c++);
|
||||||
|
}
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dump in BDB-compatible format */
|
||||||
|
static int dumpit(MDBX_txn *txn, MDBX_dbi dbi, char *name) {
|
||||||
|
MDBX_cursor *mc;
|
||||||
|
MDBX_stat ms;
|
||||||
|
MDBX_val key, data;
|
||||||
|
MDBX_envinfo info;
|
||||||
|
unsigned int flags;
|
||||||
|
int rc, i;
|
||||||
|
|
||||||
|
rc = mdbx_dbi_flags(txn, dbi, &flags);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
rc = mdbx_dbi_stat(txn, dbi, &ms, sizeof(ms));
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
rc = mdbx_env_info(mdbx_txn_env(txn), &info, sizeof(info));
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
printf("VERSION=3\n");
|
||||||
|
printf("format=%s\n", mode & PRINT ? "print" : "bytevalue");
|
||||||
|
if (name)
|
||||||
|
printf("database=%s\n", name);
|
||||||
|
printf("type=btree\n");
|
||||||
|
printf("mapsize=%" PRIu64 "\n", info.mi_mapsize);
|
||||||
|
printf("maxreaders=%u\n", info.mi_maxreaders);
|
||||||
|
|
||||||
|
for (i = 0; dbflags[i].bit; i++)
|
||||||
|
if (flags & dbflags[i].bit)
|
||||||
|
printf("%s=1\n", dbflags[i].name);
|
||||||
|
|
||||||
|
printf("db_pagesize=%d\n", ms.ms_psize);
|
||||||
|
printf("HEADER=END\n");
|
||||||
|
|
||||||
|
rc = mdbx_cursor_open(txn, dbi, &mc);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
while ((rc = mdbx_cursor_get(mc, &key, &data, MDBX_NEXT)) == MDBX_SUCCESS) {
|
||||||
|
if (user_break) {
|
||||||
|
rc = MDBX_EINTR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (mode & PRINT) {
|
||||||
|
text(&key);
|
||||||
|
text(&data);
|
||||||
|
} else {
|
||||||
|
dumpval(&key);
|
||||||
|
dumpval(&data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("DATA=END\n");
|
||||||
|
if (rc == MDBX_NOTFOUND)
|
||||||
|
rc = MDBX_SUCCESS;
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void usage(char *prog) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"usage: %s [-V] [-f output] [-l] [-n] [-p] [-a|-s subdb] dbpath\n",
|
||||||
|
prog);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
int i, rc;
|
||||||
|
MDBX_env *env;
|
||||||
|
MDBX_txn *txn;
|
||||||
|
MDBX_dbi dbi;
|
||||||
|
char *prog = argv[0];
|
||||||
|
char *envname;
|
||||||
|
char *subname = NULL;
|
||||||
|
int alldbs = 0, envflags = 0, list = 0;
|
||||||
|
|
||||||
|
if (argc < 2)
|
||||||
|
usage(prog);
|
||||||
|
|
||||||
|
/* -a: dump main DB and all subDBs
|
||||||
|
* -s: dump only the named subDB
|
||||||
|
* -n: use NOSUBDIR flag on env_open
|
||||||
|
* -p: use printable characters
|
||||||
|
* -f: write to file instead of stdout
|
||||||
|
* -V: print version and exit
|
||||||
|
* (default) dump only the main DB
|
||||||
|
*/
|
||||||
|
while ((i = getopt(argc, argv, "af:lnps:V")) != EOF) {
|
||||||
|
switch (i) {
|
||||||
|
case 'V':
|
||||||
|
printf("mdbx_dump version %d.%d.%d.%d\n"
|
||||||
|
" - source: %s %s, commit %s, tree %s\n"
|
||||||
|
" - anchor: %s\n"
|
||||||
|
" - build: %s for %s by %s\n"
|
||||||
|
" - flags: %s\n"
|
||||||
|
" - options: %s\n",
|
||||||
|
mdbx_version.major, mdbx_version.minor, mdbx_version.release,
|
||||||
|
mdbx_version.revision, mdbx_version.git.describe,
|
||||||
|
mdbx_version.git.datetime, mdbx_version.git.commit,
|
||||||
|
mdbx_version.git.tree, mdbx_sourcery_anchor, mdbx_build.datetime,
|
||||||
|
mdbx_build.target, mdbx_build.compiler, mdbx_build.flags,
|
||||||
|
mdbx_build.options);
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
case 'l':
|
||||||
|
list = 1;
|
||||||
|
/*FALLTHROUGH*/;
|
||||||
|
__fallthrough;
|
||||||
|
case 'a':
|
||||||
|
if (subname)
|
||||||
|
usage(prog);
|
||||||
|
alldbs++;
|
||||||
|
break;
|
||||||
|
case 'f':
|
||||||
|
if (freopen(optarg, "w", stdout) == NULL) {
|
||||||
|
fprintf(stderr, "%s: %s: reopen: %s\n", prog, optarg,
|
||||||
|
mdbx_strerror(errno));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
envflags |= MDBX_NOSUBDIR;
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
mode |= PRINT;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
if (alldbs)
|
||||||
|
usage(prog);
|
||||||
|
subname = optarg;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage(prog);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (optind != argc - 1)
|
||||||
|
usage(prog);
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
SetConsoleCtrlHandler(ConsoleBreakHandlerRoutine, true);
|
||||||
|
#else
|
||||||
|
#ifdef SIGPIPE
|
||||||
|
signal(SIGPIPE, signal_handler);
|
||||||
|
#endif
|
||||||
|
#ifdef SIGHUP
|
||||||
|
signal(SIGHUP, signal_handler);
|
||||||
|
#endif
|
||||||
|
signal(SIGINT, signal_handler);
|
||||||
|
signal(SIGTERM, signal_handler);
|
||||||
|
#endif /* !WINDOWS */
|
||||||
|
|
||||||
|
envname = argv[optind];
|
||||||
|
printf("mdbx_dump %s (%s, T-%s)\nRunning for %s...\n",
|
||||||
|
mdbx_version.git.describe, mdbx_version.git.datetime,
|
||||||
|
mdbx_version.git.tree, envname);
|
||||||
|
fflush(NULL);
|
||||||
|
|
||||||
|
rc = mdbx_env_create(&env);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_env_create failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alldbs || subname) {
|
||||||
|
mdbx_env_set_maxdbs(env, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = mdbx_env_open(env, envname, envflags | MDBX_RDONLY, 0664);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_env_open failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
goto env_close;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = mdbx_txn_begin(env, NULL, MDBX_RDONLY, &txn);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_txn_begin failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
goto env_close;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = mdbx_dbi_open(txn, subname, 0, &dbi);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_open failed, error %d %s\n", rc, mdbx_strerror(rc));
|
||||||
|
goto txn_abort;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alldbs) {
|
||||||
|
MDBX_cursor *cursor;
|
||||||
|
MDBX_val key;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
rc = mdbx_cursor_open(txn, dbi, &cursor);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_cursor_open failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
goto txn_abort;
|
||||||
|
}
|
||||||
|
while ((rc = mdbx_cursor_get(cursor, &key, NULL, MDBX_NEXT_NODUP)) == 0) {
|
||||||
|
if (user_break) {
|
||||||
|
rc = MDBX_EINTR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
char *str;
|
||||||
|
MDBX_dbi db2;
|
||||||
|
if (memchr(key.iov_base, '\0', key.iov_len))
|
||||||
|
continue;
|
||||||
|
count++;
|
||||||
|
str = mdbx_malloc(key.iov_len + 1);
|
||||||
|
memcpy(str, key.iov_base, key.iov_len);
|
||||||
|
str[key.iov_len] = '\0';
|
||||||
|
rc = mdbx_dbi_open(txn, str, 0, &db2);
|
||||||
|
if (rc == MDBX_SUCCESS) {
|
||||||
|
if (list) {
|
||||||
|
printf("%s\n", str);
|
||||||
|
list++;
|
||||||
|
} else {
|
||||||
|
rc = dumpit(txn, db2, str);
|
||||||
|
if (rc)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
mdbx_dbi_close(env, db2);
|
||||||
|
}
|
||||||
|
mdbx_free(str);
|
||||||
|
if (rc)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
mdbx_cursor_close(cursor);
|
||||||
|
if (!count) {
|
||||||
|
fprintf(stderr, "%s: %s does not contain multiple databases\n", prog,
|
||||||
|
envname);
|
||||||
|
rc = MDBX_NOTFOUND;
|
||||||
|
} else if (rc == MDBX_INCOMPATIBLE) {
|
||||||
|
/* LY: the record it not a named sub-db. */
|
||||||
|
rc = MDBX_SUCCESS;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
rc = dumpit(txn, dbi, subname);
|
||||||
|
}
|
||||||
|
if (rc && rc != MDBX_NOTFOUND)
|
||||||
|
fprintf(stderr, "%s: %s: %s\n", prog, envname, mdbx_strerror(rc));
|
||||||
|
|
||||||
|
mdbx_dbi_close(env, dbi);
|
||||||
|
txn_abort:
|
||||||
|
mdbx_txn_abort(txn);
|
||||||
|
env_close:
|
||||||
|
mdbx_env_close(env);
|
||||||
|
|
||||||
|
return rc ? EXIT_FAILURE : EXIT_SUCCESS;
|
||||||
|
}
|
||||||
567
contrib/db/libmdbx/src/tools/mdbx_load.c
Normal file
567
contrib/db/libmdbx/src/tools/mdbx_load.c
Normal file
|
|
@ -0,0 +1,567 @@
|
||||||
|
/* mdbx_load.c - memory-mapped database load tool */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2015-2019 Leonid Yuriev <leo@yuriev.ru>
|
||||||
|
* and other libmdbx authors: please see AUTHORS file.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted only as authorized by the OpenLDAP
|
||||||
|
* Public License.
|
||||||
|
*
|
||||||
|
* A copy of this license is available in the file LICENSE in the
|
||||||
|
* top-level directory of the distribution or, alternatively, at
|
||||||
|
* <http://www.OpenLDAP.org/license.html>. */
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#if _MSC_VER > 1800
|
||||||
|
#pragma warning(disable : 4464) /* relative include path contains '..' */
|
||||||
|
#endif
|
||||||
|
#pragma warning(disable : 4996) /* The POSIX name is deprecated... */
|
||||||
|
#endif /* _MSC_VER (warnings) */
|
||||||
|
|
||||||
|
#define MDBX_TOOLS /* Avoid using internal mdbx_assert() */
|
||||||
|
#include "../elements/internals.h"
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
#include "wingetopt.h"
|
||||||
|
|
||||||
|
static volatile BOOL user_break;
|
||||||
|
static BOOL WINAPI ConsoleBreakHandlerRoutine(DWORD dwCtrlType) {
|
||||||
|
(void)dwCtrlType;
|
||||||
|
user_break = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* WINDOWS */
|
||||||
|
|
||||||
|
static volatile sig_atomic_t user_break;
|
||||||
|
static void signal_handler(int sig) {
|
||||||
|
(void)sig;
|
||||||
|
user_break = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !WINDOWS */
|
||||||
|
|
||||||
|
#define PRINT 1
|
||||||
|
#define NOHDR 2
|
||||||
|
static int mode;
|
||||||
|
|
||||||
|
static char *subname = NULL;
|
||||||
|
static size_t lineno;
|
||||||
|
static int version;
|
||||||
|
|
||||||
|
static int dbi_flags;
|
||||||
|
static char *prog;
|
||||||
|
static int Eof;
|
||||||
|
|
||||||
|
static MDBX_envinfo envinfo;
|
||||||
|
static MDBX_val kbuf, dbuf;
|
||||||
|
static MDBX_val k0buf;
|
||||||
|
|
||||||
|
#define STRLENOF(s) (sizeof(s) - 1)
|
||||||
|
|
||||||
|
typedef struct flagbit {
|
||||||
|
int bit;
|
||||||
|
char *name;
|
||||||
|
int len;
|
||||||
|
} flagbit;
|
||||||
|
|
||||||
|
#define S(s) s, STRLENOF(s)
|
||||||
|
|
||||||
|
flagbit dbflags[] = {{MDBX_REVERSEKEY, S("reversekey")},
|
||||||
|
{MDBX_DUPSORT, S("dupsort")},
|
||||||
|
{MDBX_INTEGERKEY, S("integerkey")},
|
||||||
|
{MDBX_DUPFIXED, S("dupfixed")},
|
||||||
|
{MDBX_INTEGERDUP, S("integerdup")},
|
||||||
|
{MDBX_REVERSEDUP, S("reversedup")},
|
||||||
|
{0, NULL, 0}};
|
||||||
|
|
||||||
|
static void readhdr(void) {
|
||||||
|
char *ptr;
|
||||||
|
|
||||||
|
dbi_flags = 0;
|
||||||
|
while (fgets(dbuf.iov_base, (int)dbuf.iov_len, stdin) != NULL) {
|
||||||
|
lineno++;
|
||||||
|
if (!strncmp(dbuf.iov_base, "db_pagesize=", STRLENOF("db_pagesize=")) ||
|
||||||
|
!strncmp(dbuf.iov_base, "duplicates=", STRLENOF("duplicates="))) {
|
||||||
|
/* LY: silently ignore information fields. */
|
||||||
|
continue;
|
||||||
|
} else if (!strncmp(dbuf.iov_base, "VERSION=", STRLENOF("VERSION="))) {
|
||||||
|
version = atoi((char *)dbuf.iov_base + STRLENOF("VERSION="));
|
||||||
|
if (version > 3) {
|
||||||
|
fprintf(stderr, "%s: line %" PRIiSIZE ": unsupported VERSION %d\n",
|
||||||
|
prog, lineno, version);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
} else if (!strncmp(dbuf.iov_base, "HEADER=END", STRLENOF("HEADER=END"))) {
|
||||||
|
break;
|
||||||
|
} else if (!strncmp(dbuf.iov_base, "format=", STRLENOF("format="))) {
|
||||||
|
if (!strncmp((char *)dbuf.iov_base + STRLENOF("FORMAT="), "print",
|
||||||
|
STRLENOF("print")))
|
||||||
|
mode |= PRINT;
|
||||||
|
else if (strncmp((char *)dbuf.iov_base + STRLENOF("FORMAT="), "bytevalue",
|
||||||
|
STRLENOF("bytevalue"))) {
|
||||||
|
fprintf(stderr, "%s: line %" PRIiSIZE ": unsupported FORMAT %s\n", prog,
|
||||||
|
lineno, (char *)dbuf.iov_base + STRLENOF("FORMAT="));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
} else if (!strncmp(dbuf.iov_base, "database=", STRLENOF("database="))) {
|
||||||
|
ptr = memchr(dbuf.iov_base, '\n', dbuf.iov_len);
|
||||||
|
if (ptr)
|
||||||
|
*ptr = '\0';
|
||||||
|
if (subname)
|
||||||
|
mdbx_free(subname);
|
||||||
|
subname = mdbx_strdup((char *)dbuf.iov_base + STRLENOF("database="));
|
||||||
|
} else if (!strncmp(dbuf.iov_base, "type=", STRLENOF("type="))) {
|
||||||
|
if (strncmp((char *)dbuf.iov_base + STRLENOF("type="), "btree",
|
||||||
|
STRLENOF("btree"))) {
|
||||||
|
fprintf(stderr, "%s: line %" PRIiSIZE ": unsupported type %s\n", prog,
|
||||||
|
lineno, (char *)dbuf.iov_base + STRLENOF("type="));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
} else if (!strncmp(dbuf.iov_base, "mapaddr=", STRLENOF("mapaddr="))) {
|
||||||
|
int i;
|
||||||
|
ptr = memchr(dbuf.iov_base, '\n', dbuf.iov_len);
|
||||||
|
if (ptr)
|
||||||
|
*ptr = '\0';
|
||||||
|
void *unused;
|
||||||
|
i = sscanf((char *)dbuf.iov_base + STRLENOF("mapaddr="), "%p", &unused);
|
||||||
|
if (i != 1) {
|
||||||
|
fprintf(stderr, "%s: line %" PRIiSIZE ": invalid mapaddr %s\n", prog,
|
||||||
|
lineno, (char *)dbuf.iov_base + STRLENOF("mapaddr="));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
} else if (!strncmp(dbuf.iov_base, "mapsize=", STRLENOF("mapsize="))) {
|
||||||
|
int i;
|
||||||
|
ptr = memchr(dbuf.iov_base, '\n', dbuf.iov_len);
|
||||||
|
if (ptr)
|
||||||
|
*ptr = '\0';
|
||||||
|
i = sscanf((char *)dbuf.iov_base + STRLENOF("mapsize="), "%" PRIu64,
|
||||||
|
&envinfo.mi_mapsize);
|
||||||
|
if (i != 1) {
|
||||||
|
fprintf(stderr, "%s: line %" PRIiSIZE ": invalid mapsize %s\n", prog,
|
||||||
|
lineno, (char *)dbuf.iov_base + STRLENOF("mapsize="));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
} else if (!strncmp(dbuf.iov_base,
|
||||||
|
"maxreaders=", STRLENOF("maxreaders="))) {
|
||||||
|
int i;
|
||||||
|
ptr = memchr(dbuf.iov_base, '\n', dbuf.iov_len);
|
||||||
|
if (ptr)
|
||||||
|
*ptr = '\0';
|
||||||
|
i = sscanf((char *)dbuf.iov_base + STRLENOF("maxreaders="), "%u",
|
||||||
|
&envinfo.mi_maxreaders);
|
||||||
|
if (i != 1) {
|
||||||
|
fprintf(stderr, "%s: line %" PRIiSIZE ": invalid maxreaders %s\n", prog,
|
||||||
|
lineno, (char *)dbuf.iov_base + STRLENOF("maxreaders="));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
int i;
|
||||||
|
for (i = 0; dbflags[i].bit; i++) {
|
||||||
|
if (!strncmp(dbuf.iov_base, dbflags[i].name, dbflags[i].len) &&
|
||||||
|
((char *)dbuf.iov_base)[dbflags[i].len] == '=') {
|
||||||
|
if (((char *)dbuf.iov_base)[dbflags[i].len + 1] == '1')
|
||||||
|
dbi_flags |= dbflags[i].bit;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!dbflags[i].bit) {
|
||||||
|
ptr = memchr(dbuf.iov_base, '=', dbuf.iov_len);
|
||||||
|
if (!ptr) {
|
||||||
|
fprintf(stderr, "%s: line %" PRIiSIZE ": unexpected format\n", prog,
|
||||||
|
lineno);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
} else {
|
||||||
|
*ptr = '\0';
|
||||||
|
fprintf(stderr,
|
||||||
|
"%s: line %" PRIiSIZE ": unrecognized keyword ignored: %s\n",
|
||||||
|
prog, lineno, (char *)dbuf.iov_base);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void badend(void) {
|
||||||
|
fprintf(stderr, "%s: line %" PRIiSIZE ": unexpected end of input\n", prog,
|
||||||
|
lineno);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int unhex(unsigned char *c2) {
|
||||||
|
int x, c;
|
||||||
|
x = *c2++ & 0x4f;
|
||||||
|
if (x & 0x40)
|
||||||
|
x -= 55;
|
||||||
|
c = x << 4;
|
||||||
|
x = *c2 & 0x4f;
|
||||||
|
if (x & 0x40)
|
||||||
|
x -= 55;
|
||||||
|
c |= x;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int readline(MDBX_val *out, MDBX_val *buf) {
|
||||||
|
unsigned char *c1, *c2, *end;
|
||||||
|
size_t len, l2;
|
||||||
|
int c;
|
||||||
|
|
||||||
|
if (!(mode & NOHDR)) {
|
||||||
|
c = fgetc(stdin);
|
||||||
|
if (c == EOF) {
|
||||||
|
Eof = 1;
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
if (c != ' ') {
|
||||||
|
lineno++;
|
||||||
|
if (fgets(buf->iov_base, (int)buf->iov_len, stdin) == NULL) {
|
||||||
|
badend:
|
||||||
|
Eof = 1;
|
||||||
|
badend();
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
if (c == 'D' && !strncmp(buf->iov_base, "ATA=END", STRLENOF("ATA=END")))
|
||||||
|
return EOF;
|
||||||
|
goto badend;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (fgets(buf->iov_base, (int)buf->iov_len, stdin) == NULL) {
|
||||||
|
Eof = 1;
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
lineno++;
|
||||||
|
|
||||||
|
c1 = buf->iov_base;
|
||||||
|
len = strlen((char *)c1);
|
||||||
|
l2 = len;
|
||||||
|
|
||||||
|
/* Is buffer too short? */
|
||||||
|
while (c1[len - 1] != '\n') {
|
||||||
|
buf->iov_base = mdbx_realloc(buf->iov_base, buf->iov_len * 2);
|
||||||
|
if (!buf->iov_base) {
|
||||||
|
Eof = 1;
|
||||||
|
fprintf(stderr, "%s: line %" PRIiSIZE ": out of memory, line too long\n",
|
||||||
|
prog, lineno);
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
c1 = buf->iov_base;
|
||||||
|
c1 += l2;
|
||||||
|
if (fgets((char *)c1, (int)buf->iov_len + 1, stdin) == NULL) {
|
||||||
|
Eof = 1;
|
||||||
|
badend();
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
buf->iov_len *= 2;
|
||||||
|
len = strlen((char *)c1);
|
||||||
|
l2 += len;
|
||||||
|
}
|
||||||
|
c1 = c2 = buf->iov_base;
|
||||||
|
len = l2;
|
||||||
|
c1[--len] = '\0';
|
||||||
|
end = c1 + len;
|
||||||
|
|
||||||
|
if (mode & PRINT) {
|
||||||
|
while (c2 < end) {
|
||||||
|
if (unlikely(*c2 == '\\')) {
|
||||||
|
if (c2[1] == '\\') {
|
||||||
|
*c1++ = '\\';
|
||||||
|
} else {
|
||||||
|
if (c2 + 3 > end || !isxdigit(c2[1]) || !isxdigit(c2[2])) {
|
||||||
|
Eof = 1;
|
||||||
|
badend();
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
*c1++ = (char)unhex(++c2);
|
||||||
|
}
|
||||||
|
c2 += 2;
|
||||||
|
} else {
|
||||||
|
/* copies are redundant when no escapes were used */
|
||||||
|
*c1++ = *c2++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* odd length not allowed */
|
||||||
|
if (len & 1) {
|
||||||
|
Eof = 1;
|
||||||
|
badend();
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
while (c2 < end) {
|
||||||
|
if (!isxdigit(*c2) || !isxdigit(c2[1])) {
|
||||||
|
Eof = 1;
|
||||||
|
badend();
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
*c1++ = (char)unhex(c2);
|
||||||
|
c2 += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c2 = out->iov_base = buf->iov_base;
|
||||||
|
out->iov_len = c1 - c2;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void usage(void) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"usage: %s [-V] [-a] [-f input] [-n] [-s name] [-N] [-T] dbpath\n",
|
||||||
|
prog);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int anyway_greater(const MDBX_val *a, const MDBX_val *b) {
|
||||||
|
(void)a;
|
||||||
|
(void)b;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
int i, rc;
|
||||||
|
MDBX_env *env = NULL;
|
||||||
|
MDBX_txn *txn = NULL;
|
||||||
|
MDBX_cursor *mc = NULL;
|
||||||
|
MDBX_dbi dbi;
|
||||||
|
char *envname = NULL;
|
||||||
|
int envflags = MDBX_UTTERLY_NOSYNC, putflags = 0;
|
||||||
|
int append = 0;
|
||||||
|
MDBX_val prevk;
|
||||||
|
|
||||||
|
prog = argv[0];
|
||||||
|
if (argc < 2)
|
||||||
|
usage();
|
||||||
|
|
||||||
|
/* -a: append records in input order
|
||||||
|
* -f: load file instead of stdin
|
||||||
|
* -n: use NOSUBDIR flag on env_open
|
||||||
|
* -s: load into named subDB
|
||||||
|
* -N: use NOOVERWRITE on puts
|
||||||
|
* -T: read plaintext
|
||||||
|
* -V: print version and exit
|
||||||
|
*/
|
||||||
|
while ((i = getopt(argc, argv, "af:ns:NTV")) != EOF) {
|
||||||
|
switch (i) {
|
||||||
|
case 'V':
|
||||||
|
printf("mdbx_load version %d.%d.%d.%d\n"
|
||||||
|
" - source: %s %s, commit %s, tree %s\n"
|
||||||
|
" - anchor: %s\n"
|
||||||
|
" - build: %s for %s by %s\n"
|
||||||
|
" - flags: %s\n"
|
||||||
|
" - options: %s\n",
|
||||||
|
mdbx_version.major, mdbx_version.minor, mdbx_version.release,
|
||||||
|
mdbx_version.revision, mdbx_version.git.describe,
|
||||||
|
mdbx_version.git.datetime, mdbx_version.git.commit,
|
||||||
|
mdbx_version.git.tree, mdbx_sourcery_anchor, mdbx_build.datetime,
|
||||||
|
mdbx_build.target, mdbx_build.compiler, mdbx_build.flags,
|
||||||
|
mdbx_build.options);
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
case 'a':
|
||||||
|
append = 1;
|
||||||
|
break;
|
||||||
|
case 'f':
|
||||||
|
if (freopen(optarg, "r", stdin) == NULL) {
|
||||||
|
fprintf(stderr, "%s: %s: reopen: %s\n", prog, optarg,
|
||||||
|
mdbx_strerror(errno));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
envflags |= MDBX_NOSUBDIR;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
subname = mdbx_strdup(optarg);
|
||||||
|
break;
|
||||||
|
case 'N':
|
||||||
|
putflags = MDBX_NOOVERWRITE | MDBX_NODUPDATA;
|
||||||
|
break;
|
||||||
|
case 'T':
|
||||||
|
mode |= NOHDR | PRINT;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (optind != argc - 1)
|
||||||
|
usage();
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
SetConsoleCtrlHandler(ConsoleBreakHandlerRoutine, true);
|
||||||
|
#else
|
||||||
|
#ifdef SIGPIPE
|
||||||
|
signal(SIGPIPE, signal_handler);
|
||||||
|
#endif
|
||||||
|
#ifdef SIGHUP
|
||||||
|
signal(SIGHUP, signal_handler);
|
||||||
|
#endif
|
||||||
|
signal(SIGINT, signal_handler);
|
||||||
|
signal(SIGTERM, signal_handler);
|
||||||
|
#endif /* !WINDOWS */
|
||||||
|
|
||||||
|
envname = argv[optind];
|
||||||
|
printf("mdbx_load %s (%s, T-%s)\nRunning for %s...\n",
|
||||||
|
mdbx_version.git.describe, mdbx_version.git.datetime,
|
||||||
|
mdbx_version.git.tree, envname);
|
||||||
|
fflush(NULL);
|
||||||
|
|
||||||
|
dbuf.iov_len = 4096;
|
||||||
|
dbuf.iov_base = mdbx_malloc(dbuf.iov_len);
|
||||||
|
|
||||||
|
/* read first header for mapsize= */
|
||||||
|
if (!(mode & NOHDR))
|
||||||
|
readhdr();
|
||||||
|
|
||||||
|
rc = mdbx_env_create(&env);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_env_create failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
mdbx_env_set_maxdbs(env, 2);
|
||||||
|
|
||||||
|
if (envinfo.mi_maxreaders)
|
||||||
|
mdbx_env_set_maxreaders(env, envinfo.mi_maxreaders);
|
||||||
|
|
||||||
|
if (envinfo.mi_mapsize) {
|
||||||
|
if (envinfo.mi_mapsize > SIZE_MAX) {
|
||||||
|
fprintf(stderr, "mdbx_env_set_mapsize failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(MDBX_TOO_LARGE));
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
mdbx_env_set_mapsize(env, (size_t)envinfo.mi_mapsize);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MDBX_FIXEDMAP
|
||||||
|
if (info.mi_mapaddr)
|
||||||
|
envflags |= MDBX_FIXEDMAP;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
rc = mdbx_env_open(env, envname, envflags, 0664);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_env_open failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
goto env_close;
|
||||||
|
}
|
||||||
|
|
||||||
|
kbuf.iov_len = mdbx_env_get_maxkeysize(env);
|
||||||
|
if (kbuf.iov_len >= SIZE_MAX / 4) {
|
||||||
|
fprintf(stderr, "mdbx_env_get_maxkeysize failed, returns %zu\n",
|
||||||
|
kbuf.iov_len);
|
||||||
|
goto env_close;
|
||||||
|
}
|
||||||
|
kbuf.iov_len = (kbuf.iov_len + 1) * 2;
|
||||||
|
kbuf.iov_base = malloc(kbuf.iov_len * 2);
|
||||||
|
k0buf.iov_len = kbuf.iov_len;
|
||||||
|
k0buf.iov_base = (char *)kbuf.iov_base + kbuf.iov_len;
|
||||||
|
prevk.iov_base = k0buf.iov_base;
|
||||||
|
|
||||||
|
while (!Eof) {
|
||||||
|
if (user_break) {
|
||||||
|
rc = MDBX_EINTR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = mdbx_txn_begin(env, NULL, 0, &txn);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_txn_begin failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
goto env_close;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = mdbx_dbi_open_ex(txn, subname, dbi_flags | MDBX_CREATE, &dbi,
|
||||||
|
append ? anyway_greater : NULL,
|
||||||
|
append ? anyway_greater : NULL);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_open failed, error %d %s\n", rc, mdbx_strerror(rc));
|
||||||
|
goto txn_abort;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = mdbx_cursor_open(txn, dbi, &mc);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_cursor_open failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
goto txn_abort;
|
||||||
|
}
|
||||||
|
|
||||||
|
int batch = 0;
|
||||||
|
prevk.iov_len = 0;
|
||||||
|
while (1) {
|
||||||
|
MDBX_val key;
|
||||||
|
rc = readline(&key, &kbuf);
|
||||||
|
if (rc) /* rc == EOF */
|
||||||
|
break;
|
||||||
|
|
||||||
|
MDBX_val data;
|
||||||
|
rc = readline(&data, &dbuf);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "%s: line %" PRIiSIZE ": failed to read key value\n",
|
||||||
|
prog, lineno);
|
||||||
|
goto txn_abort;
|
||||||
|
}
|
||||||
|
|
||||||
|
int appflag = 0;
|
||||||
|
if (append) {
|
||||||
|
appflag = MDBX_APPEND;
|
||||||
|
if (dbi_flags & MDBX_DUPSORT) {
|
||||||
|
if (prevk.iov_len == key.iov_len &&
|
||||||
|
memcmp(prevk.iov_base, key.iov_base, key.iov_len) == 0)
|
||||||
|
appflag = MDBX_APPEND | MDBX_APPENDDUP;
|
||||||
|
else
|
||||||
|
memcpy(prevk.iov_base, key.iov_base, prevk.iov_len = key.iov_len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rc = mdbx_cursor_put(mc, &key, &data, putflags | appflag);
|
||||||
|
if (rc == MDBX_KEYEXIST && putflags)
|
||||||
|
continue;
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_cursor_put failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
goto txn_abort;
|
||||||
|
}
|
||||||
|
batch++;
|
||||||
|
if (batch == 100) {
|
||||||
|
rc = mdbx_txn_commit(txn);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "%s: line %" PRIiSIZE ": txn_commit: %s\n", prog,
|
||||||
|
lineno, mdbx_strerror(rc));
|
||||||
|
goto env_close;
|
||||||
|
}
|
||||||
|
rc = mdbx_txn_begin(env, NULL, 0, &txn);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_txn_begin failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
goto env_close;
|
||||||
|
}
|
||||||
|
rc = mdbx_cursor_open(txn, dbi, &mc);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_cursor_open failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
goto txn_abort;
|
||||||
|
}
|
||||||
|
batch = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rc = mdbx_txn_commit(txn);
|
||||||
|
txn = NULL;
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "%s: line %" PRIiSIZE ": txn_commit: %s\n", prog, lineno,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
goto env_close;
|
||||||
|
}
|
||||||
|
mdbx_dbi_close(env, dbi);
|
||||||
|
|
||||||
|
/* try read next header */
|
||||||
|
if (!(mode & NOHDR))
|
||||||
|
readhdr();
|
||||||
|
}
|
||||||
|
|
||||||
|
txn_abort:
|
||||||
|
mdbx_txn_abort(txn);
|
||||||
|
env_close:
|
||||||
|
mdbx_env_close(env);
|
||||||
|
|
||||||
|
return rc ? EXIT_FAILURE : EXIT_SUCCESS;
|
||||||
|
}
|
||||||
436
contrib/db/libmdbx/src/tools/mdbx_stat.c
Normal file
436
contrib/db/libmdbx/src/tools/mdbx_stat.c
Normal file
|
|
@ -0,0 +1,436 @@
|
||||||
|
/* mdbx_stat.c - memory-mapped database status tool */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2015-2019 Leonid Yuriev <leo@yuriev.ru>
|
||||||
|
* and other libmdbx authors: please see AUTHORS file.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted only as authorized by the OpenLDAP
|
||||||
|
* Public License.
|
||||||
|
*
|
||||||
|
* A copy of this license is available in the file LICENSE in the
|
||||||
|
* top-level directory of the distribution or, alternatively, at
|
||||||
|
* <http://www.OpenLDAP.org/license.html>. */
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#if _MSC_VER > 1800
|
||||||
|
#pragma warning(disable : 4464) /* relative include path contains '..' */
|
||||||
|
#endif
|
||||||
|
#pragma warning(disable : 4996) /* The POSIX name is deprecated... */
|
||||||
|
#endif /* _MSC_VER (warnings) */
|
||||||
|
|
||||||
|
#define MDBX_TOOLS /* Avoid using internal mdbx_assert() */
|
||||||
|
#include "../elements/internals.h"
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
#include "wingetopt.h"
|
||||||
|
|
||||||
|
static volatile BOOL user_break;
|
||||||
|
static BOOL WINAPI ConsoleBreakHandlerRoutine(DWORD dwCtrlType) {
|
||||||
|
(void)dwCtrlType;
|
||||||
|
user_break = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* WINDOWS */
|
||||||
|
|
||||||
|
static volatile sig_atomic_t user_break;
|
||||||
|
static void signal_handler(int sig) {
|
||||||
|
(void)sig;
|
||||||
|
user_break = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !WINDOWS */
|
||||||
|
|
||||||
|
static void prstat(MDBX_stat *ms) {
|
||||||
|
printf(" Pagesize: %u\n", ms->ms_psize);
|
||||||
|
printf(" Tree depth: %u\n", ms->ms_depth);
|
||||||
|
printf(" Branch pages: %" PRIu64 "\n", ms->ms_branch_pages);
|
||||||
|
printf(" Leaf pages: %" PRIu64 "\n", ms->ms_leaf_pages);
|
||||||
|
printf(" Overflow pages: %" PRIu64 "\n", ms->ms_overflow_pages);
|
||||||
|
printf(" Entries: %" PRIu64 "\n", ms->ms_entries);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void usage(char *prog) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"usage: %s [-V] [-n] [-e] [-r[r]] [-f[f[f]]] [-a|-s subdb] dbpath\n",
|
||||||
|
prog);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int reader_list_func(void *ctx, int num, int slot, mdbx_pid_t pid,
|
||||||
|
mdbx_tid_t thread, uint64_t txnid, uint64_t lag,
|
||||||
|
size_t bytes_used, size_t bytes_retained) {
|
||||||
|
(void)ctx;
|
||||||
|
if (num == 1)
|
||||||
|
printf("Reader Table Status\n"
|
||||||
|
" #\tslot\t%6s %*s %20s %10s %13s %13s\n",
|
||||||
|
"pid", (int)sizeof(size_t) * 2, "thread", "txnid", "lag", "used",
|
||||||
|
"retained");
|
||||||
|
|
||||||
|
printf(" %3d)\t[%d]\t%6" PRIdSIZE " %*" PRIxSIZE, num, slot, (size_t)pid,
|
||||||
|
(int)sizeof(size_t) * 2, (size_t)thread);
|
||||||
|
if (txnid)
|
||||||
|
printf(" %20" PRIu64 " %10" PRIu64 " %12.1fM %12.1fM\n", txnid, lag,
|
||||||
|
bytes_used / 1048576.0, bytes_retained / 1048576.0);
|
||||||
|
else
|
||||||
|
printf(" %20s %10s %13s %13s\n", "-", "0", "0", "0");
|
||||||
|
|
||||||
|
return user_break ? MDBX_RESULT_TRUE : MDBX_RESULT_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
int o, rc;
|
||||||
|
MDBX_env *env;
|
||||||
|
MDBX_txn *txn;
|
||||||
|
MDBX_dbi dbi;
|
||||||
|
MDBX_stat mst;
|
||||||
|
MDBX_envinfo mei;
|
||||||
|
char *prog = argv[0];
|
||||||
|
char *envname;
|
||||||
|
char *subname = NULL;
|
||||||
|
int alldbs = 0, envinfo = 0, envflags = 0, freinfo = 0, rdrinfo = 0;
|
||||||
|
|
||||||
|
if (argc < 2)
|
||||||
|
usage(prog);
|
||||||
|
|
||||||
|
/* -a: print stat of main DB and all subDBs
|
||||||
|
* -s: print stat of only the named subDB
|
||||||
|
* -e: print env info
|
||||||
|
* -f: print freelist info
|
||||||
|
* -r: print reader info
|
||||||
|
* -n: use NOSUBDIR flag on env_open
|
||||||
|
* -V: print version and exit
|
||||||
|
* (default) print stat of only the main DB
|
||||||
|
*/
|
||||||
|
while ((o = getopt(argc, argv, "Vaefnrs:")) != EOF) {
|
||||||
|
switch (o) {
|
||||||
|
case 'V':
|
||||||
|
printf("mdbx_stat version %d.%d.%d.%d\n"
|
||||||
|
" - source: %s %s, commit %s, tree %s\n"
|
||||||
|
" - anchor: %s\n"
|
||||||
|
" - build: %s for %s by %s\n"
|
||||||
|
" - flags: %s\n"
|
||||||
|
" - options: %s\n",
|
||||||
|
mdbx_version.major, mdbx_version.minor, mdbx_version.release,
|
||||||
|
mdbx_version.revision, mdbx_version.git.describe,
|
||||||
|
mdbx_version.git.datetime, mdbx_version.git.commit,
|
||||||
|
mdbx_version.git.tree, mdbx_sourcery_anchor, mdbx_build.datetime,
|
||||||
|
mdbx_build.target, mdbx_build.compiler, mdbx_build.flags,
|
||||||
|
mdbx_build.options);
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
case 'a':
|
||||||
|
if (subname)
|
||||||
|
usage(prog);
|
||||||
|
alldbs++;
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
envinfo++;
|
||||||
|
break;
|
||||||
|
case 'f':
|
||||||
|
freinfo++;
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
envflags |= MDBX_NOSUBDIR;
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
rdrinfo++;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
if (alldbs)
|
||||||
|
usage(prog);
|
||||||
|
subname = optarg;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage(prog);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (optind != argc - 1)
|
||||||
|
usage(prog);
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
SetConsoleCtrlHandler(ConsoleBreakHandlerRoutine, true);
|
||||||
|
#else
|
||||||
|
#ifdef SIGPIPE
|
||||||
|
signal(SIGPIPE, signal_handler);
|
||||||
|
#endif
|
||||||
|
#ifdef SIGHUP
|
||||||
|
signal(SIGHUP, signal_handler);
|
||||||
|
#endif
|
||||||
|
signal(SIGINT, signal_handler);
|
||||||
|
signal(SIGTERM, signal_handler);
|
||||||
|
#endif /* !WINDOWS */
|
||||||
|
|
||||||
|
envname = argv[optind];
|
||||||
|
envname = argv[optind];
|
||||||
|
printf("mdbx_stat %s (%s, T-%s)\nRunning for %s...\n",
|
||||||
|
mdbx_version.git.describe, mdbx_version.git.datetime,
|
||||||
|
mdbx_version.git.tree, envname);
|
||||||
|
fflush(NULL);
|
||||||
|
|
||||||
|
rc = mdbx_env_create(&env);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_env_create failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alldbs || subname)
|
||||||
|
mdbx_env_set_maxdbs(env, 4);
|
||||||
|
|
||||||
|
rc = mdbx_env_open(env, envname, envflags | MDBX_RDONLY, 0664);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_env_open failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
goto env_close;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (envinfo || freinfo) {
|
||||||
|
(void)mdbx_env_info(env, &mei, sizeof(mei));
|
||||||
|
} else {
|
||||||
|
/* LY: zap warnings from gcc */
|
||||||
|
memset(&mei, 0, sizeof(mei));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (envinfo) {
|
||||||
|
(void)mdbx_env_stat(env, &mst, sizeof(mst));
|
||||||
|
printf("Environment Info\n");
|
||||||
|
printf(" Pagesize: %u\n", mst.ms_psize);
|
||||||
|
if (mei.mi_geo.lower != mei.mi_geo.upper) {
|
||||||
|
printf(" Dynamic datafile: %" PRIu64 "..%" PRIu64 " bytes (+%" PRIu64
|
||||||
|
"/-%" PRIu64 "), %" PRIu64 "..%" PRIu64 " pages (+%" PRIu64
|
||||||
|
"/-%" PRIu64 ")\n",
|
||||||
|
mei.mi_geo.lower, mei.mi_geo.upper, mei.mi_geo.grow,
|
||||||
|
mei.mi_geo.shrink, mei.mi_geo.lower / mst.ms_psize,
|
||||||
|
mei.mi_geo.upper / mst.ms_psize, mei.mi_geo.grow / mst.ms_psize,
|
||||||
|
mei.mi_geo.shrink / mst.ms_psize);
|
||||||
|
printf(" Current datafile: %" PRIu64 " bytes, %" PRIu64 " pages\n",
|
||||||
|
mei.mi_geo.current, mei.mi_geo.current / mst.ms_psize);
|
||||||
|
} else {
|
||||||
|
printf(" Fixed datafile: %" PRIu64 " bytes, %" PRIu64 " pages\n",
|
||||||
|
mei.mi_geo.current, mei.mi_geo.current / mst.ms_psize);
|
||||||
|
}
|
||||||
|
printf(" Current mapsize: %" PRIu64 " bytes, %" PRIu64 " pages \n",
|
||||||
|
mei.mi_mapsize, mei.mi_mapsize / mst.ms_psize);
|
||||||
|
printf(" Number of pages used: %" PRIu64 "\n", mei.mi_last_pgno + 1);
|
||||||
|
printf(" Last transaction ID: %" PRIu64 "\n", mei.mi_recent_txnid);
|
||||||
|
printf(" Tail transaction ID: %" PRIu64 " (%" PRIi64 ")\n",
|
||||||
|
mei.mi_latter_reader_txnid,
|
||||||
|
mei.mi_latter_reader_txnid - mei.mi_recent_txnid);
|
||||||
|
printf(" Max readers: %u\n", mei.mi_maxreaders);
|
||||||
|
printf(" Number of readers used: %u\n", mei.mi_numreaders);
|
||||||
|
} else {
|
||||||
|
/* LY: zap warnings from gcc */
|
||||||
|
memset(&mst, 0, sizeof(mst));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rdrinfo) {
|
||||||
|
rc = mdbx_reader_list(env, reader_list_func, nullptr);
|
||||||
|
if (rc == MDBX_RESULT_TRUE)
|
||||||
|
printf("Reader Table is empty\n");
|
||||||
|
else if (rc == MDBX_SUCCESS && rdrinfo > 1) {
|
||||||
|
int dead;
|
||||||
|
rc = mdbx_reader_check(env, &dead);
|
||||||
|
if (rc == MDBX_RESULT_TRUE) {
|
||||||
|
printf(" %d stale readers cleared.\n", dead);
|
||||||
|
rc = mdbx_reader_list(env, reader_list_func, nullptr);
|
||||||
|
if (rc == MDBX_RESULT_TRUE)
|
||||||
|
printf(" Now Reader Table is empty\n");
|
||||||
|
} else
|
||||||
|
printf(" No stale readers.\n");
|
||||||
|
}
|
||||||
|
if (MDBX_IS_ERROR(rc)) {
|
||||||
|
fprintf(stderr, "mdbx_txn_begin failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
goto env_close;
|
||||||
|
}
|
||||||
|
if (!(subname || alldbs || freinfo))
|
||||||
|
goto env_close;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = mdbx_txn_begin(env, NULL, MDBX_RDONLY, &txn);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_txn_begin failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
goto env_close;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (freinfo) {
|
||||||
|
MDBX_cursor *cursor;
|
||||||
|
MDBX_val key, data;
|
||||||
|
pgno_t pages = 0, *iptr;
|
||||||
|
pgno_t reclaimable = 0;
|
||||||
|
|
||||||
|
printf("Freelist Status\n");
|
||||||
|
dbi = 0;
|
||||||
|
rc = mdbx_cursor_open(txn, dbi, &cursor);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_cursor_open failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
goto txn_abort;
|
||||||
|
}
|
||||||
|
rc = mdbx_dbi_stat(txn, dbi, &mst, sizeof(mst));
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_dbi_stat failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
goto txn_abort;
|
||||||
|
}
|
||||||
|
prstat(&mst);
|
||||||
|
while ((rc = mdbx_cursor_get(cursor, &key, &data, MDBX_NEXT)) ==
|
||||||
|
MDBX_SUCCESS) {
|
||||||
|
if (user_break) {
|
||||||
|
rc = MDBX_EINTR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
iptr = data.iov_base;
|
||||||
|
const pgno_t number = *iptr++;
|
||||||
|
|
||||||
|
pages += number;
|
||||||
|
if (envinfo && mei.mi_latter_reader_txnid > *(size_t *)key.iov_base)
|
||||||
|
reclaimable += number;
|
||||||
|
|
||||||
|
if (freinfo > 1) {
|
||||||
|
char *bad = "";
|
||||||
|
pgno_t prev =
|
||||||
|
MDBX_PNL_ASCENDING ? NUM_METAS - 1 : (pgno_t)mei.mi_last_pgno + 1;
|
||||||
|
pgno_t span = 1;
|
||||||
|
for (unsigned i = 0; i < number; ++i) {
|
||||||
|
pgno_t pg = iptr[i];
|
||||||
|
if (MDBX_PNL_DISORDERED(prev, pg))
|
||||||
|
bad = " [bad sequence]";
|
||||||
|
prev = pg;
|
||||||
|
while (i + span < number &&
|
||||||
|
iptr[i + span] == (MDBX_PNL_ASCENDING ? pgno_add(pg, span)
|
||||||
|
: pgno_sub(pg, span)))
|
||||||
|
++span;
|
||||||
|
}
|
||||||
|
printf(" Transaction %" PRIaTXN ", %" PRIaPGNO
|
||||||
|
" pages, maxspan %" PRIaPGNO "%s\n",
|
||||||
|
*(txnid_t *)key.iov_base, number, span, bad);
|
||||||
|
if (freinfo > 2) {
|
||||||
|
for (unsigned i = 0; i < number; i += span) {
|
||||||
|
const pgno_t pg = iptr[i];
|
||||||
|
for (span = 1;
|
||||||
|
i + span < number &&
|
||||||
|
iptr[i + span] == (MDBX_PNL_ASCENDING ? pgno_add(pg, span)
|
||||||
|
: pgno_sub(pg, span));
|
||||||
|
++span)
|
||||||
|
;
|
||||||
|
if (span > 1)
|
||||||
|
printf(" %9" PRIaPGNO "[%" PRIaPGNO "]\n", pg, span);
|
||||||
|
else
|
||||||
|
printf(" %9" PRIaPGNO "\n", pg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mdbx_cursor_close(cursor);
|
||||||
|
|
||||||
|
switch (rc) {
|
||||||
|
case MDBX_SUCCESS:
|
||||||
|
case MDBX_NOTFOUND:
|
||||||
|
break;
|
||||||
|
case MDBX_EINTR:
|
||||||
|
fprintf(stderr, "Interrupted by signal/user\n");
|
||||||
|
goto txn_abort;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "mdbx_cursor_get failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
goto txn_abort;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (envinfo) {
|
||||||
|
uint64_t value = mei.mi_mapsize / mst.ms_psize;
|
||||||
|
double percent = value / 100.0;
|
||||||
|
printf("Page Allocation Info\n");
|
||||||
|
printf(" Max pages: %" PRIu64 " 100%%\n", value);
|
||||||
|
|
||||||
|
value = mei.mi_last_pgno + 1;
|
||||||
|
printf(" Pages used: %" PRIu64 " %.1f%%\n", value, value / percent);
|
||||||
|
|
||||||
|
value = mei.mi_mapsize / mst.ms_psize - (mei.mi_last_pgno + 1);
|
||||||
|
printf(" Remained: %" PRIu64 " %.1f%%\n", value, value / percent);
|
||||||
|
|
||||||
|
value = mei.mi_last_pgno + 1 - pages;
|
||||||
|
printf(" Used now: %" PRIu64 " %.1f%%\n", value, value / percent);
|
||||||
|
|
||||||
|
value = pages;
|
||||||
|
printf(" Unallocated: %" PRIu64 " %.1f%%\n", value, value / percent);
|
||||||
|
|
||||||
|
value = pages - reclaimable;
|
||||||
|
printf(" Detained: %" PRIu64 " %.1f%%\n", value, value / percent);
|
||||||
|
|
||||||
|
value = reclaimable;
|
||||||
|
printf(" Reclaimable: %" PRIu64 " %.1f%%\n", value, value / percent);
|
||||||
|
|
||||||
|
value =
|
||||||
|
mei.mi_mapsize / mst.ms_psize - (mei.mi_last_pgno + 1) + reclaimable;
|
||||||
|
printf(" Available: %" PRIu64 " %.1f%%\n", value, value / percent);
|
||||||
|
} else
|
||||||
|
printf(" Free pages: %" PRIaPGNO "\n", pages);
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = mdbx_dbi_open(txn, subname, 0, &dbi);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_open failed, error %d %s\n", rc, mdbx_strerror(rc));
|
||||||
|
goto txn_abort;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = mdbx_dbi_stat(txn, dbi, &mst, sizeof(mst));
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_dbi_stat failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
goto txn_abort;
|
||||||
|
}
|
||||||
|
printf("Status of %s\n", subname ? subname : "Main DB");
|
||||||
|
prstat(&mst);
|
||||||
|
|
||||||
|
if (alldbs) {
|
||||||
|
MDBX_cursor *cursor;
|
||||||
|
MDBX_val key;
|
||||||
|
|
||||||
|
rc = mdbx_cursor_open(txn, dbi, &cursor);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_cursor_open failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
goto txn_abort;
|
||||||
|
}
|
||||||
|
while ((rc = mdbx_cursor_get(cursor, &key, NULL, MDBX_NEXT_NODUP)) == 0) {
|
||||||
|
char *str;
|
||||||
|
MDBX_dbi db2;
|
||||||
|
if (memchr(key.iov_base, '\0', key.iov_len))
|
||||||
|
continue;
|
||||||
|
str = mdbx_malloc(key.iov_len + 1);
|
||||||
|
memcpy(str, key.iov_base, key.iov_len);
|
||||||
|
str[key.iov_len] = '\0';
|
||||||
|
rc = mdbx_dbi_open(txn, str, 0, &db2);
|
||||||
|
if (rc == MDBX_SUCCESS)
|
||||||
|
printf("Status of %s\n", str);
|
||||||
|
mdbx_free(str);
|
||||||
|
if (rc)
|
||||||
|
continue;
|
||||||
|
rc = mdbx_dbi_stat(txn, db2, &mst, sizeof(mst));
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "mdbx_dbi_stat failed, error %d %s\n", rc,
|
||||||
|
mdbx_strerror(rc));
|
||||||
|
goto txn_abort;
|
||||||
|
}
|
||||||
|
prstat(&mst);
|
||||||
|
mdbx_dbi_close(env, db2);
|
||||||
|
}
|
||||||
|
mdbx_cursor_close(cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rc == MDBX_NOTFOUND)
|
||||||
|
rc = MDBX_SUCCESS;
|
||||||
|
|
||||||
|
mdbx_dbi_close(env, dbi);
|
||||||
|
txn_abort:
|
||||||
|
mdbx_txn_abort(txn);
|
||||||
|
env_close:
|
||||||
|
mdbx_env_close(env);
|
||||||
|
|
||||||
|
return rc ? EXIT_FAILURE : EXIT_SUCCESS;
|
||||||
|
}
|
||||||
95
contrib/db/libmdbx/src/tools/wingetopt.c
Normal file
95
contrib/db/libmdbx/src/tools/wingetopt.c
Normal file
|
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
* POSIX getopt for Windows
|
||||||
|
*
|
||||||
|
* AT&T Public License
|
||||||
|
*
|
||||||
|
* Code given out at the 1985 UNIFORUM conference in Dallas.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* Microsoft compiler generates a lot of warning for self includes... */
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(push, 1)
|
||||||
|
#pragma warning(disable : 4548) /* expression before comma has no effect; \
|
||||||
|
expected expression with side - effect */
|
||||||
|
#pragma warning(disable : 4530) /* C++ exception handler used, but unwind \
|
||||||
|
* semantics are not enabled. Specify /EHsc */
|
||||||
|
#pragma warning(disable : 4577) /* 'noexcept' used with no exception handling \
|
||||||
|
* mode specified; termination on exception is \
|
||||||
|
* not guaranteed. Specify /EHsc */
|
||||||
|
#if !defined(_CRT_SECURE_NO_WARNINGS)
|
||||||
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
|
#endif
|
||||||
|
#endif /* _MSC_VER (warnings) */
|
||||||
|
|
||||||
|
#include "wingetopt.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef NULL
|
||||||
|
#define NULL 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EOF
|
||||||
|
#define EOF (-1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ERR(s, c) \
|
||||||
|
if (opterr) { \
|
||||||
|
fputs(argv[0], stderr); \
|
||||||
|
fputs(s, stderr); \
|
||||||
|
fputc(c, stderr); \
|
||||||
|
}
|
||||||
|
|
||||||
|
int opterr = 1;
|
||||||
|
int optind = 1;
|
||||||
|
int optopt;
|
||||||
|
char *optarg;
|
||||||
|
|
||||||
|
int getopt(int argc, char *const argv[], const char *opts) {
|
||||||
|
static int sp = 1;
|
||||||
|
int c;
|
||||||
|
const char *cp;
|
||||||
|
|
||||||
|
if (sp == 1) {
|
||||||
|
if (optind >= argc || argv[optind][0] != '-' || argv[optind][1] == '\0')
|
||||||
|
return EOF;
|
||||||
|
else if (strcmp(argv[optind], "--") == 0) {
|
||||||
|
optind++;
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
optopt = c = argv[optind][sp];
|
||||||
|
if (c == ':' || (cp = strchr(opts, c)) == NULL) {
|
||||||
|
ERR(": illegal option -- ", c);
|
||||||
|
if (argv[optind][++sp] == '\0') {
|
||||||
|
optind++;
|
||||||
|
sp = 1;
|
||||||
|
}
|
||||||
|
return '?';
|
||||||
|
}
|
||||||
|
if (*++cp == ':') {
|
||||||
|
if (argv[optind][sp + 1] != '\0')
|
||||||
|
optarg = &argv[optind++][sp + 1];
|
||||||
|
else if (++optind >= argc) {
|
||||||
|
ERR(": option requires an argument -- ", c);
|
||||||
|
sp = 1;
|
||||||
|
return '?';
|
||||||
|
} else
|
||||||
|
optarg = argv[optind++];
|
||||||
|
sp = 1;
|
||||||
|
} else {
|
||||||
|
if (argv[optind][++sp] == '\0') {
|
||||||
|
sp = 1;
|
||||||
|
optind++;
|
||||||
|
}
|
||||||
|
optarg = NULL;
|
||||||
|
}
|
||||||
|
return c;
|
||||||
|
}
|
||||||
30
contrib/db/libmdbx/src/tools/wingetopt.h
Normal file
30
contrib/db/libmdbx/src/tools/wingetopt.h
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
* POSIX getopt for Windows
|
||||||
|
*
|
||||||
|
* AT&T Public License
|
||||||
|
*
|
||||||
|
* Code given out at the 1985 UNIFORUM conference in Dallas.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _WINGETOPT_H_
|
||||||
|
#define _WINGETOPT_H_
|
||||||
|
|
||||||
|
/* Bit of madness for Windows console */
|
||||||
|
#define mdbx_strerror mdbx_strerror_ANSI2OEM
|
||||||
|
#define mdbx_strerror_r mdbx_strerror_r_ANSI2OEM
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern int opterr;
|
||||||
|
extern int optind;
|
||||||
|
extern int optopt;
|
||||||
|
extern char *optarg;
|
||||||
|
int getopt(int argc, char *const argv[], const char *optstring);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _GETOPT_H_ */
|
||||||
53
contrib/db/libmdbx/test/CMakeLists.txt
Normal file
53
contrib/db/libmdbx/test/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
|
||||||
|
set(TEST_OSAL windows)
|
||||||
|
else()
|
||||||
|
set(TEST_OSAL unix)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_executable(mdbx_test
|
||||||
|
base.h
|
||||||
|
cases.cc
|
||||||
|
chrono.cc
|
||||||
|
chrono.h
|
||||||
|
config.cc
|
||||||
|
config.h
|
||||||
|
copy.cc
|
||||||
|
dead.cc
|
||||||
|
hill.cc
|
||||||
|
jitter.cc
|
||||||
|
keygen.cc
|
||||||
|
keygen.h
|
||||||
|
log.cc
|
||||||
|
log.h
|
||||||
|
main.cc
|
||||||
|
osal.h
|
||||||
|
osal-${TEST_OSAL}.cc
|
||||||
|
test.cc
|
||||||
|
test.h
|
||||||
|
try.cc
|
||||||
|
utils.cc
|
||||||
|
utils.h
|
||||||
|
append.cc
|
||||||
|
ttl.cc
|
||||||
|
nested.cc
|
||||||
|
)
|
||||||
|
|
||||||
|
set_target_properties(mdbx_test PROPERTIES
|
||||||
|
INTERPROCEDURAL_OPTIMIZATION $<BOOL:${INTERPROCEDURAL_OPTIMIZATION}>
|
||||||
|
CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
|
if(CC_HAS_FASTMATH)
|
||||||
|
target_compile_options(mdbx_test PRIVATE "-ffast-math")
|
||||||
|
endif()
|
||||||
|
if(CC_HAS_VISIBILITY AND (LTO_ENABLED OR INTERPROCEDURAL_OPTIMIZATION))
|
||||||
|
set_target_properties(mdbx_test PROPERTIES LINK_FLAGS "-fvisibility=hidden")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_link_libraries(mdbx_test mdbx ${LIB_MATH} ${CMAKE_THREAD_LIBS_INIT})
|
||||||
|
if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
|
||||||
|
target_link_libraries(mdbx_test winmm.lib)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(UNIX AND NOT SUBPROJECT)
|
||||||
|
add_subdirectory(pcrf)
|
||||||
|
endif()
|
||||||
164
contrib/db/libmdbx/test/append.cc
Normal file
164
contrib/db/libmdbx/test/append.cc
Normal file
|
|
@ -0,0 +1,164 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017-2019 Leonid Yuriev <leo@yuriev.ru>
|
||||||
|
* and other libmdbx authors: please see AUTHORS file.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted only as authorized by the OpenLDAP
|
||||||
|
* Public License.
|
||||||
|
*
|
||||||
|
* A copy of this license is available in the file LICENSE in the
|
||||||
|
* top-level directory of the distribution or, alternatively, at
|
||||||
|
* <http://www.OpenLDAP.org/license.html>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "test.h"
|
||||||
|
|
||||||
|
bool testcase_append::run() {
|
||||||
|
int err = db_open__begin__table_create_open_clean(dbi);
|
||||||
|
if (unlikely(err != MDBX_SUCCESS)) {
|
||||||
|
log_notice("append: bailout-prepare due '%s'", mdbx_strerror(err));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
keyvalue_maker.setup(config.params, config.actor_id, 0 /* thread_number */);
|
||||||
|
/* LY: тест наполнения таблиц в append-режиме,
|
||||||
|
* при котором записи добавляются строго в конец (в порядке сортировки) */
|
||||||
|
const unsigned flags = (config.params.table_flags & MDBX_DUPSORT)
|
||||||
|
? MDBX_APPEND | MDBX_APPENDDUP
|
||||||
|
: MDBX_APPEND;
|
||||||
|
keyvalue_maker.make_ordered();
|
||||||
|
|
||||||
|
key = keygen::alloc(config.params.keylen_max);
|
||||||
|
data = keygen::alloc(config.params.datalen_max);
|
||||||
|
keygen::buffer last_key = keygen::alloc(config.params.keylen_max);
|
||||||
|
keygen::buffer last_data = keygen::alloc(config.params.datalen_max);
|
||||||
|
last_key->value.iov_base = last_key->bytes;
|
||||||
|
last_key->value.iov_len = 0;
|
||||||
|
last_data->value.iov_base = last_data->bytes;
|
||||||
|
last_data->value.iov_len = 0;
|
||||||
|
|
||||||
|
simple_checksum inserted_checksum;
|
||||||
|
uint64_t inserted_number = 0;
|
||||||
|
uint64_t serial_count = 0;
|
||||||
|
|
||||||
|
unsigned txn_nops = 0;
|
||||||
|
uint64_t commited_inserted_number = inserted_number;
|
||||||
|
simple_checksum commited_inserted_checksum = inserted_checksum;
|
||||||
|
while (should_continue()) {
|
||||||
|
const keygen::serial_t serial = serial_count;
|
||||||
|
if (!keyvalue_maker.increment(serial_count, 1)) {
|
||||||
|
// дошли до границы пространства ключей
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_trace("append: append-a %" PRIu64, serial);
|
||||||
|
generate_pair(serial, key, data);
|
||||||
|
int cmp = inserted_number ? mdbx_cmp(txn_guard.get(), dbi, &key->value,
|
||||||
|
&last_key->value)
|
||||||
|
: 1;
|
||||||
|
if (cmp == 0 && (config.params.table_flags & MDBX_DUPSORT))
|
||||||
|
cmp = mdbx_dcmp(txn_guard.get(), dbi, &data->value, &last_data->value);
|
||||||
|
|
||||||
|
err = mdbx_put(txn_guard.get(), dbi, &key->value, &data->value, flags);
|
||||||
|
if (err == MDBX_MAP_FULL && config.params.ignore_dbfull) {
|
||||||
|
log_notice("append: bailout-insert due '%s'", mdbx_strerror(err));
|
||||||
|
txn_end(true);
|
||||||
|
inserted_number = commited_inserted_number;
|
||||||
|
inserted_checksum = commited_inserted_checksum;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cmp > 0) {
|
||||||
|
if (unlikely(err != MDBX_SUCCESS))
|
||||||
|
failure_perror("mdbx_put(appenda-a)", err);
|
||||||
|
|
||||||
|
memcpy(last_key->value.iov_base, key->value.iov_base,
|
||||||
|
last_key->value.iov_len = key->value.iov_len);
|
||||||
|
memcpy(last_data->value.iov_base, data->value.iov_base,
|
||||||
|
last_data->value.iov_len = data->value.iov_len);
|
||||||
|
++inserted_number;
|
||||||
|
inserted_checksum.push((uint32_t)inserted_number, key->value);
|
||||||
|
inserted_checksum.push(10639, data->value);
|
||||||
|
} else {
|
||||||
|
if (unlikely(err != MDBX_EKEYMISMATCH))
|
||||||
|
failure_perror("mdbx_put(appenda-a) != MDBX_EKEYMISMATCH", err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (++txn_nops >= config.params.batch_write) {
|
||||||
|
err = breakable_restart();
|
||||||
|
if (unlikely(err != MDBX_SUCCESS)) {
|
||||||
|
log_notice("append: bailout-commit due '%s'", mdbx_strerror(err));
|
||||||
|
inserted_number = commited_inserted_number;
|
||||||
|
inserted_checksum = commited_inserted_checksum;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
commited_inserted_number = inserted_number;
|
||||||
|
commited_inserted_checksum = inserted_checksum;
|
||||||
|
txn_nops = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
report(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (txn_guard) {
|
||||||
|
err = breakable_commit();
|
||||||
|
if (unlikely(err != MDBX_SUCCESS)) {
|
||||||
|
log_notice("append: bailout-commit due '%s'", mdbx_strerror(err));
|
||||||
|
inserted_number = commited_inserted_number;
|
||||||
|
inserted_checksum = commited_inserted_checksum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
txn_begin(true);
|
||||||
|
cursor_open(dbi);
|
||||||
|
|
||||||
|
MDBX_val check_key, check_data;
|
||||||
|
err =
|
||||||
|
mdbx_cursor_get(cursor_guard.get(), &check_key, &check_data, MDBX_FIRST);
|
||||||
|
if (likely(inserted_number)) {
|
||||||
|
if (unlikely(err != MDBX_SUCCESS))
|
||||||
|
failure_perror("mdbx_cursor_get(MDBX_FIRST)", err);
|
||||||
|
}
|
||||||
|
|
||||||
|
simple_checksum read_checksum;
|
||||||
|
uint64_t read_count = 0;
|
||||||
|
while (err == MDBX_SUCCESS) {
|
||||||
|
++read_count;
|
||||||
|
read_checksum.push((uint32_t)read_count, check_key);
|
||||||
|
read_checksum.push(10639, check_data);
|
||||||
|
|
||||||
|
err =
|
||||||
|
mdbx_cursor_get(cursor_guard.get(), &check_key, &check_data, MDBX_NEXT);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (unlikely(err != MDBX_NOTFOUND))
|
||||||
|
failure_perror("mdbx_cursor_get(MDBX_NEXT) != EOF", err);
|
||||||
|
|
||||||
|
if (unlikely(read_count != inserted_number))
|
||||||
|
failure("read_count(%" PRIu64 ") != inserted_number(%" PRIu64 ")",
|
||||||
|
read_count, inserted_number);
|
||||||
|
|
||||||
|
if (unlikely(read_checksum.value != inserted_checksum.value))
|
||||||
|
failure("read_checksum(0x%016" PRIu64 ") "
|
||||||
|
"!= inserted_checksum(0x%016" PRIu64 ")",
|
||||||
|
read_checksum.value, inserted_checksum.value);
|
||||||
|
|
||||||
|
cursor_close();
|
||||||
|
txn_end(true);
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if (dbi) {
|
||||||
|
if (config.params.drop_table && !mode_readonly()) {
|
||||||
|
txn_begin(false);
|
||||||
|
db_table_drop(dbi);
|
||||||
|
err = breakable_commit();
|
||||||
|
if (unlikely(err != MDBX_SUCCESS)) {
|
||||||
|
log_notice("append: bailout-clean due '%s'", mdbx_strerror(err));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
db_table_close(dbi);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
116
contrib/db/libmdbx/test/base.h
Normal file
116
contrib/db/libmdbx/test/base.h
Normal file
|
|
@ -0,0 +1,116 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017-2019 Leonid Yuriev <leo@yuriev.ru>
|
||||||
|
* and other libmdbx authors: please see AUTHORS file.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted only as authorized by the OpenLDAP
|
||||||
|
* Public License.
|
||||||
|
*
|
||||||
|
* A copy of this license is available in the file LICENSE in the
|
||||||
|
* top-level directory of the distribution or, alternatively, at
|
||||||
|
* <http://www.OpenLDAP.org/license.html>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef NOMINMAX
|
||||||
|
#define NOMINMAX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64) || defined(_WINDOWS)
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
|
#pragma warning(push, 1)
|
||||||
|
#pragma warning(disable : 4548) /* expression before comma has no effect; \
|
||||||
|
expected expression with side - effect */
|
||||||
|
#pragma warning(disable : 4530) /* C++ exception handler used, but unwind \
|
||||||
|
semantics are not enabled. Specify /EHsc */
|
||||||
|
#pragma warning(disable : 4577) /* 'noexcept' used with no exception handling \
|
||||||
|
mode specified; termination on exception \
|
||||||
|
is not guaranteed. Specify /EHsc */
|
||||||
|
#endif /* _MSC_VER (warnings) */
|
||||||
|
|
||||||
|
/* If you wish to build your application for a previous Windows platform,
|
||||||
|
* include WinSDKVer.h and set the _WIN32_WINNT macro to the platform you
|
||||||
|
* wish to support before including SDKDDKVer.h.
|
||||||
|
*
|
||||||
|
* TODO: #define _WIN32_WINNT WIN32_MUSTDIE */
|
||||||
|
#include <SDKDDKVer.h>
|
||||||
|
#endif /* WINDOWS */
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#define _DARWIN_C_SOURCE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64) || defined(_WINDOWS)
|
||||||
|
#include <io.h>
|
||||||
|
#else
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _BSD_SOURCE
|
||||||
|
#include <endian.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cassert>
|
||||||
|
#include <cinttypes> // for PRId64, PRIu64
|
||||||
|
#include <cstdarg>
|
||||||
|
#include <cstddef>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <map>
|
||||||
|
#include <memory>
|
||||||
|
#include <set>
|
||||||
|
#include <string>
|
||||||
|
#include <type_traits>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <unordered_set>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#define MDBX_INTERNAL_FUNC
|
||||||
|
#define MDBX_INTERNAL_VAR extern
|
||||||
|
#define MDBX_TOOLS /* Avoid using internal mdbx_assert() */
|
||||||
|
#include "../mdbx.h"
|
||||||
|
#include "../src/elements/defs.h"
|
||||||
|
#include "../src/elements/osal.h"
|
||||||
|
|
||||||
|
#if !defined(__thread) && (defined(_MSC_VER) || defined(__DMC__))
|
||||||
|
#define __thread __declspec(thread)
|
||||||
|
#endif /* __thread */
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(pop)
|
||||||
|
#pragma warning(disable : 4201) /* nonstandard extension used : \
|
||||||
|
nameless struct / union */
|
||||||
|
#pragma warning(disable : 4127) /* conditional expression is constant */
|
||||||
|
#if _MSC_VER < 1900
|
||||||
|
#pragma warning(disable : 4510) /* default constructor could \
|
||||||
|
not be generated */
|
||||||
|
#pragma warning(disable : 4512) /* assignment operator could \
|
||||||
|
not be generated */
|
||||||
|
#pragma warning(disable : 4610) /* user-defined constructor required */
|
||||||
|
#ifndef snprintf
|
||||||
|
#define snprintf(buffer, buffer_size, format, ...) \
|
||||||
|
_snprintf_s(buffer, buffer_size, _TRUNCATE, format, __VA_ARGS__)
|
||||||
|
#endif
|
||||||
|
#ifndef vsnprintf
|
||||||
|
#define vsnprintf(buffer, buffer_size, format, args) \
|
||||||
|
_vsnprintf_s(buffer, buffer_size, _TRUNCATE, format, args)
|
||||||
|
#endif
|
||||||
|
#pragma warning(disable : 4996) /* 'vsnprintf': This function or variable \
|
||||||
|
may be unsafe */
|
||||||
|
#endif
|
||||||
|
#endif /* _MSC_VER */
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue