Merge branch 'master' into pieces

This commit is contained in:
Alessandre Laguierce 2024-11-27 14:22:20 +01:00
commit b2b769da8f
62 changed files with 14012 additions and 306 deletions

View File

@ -1,6 +0,0 @@
NODE_PORT=3000
NODE_ENV=dev
DB_HOST=localhost
DB_NAME=briques_db
DB_USER=briques_llm
DB_PASSWORD=briques_password_2025

3
.gitignore vendored
View File

@ -1,3 +1,4 @@
dev-db/
database/
**/.env
**/.env
*.data

15
Makefile Normal file
View File

@ -0,0 +1,15 @@
DIR_SQL = PostgreSQL
DIR_BACK = back-end
BIN = prepare_dev
all: $(BIN)
prepare_dev:
cp $(DIR_BACK)/.env.example $(DIR_BACK)/.env
cd $(DIR_SQL) && make
clean:
rm -f $(DIR_BACK)/.env
cd $(DIR_SQL) && make clean

663
PostgreSQL/.csv/brands.csv Normal file
View File

@ -0,0 +1,663 @@
brand
Klein LLC
DuBuque and Sons
Wisozk-Heidenreich
Fadel-Torp
Predovic-Aufderhar
Simonis Inc
Gleason and Sons
Hilll-Douglas
Leannon Inc
Hane Inc
Bechtelar-Mosciski
Hane-Kirlin
Oberbrunner-Sauer
Lakin Inc
Daniel-Kris
Price-Gerhold
Schultz Inc
Erdman and Sons
Blick-Howell
Leannon Group
Prosacco LLC
Corwin-Schimmel
Morar-Harber
Kemmer and Sons
Boehm-Balistreri
Schumm LLC
Olson-Schmitt
McCullough-Stoltenberg
Ferry LLC
Cruickshank and Sons
Goodwin-Mayert
Feest Inc
Koss-Flatley
Stark Inc
Ratke-Bode
Walker-Pacocha
Schumm-Jacobs
Botsford Inc
Baumbach LLC
Turcotte Group
Boyle-Brown
Kuvalis and Sons
Cartwright Inc
Russel-Heller
Gleichner-Barton
Kreiger-Walsh
Murphy-Von
Morissette-Zulauf
Jacobs-Schaefer
Fay and Sons
Reichel LLC
Gutkowski LLC
Littel Inc
Towne-Harvey
Lang-Kirlin
VonRueden and Sons
Bogan-Tremblay
Bradtke-Monahan
Stiedemann-Kling
Champlin-Jacobs
Walsh-Blick
Hagenes-Paucek
Volkman and Sons
Abshire Inc
Senger-Johnston
Hand Group
Rolfson-Mayert
Volkman-Ondricka
Runolfsdottir-Walter
Schulist-Wolf
Reichel-Franecki
Effertz and Sons
Howe LLC
Rohan-Bartoletti
Pacocha-Emmerich
Nolan-Quitzon
Stiedemann Inc
Connelly-Leuschke
Cummings-Gibson
Weimann-Kub
Nitzsche-McDermott
Von Group
Dietrich LLC
Schamberger and Sons
Jones-Bogisich
Corwin Inc
Ziemann-Kohler
Ratke-Langosh
Price-Bosco
Schmeler-Dibbert
Monahan Inc
Kuvalis LLC
Schamberger-Kautzer
Dickinson-Grady
Parisian-Runte
Hirthe Inc
Tromp-Renner
Pfeffer LLC
Jaskolski and Sons
Koepp and Sons
Maggio-Hickle
Casper-Carter
Herzog-Jaskolski
Lakin-Borer
Sanford-Maggio
Shields-Kihn
Wilderman-Wisozk
Nienow-Sanford
Stiedemann LLC
Fay-Weber
Cartwright-Wiegand
Veum Inc
Greenholt Group
Bergnaum and Sons
Steuber-Breitenberg
Rempel-Lynch
Baumbach Inc
Jast-Schiller
Streich LLC
Marquardt-Parisian
Labadie and Sons
Gulgowski LLC
Balistreri Group
Kiehn-Hirthe
Effertz-Gorczany
Goldner-Breitenberg
Upton-Beier
White LLC
Rowe Group
Wolf-Roberts
Hudson-Pacocha
Mohr-Pacocha
Doyle LLC
Kihn-Kirlin
Dooley LLC
Vandervort-Feest
Thiel-Gorczany
Reichel-Mertz
Medhurst Group
Feil and Sons
Runolfsdottir Group
Fritsch-Gerhold
Lang Group
Ullrich LLC
Oberbrunner-Hirthe
Bosco-Lehner
Orn Group
Blick-Bruen
Green and Sons
Sporer Group
Prohaska-Hauck
Reynolds Group
Block-Parisian
Schumm-Ortiz
Leffler-Murazik
Crist LLC
Marquardt Group
Gislason Inc
Ondricka-Hintz
Walsh LLC
Koepp-Schamberger
Rath-Runolfsdottir
Bayer-Green
Reichert Group
Haag LLC
Haley-Donnelly
Russel Inc
Zulauf Inc
Hermiston and Sons
Runolfsdottir Inc
Smitham-Ryan
Goyette LLC
Cummerata Inc
Marks-Nikolaus
Turcotte Group
Walsh Group
Erdman LLC
Willms-Ortiz
Miller and Sons
Moore and Sons
Leffler-Dicki
Kautzer-Funk
Murazik-Sipes
Pollich Group
Volkman-Koepp
Prosacco LLC
Trantow LLC
McClure-Stanton
Corwin-Prohaska
Carroll and Sons
West-Hane
Ernser and Sons
Jacobson-Kohler
Orn-Lemke
Moen-Lemke
Hackett-Mosciski
Hane LLC
Wisoky-Jenkins
Grady Inc
Hagenes Group
Donnelly-Waelchi
Hermann LLC
Weber and Sons
Stamm LLC
Fay-Satterfield
Ondricka-Waelchi
Jacobson and Sons
Smitham LLC
Heidenreich-Robel
Langworth-Beier
Spinka-Emard
Funk LLC
Mayer and Sons
McGlynn-Beer
Rippin-Steuber
Moen-Yundt
Vandervort-Breitenberg
Tromp and Sons
Pagac-Gislason
Kulas-Stehr
Ryan LLC
Bogisich-Baumbach
Steuber Inc
Boyle-Ondricka
Thompson LLC
Wilkinson-Flatley
Powlowski-Hane
Schumm and Sons
Thiel and Sons
Nolan-Witting
Zboncak-Pagac
Harris-Thompson
Hickle-Schaefer
Miller LLC
Lindgren Group
Reilly-Kautzer
Barton and Sons
Sawayn Inc
Schmitt-Runolfsson
Gibson-Donnelly
Marks LLC
Yost LLC
Paucek and Sons
Rice-Krajcik
Pfannerstill LLC
Willms-Runolfsdottir
Grady Inc
Reichert-Schroeder
Kilback-Johnston
Bauch-Brown
Aufderhar LLC
Emmerich-Schumm
Bednar-Luettgen
Conroy-Wilkinson
Langosh-Howe
Breitenberg-Gerhold
Considine-Miller
Langworth and Sons
Balistreri LLC
Parisian-Pollich
Jacobson Inc
Ferry-Torphy
Effertz LLC
Trantow-Marvin
Borer and Sons
Pfeffer-Klein
Leannon-Grady
Smitham-Mohr
Mante-Padberg
Hills Inc
Zemlak Group
Kessler-Green
Terry-Reichert
Macejkovic and Sons
Rice-Bayer
Romaguera-Wuckert
Dickinson-Greenfelder
VonRueden Group
Krajcik and Sons
Romaguera-Pfannerstill
Heller-Hammes
Wisozk LLC
Auer-Beatty
Heller-Marks
Kertzmann and Sons
Schuppe LLC
Hammes-Schimmel
Raynor Inc
Balistreri Group
McKenzie and Sons
Ebert Group
Stanton and Sons
Kiehn-Rohan
Collier and Sons
Johns-Howe
Hilll-Emard
Douglas-Dietrich
Quitzon Inc
Olson-Schumm
Larkin-Ruecker
Feeney Group
Gislason LLC
Lemke and Sons
Hackett Group
Moen Inc
Murphy-Gottlieb
Barrows and Sons
Dicki LLC
Pollich-Weimann
Stiedemann and Sons
Ledner-Stanton
Koepp-Carter
Rice Group
White and Sons
Jakubowski Inc
Morissette-Hickle
Kutch-Senger
Beier-Hand
Waters Inc
Lang-Sporer
Parisian Group
Kuhn-Christiansen
Krajcik Inc
Leuschke-Pacocha
Jacobson Inc
Shields Group
Hauck Group
Hilpert-Grimes
Pacocha-Harvey
Walsh-Krajcik
Quigley-Miller
Swaniawski LLC
Miller-Cole
Gleason Group
Dooley-Witting
Conroy LLC
Parker Group
Spinka Group
Kunde-Wunsch
Corkery-Farrell
Von-Metz
Ondricka LLC
Stamm-Renner
Lubowitz-Lehner
Kshlerin-Larson
Streich-Reichert
Hackett-Medhurst
Kozey-Stroman
McDermott-Kuhic
Willms-Farrell
Konopelski-Romaguera
Collier LLC
Carroll-Flatley
Gerhold Group
Stracke Group
Reynolds-Johns
Gottlieb-Haag
Cruickshank-Gusikowski
Baumbach and Sons
Dickinson-Ankunding
Schumm and Sons
Kulas-Simonis
Ziemann-Haag
Wunsch-Hilll
Klocko-Kassulke
Satterfield-DuBuque
Collier Inc
Herzog-Denesik
Gibson and Sons
Miller LLC
Hyatt LLC
Walter Group
DuBuque Inc
Reichert Group
Hoppe Group
Beier-Zieme
Hammes Group
Abshire-Bradtke
Hegmann and Sons
Schneider LLC
MacGyver LLC
Larkin LLC
Gislason-Cummings
Hickle-Simonis
Stokes-Bahringer
Greenholt Inc
Kozey Inc
Berge-Shields
Sauer-Hilpert
Rau Inc
Christiansen-Ortiz
Windler-Schneider
Waters Inc
Bayer LLC
Stokes Inc
Ward-Yost
Buckridge-Schowalter
Frami and Sons
Ruecker Group
Bosco-Walter
Hoeger-Reynolds
Reilly-Stiedemann
Krajcik LLC
Terry-Hermann
Kuhn-Baumbach
Lebsack LLC
Hagenes-Gottlieb
Kirlin Group
Klocko LLC
Harvey-Daugherty
Torp-Rowe
Franecki LLC
Padberg-Bechtelar
Kling Inc
Buckridge-Stamm
Kuphal and Sons
Stamm-Reichert
Windler Group
Turner LLC
Lehner and Sons
Nader-Sipes
Schuppe-Hettinger
Nicolas LLC
Metz and Sons
Trantow-Hahn
Predovic-Johnston
Farrell and Sons
Heaney Inc
Moen-Kassulke
Keebler Inc
Blanda-Herman
Hand LLC
White LLC
Wintheiser Group
Hahn-Treutel
Donnelly and Sons
Homenick-Torp
Beahan-Toy
Moore-McDermott
Stark Group
Muller Group
Prosacco-Bogisich
Connelly-Howell
Dietrich-Toy
Wolf and Sons
Conroy LLC
Toy Inc
Rippin Inc
Hickle Group
Anderson LLC
Ullrich Group
Kutch Group
Hudson Group
Sauer Group
Cruickshank-Harris
Schulist-Feest
Marquardt Group
Senger and Sons
Bogisich-Kessler
Jenkins-Zulauf
Gleichner-McCullough
Schamberger-Pfannerstill
Reichert-McClure
Kub-McCullough
Cummerata-Hoeger
Thiel Group
Little Inc
Ondricka-Jast
Dibbert LLC
Auer and Sons
Murray-Kutch
Dare-Streich
Schroeder Group
Gorczany Inc
Kuhic-Von
Wyman-Bins
Weber and Sons
VonRueden and Sons
Padberg-Gislason
Donnelly-Heaney
Hayes-Weissnat
Veum-Ankunding
Walsh Inc
Predovic-Reichert
Spencer Inc
Trantow-Murazik
Vandervort Inc
Brown LLC
Wiegand-Renner
Boehm-Durgan
Mayert Group
Cummerata and Sons
Nolan-Boyer
Pfannerstill Group
Rutherford Inc
Oberbrunner-Schumm
Oberbrunner LLC
Balistreri-Quitzon
Mante-Bednar
Friesen-Rempel
Schumm Inc
Pouros Inc
Zboncak-Purdy
Olson Inc
Emmerich and Sons
Schneider and Sons
Runte-Schoen
Streich-Douglas
Homenick-Simonis
Schiller and Sons
Spinka LLC
Senger Inc
Heller-Kling
Ebert-Haley
Weber and Sons
Block and Sons
Welch LLC
VonRueden-Sanford
Wyman and Sons
Hayes-Roob
Crist LLC
Kerluke and Sons
Jakubowski Group
Sawayn-Bergnaum
Stanton Inc
Lindgren-Rau
Morissette-Haley
Daniel and Sons
Zboncak-Emard
Predovic-Mann
Kling Inc
McClure LLC
Osinski-Bailey
Mueller Inc
McClure-Waters
Hahn-Schulist
Spencer and Sons
Williamson-Goodwin
Zemlak Inc
Watsica-Schamberger
Koelpin-Marquardt
Connelly and Sons
Bradtke Inc
Cronin Group
Donnelly Group
Schmitt Group
Hermann-King
Stamm-Littel
Shields Group
Rippin-Wiegand
Cremin Group
Balistreri-McCullough
Howe-Runolfsdottir
Zemlak Group
Hudson-Thiel
Klein-Larson
Harvey Inc
Auer Group
Keebler-Hyatt
Schmitt-Ratke
Price-Bins
Vandervort Group
Emard-Powlowski
Harvey Inc
Tillman Inc
Kris LLC
Fisher and Sons
Morissette LLC
Willms LLC
Strosin-Howe
Thompson Inc
Kihn Group
Donnelly and Sons
Labadie Group
Gerhold and Sons
Murray Inc
Kirlin-Lemke
Torphy-Lockman
Reinger Inc
Schuster-Jaskolski
Huels-Tromp
Wehner-Harber
Leuschke Inc
Volkman-Kertzmann
Gerlach-Toy
Casper-Ondricka
Wolf Inc
Wisozk Group
Wuckert Inc
Effertz Group
Schuppe and Sons
Rodriguez LLC
Goldner-Purdy
Welch Inc
Mann-Kling
Heidenreich and Sons
Williamson-Barton
McDermott-Dickinson
Torp-Vandervort
Wisozk Group
Reichert and Sons
Kirlin-Greenholt
Volkman Inc
Braun-Greenholt
Schmeler-Beatty
1 brand
2 Klein LLC
3 DuBuque and Sons
4 Wisozk-Heidenreich
5 Fadel-Torp
6 Predovic-Aufderhar
7 Simonis Inc
8 Gleason and Sons
9 Hilll-Douglas
10 Leannon Inc
11 Hane Inc
12 Bechtelar-Mosciski
13 Hane-Kirlin
14 Oberbrunner-Sauer
15 Lakin Inc
16 Daniel-Kris
17 Price-Gerhold
18 Schultz Inc
19 Erdman and Sons
20 Blick-Howell
21 Leannon Group
22 Prosacco LLC
23 Corwin-Schimmel
24 Morar-Harber
25 Kemmer and Sons
26 Boehm-Balistreri
27 Schumm LLC
28 Olson-Schmitt
29 McCullough-Stoltenberg
30 Ferry LLC
31 Cruickshank and Sons
32 Goodwin-Mayert
33 Feest Inc
34 Koss-Flatley
35 Stark Inc
36 Ratke-Bode
37 Walker-Pacocha
38 Schumm-Jacobs
39 Botsford Inc
40 Baumbach LLC
41 Turcotte Group
42 Boyle-Brown
43 Kuvalis and Sons
44 Cartwright Inc
45 Russel-Heller
46 Gleichner-Barton
47 Kreiger-Walsh
48 Murphy-Von
49 Morissette-Zulauf
50 Jacobs-Schaefer
51 Fay and Sons
52 Reichel LLC
53 Gutkowski LLC
54 Littel Inc
55 Towne-Harvey
56 Lang-Kirlin
57 VonRueden and Sons
58 Bogan-Tremblay
59 Bradtke-Monahan
60 Stiedemann-Kling
61 Champlin-Jacobs
62 Walsh-Blick
63 Hagenes-Paucek
64 Volkman and Sons
65 Abshire Inc
66 Senger-Johnston
67 Hand Group
68 Rolfson-Mayert
69 Volkman-Ondricka
70 Runolfsdottir-Walter
71 Schulist-Wolf
72 Reichel-Franecki
73 Effertz and Sons
74 Howe LLC
75 Rohan-Bartoletti
76 Pacocha-Emmerich
77 Nolan-Quitzon
78 Stiedemann Inc
79 Connelly-Leuschke
80 Cummings-Gibson
81 Weimann-Kub
82 Nitzsche-McDermott
83 Von Group
84 Dietrich LLC
85 Schamberger and Sons
86 Jones-Bogisich
87 Corwin Inc
88 Ziemann-Kohler
89 Ratke-Langosh
90 Price-Bosco
91 Schmeler-Dibbert
92 Monahan Inc
93 Kuvalis LLC
94 Schamberger-Kautzer
95 Dickinson-Grady
96 Parisian-Runte
97 Hirthe Inc
98 Tromp-Renner
99 Pfeffer LLC
100 Jaskolski and Sons
101 Koepp and Sons
102 Maggio-Hickle
103 Casper-Carter
104 Herzog-Jaskolski
105 Lakin-Borer
106 Sanford-Maggio
107 Shields-Kihn
108 Wilderman-Wisozk
109 Nienow-Sanford
110 Stiedemann LLC
111 Fay-Weber
112 Cartwright-Wiegand
113 Veum Inc
114 Greenholt Group
115 Bergnaum and Sons
116 Steuber-Breitenberg
117 Rempel-Lynch
118 Baumbach Inc
119 Jast-Schiller
120 Streich LLC
121 Marquardt-Parisian
122 Labadie and Sons
123 Gulgowski LLC
124 Balistreri Group
125 Kiehn-Hirthe
126 Effertz-Gorczany
127 Goldner-Breitenberg
128 Upton-Beier
129 White LLC
130 Rowe Group
131 Wolf-Roberts
132 Hudson-Pacocha
133 Mohr-Pacocha
134 Doyle LLC
135 Kihn-Kirlin
136 Dooley LLC
137 Vandervort-Feest
138 Thiel-Gorczany
139 Reichel-Mertz
140 Medhurst Group
141 Feil and Sons
142 Runolfsdottir Group
143 Fritsch-Gerhold
144 Lang Group
145 Ullrich LLC
146 Oberbrunner-Hirthe
147 Bosco-Lehner
148 Orn Group
149 Blick-Bruen
150 Green and Sons
151 Sporer Group
152 Prohaska-Hauck
153 Reynolds Group
154 Block-Parisian
155 Schumm-Ortiz
156 Leffler-Murazik
157 Crist LLC
158 Marquardt Group
159 Gislason Inc
160 Ondricka-Hintz
161 Walsh LLC
162 Koepp-Schamberger
163 Rath-Runolfsdottir
164 Bayer-Green
165 Reichert Group
166 Haag LLC
167 Haley-Donnelly
168 Russel Inc
169 Zulauf Inc
170 Hermiston and Sons
171 Runolfsdottir Inc
172 Smitham-Ryan
173 Goyette LLC
174 Cummerata Inc
175 Marks-Nikolaus
176 Turcotte Group
177 Walsh Group
178 Erdman LLC
179 Willms-Ortiz
180 Miller and Sons
181 Moore and Sons
182 Leffler-Dicki
183 Kautzer-Funk
184 Murazik-Sipes
185 Pollich Group
186 Volkman-Koepp
187 Prosacco LLC
188 Trantow LLC
189 McClure-Stanton
190 Corwin-Prohaska
191 Carroll and Sons
192 West-Hane
193 Ernser and Sons
194 Jacobson-Kohler
195 Orn-Lemke
196 Moen-Lemke
197 Hackett-Mosciski
198 Hane LLC
199 Wisoky-Jenkins
200 Grady Inc
201 Hagenes Group
202 Donnelly-Waelchi
203 Hermann LLC
204 Weber and Sons
205 Stamm LLC
206 Fay-Satterfield
207 Ondricka-Waelchi
208 Jacobson and Sons
209 Smitham LLC
210 Heidenreich-Robel
211 Langworth-Beier
212 Spinka-Emard
213 Funk LLC
214 Mayer and Sons
215 McGlynn-Beer
216 Rippin-Steuber
217 Moen-Yundt
218 Vandervort-Breitenberg
219 Tromp and Sons
220 Pagac-Gislason
221 Kulas-Stehr
222 Ryan LLC
223 Bogisich-Baumbach
224 Steuber Inc
225 Boyle-Ondricka
226 Thompson LLC
227 Wilkinson-Flatley
228 Powlowski-Hane
229 Schumm and Sons
230 Thiel and Sons
231 Nolan-Witting
232 Zboncak-Pagac
233 Harris-Thompson
234 Hickle-Schaefer
235 Miller LLC
236 Lindgren Group
237 Reilly-Kautzer
238 Barton and Sons
239 Sawayn Inc
240 Schmitt-Runolfsson
241 Gibson-Donnelly
242 Marks LLC
243 Yost LLC
244 Paucek and Sons
245 Rice-Krajcik
246 Pfannerstill LLC
247 Willms-Runolfsdottir
248 Grady Inc
249 Reichert-Schroeder
250 Kilback-Johnston
251 Bauch-Brown
252 Aufderhar LLC
253 Emmerich-Schumm
254 Bednar-Luettgen
255 Conroy-Wilkinson
256 Langosh-Howe
257 Breitenberg-Gerhold
258 Considine-Miller
259 Langworth and Sons
260 Balistreri LLC
261 Parisian-Pollich
262 Jacobson Inc
263 Ferry-Torphy
264 Effertz LLC
265 Trantow-Marvin
266 Borer and Sons
267 Pfeffer-Klein
268 Leannon-Grady
269 Smitham-Mohr
270 Mante-Padberg
271 Hills Inc
272 Zemlak Group
273 Kessler-Green
274 Terry-Reichert
275 Macejkovic and Sons
276 Rice-Bayer
277 Romaguera-Wuckert
278 Dickinson-Greenfelder
279 VonRueden Group
280 Krajcik and Sons
281 Romaguera-Pfannerstill
282 Heller-Hammes
283 Wisozk LLC
284 Auer-Beatty
285 Heller-Marks
286 Kertzmann and Sons
287 Schuppe LLC
288 Hammes-Schimmel
289 Raynor Inc
290 Balistreri Group
291 McKenzie and Sons
292 Ebert Group
293 Stanton and Sons
294 Kiehn-Rohan
295 Collier and Sons
296 Johns-Howe
297 Hilll-Emard
298 Douglas-Dietrich
299 Quitzon Inc
300 Olson-Schumm
301 Larkin-Ruecker
302 Feeney Group
303 Gislason LLC
304 Lemke and Sons
305 Hackett Group
306 Moen Inc
307 Murphy-Gottlieb
308 Barrows and Sons
309 Dicki LLC
310 Pollich-Weimann
311 Stiedemann and Sons
312 Ledner-Stanton
313 Koepp-Carter
314 Rice Group
315 White and Sons
316 Jakubowski Inc
317 Morissette-Hickle
318 Kutch-Senger
319 Beier-Hand
320 Waters Inc
321 Lang-Sporer
322 Parisian Group
323 Kuhn-Christiansen
324 Krajcik Inc
325 Leuschke-Pacocha
326 Jacobson Inc
327 Shields Group
328 Hauck Group
329 Hilpert-Grimes
330 Pacocha-Harvey
331 Walsh-Krajcik
332 Quigley-Miller
333 Swaniawski LLC
334 Miller-Cole
335 Gleason Group
336 Dooley-Witting
337 Conroy LLC
338 Parker Group
339 Spinka Group
340 Kunde-Wunsch
341 Corkery-Farrell
342 Von-Metz
343 Ondricka LLC
344 Stamm-Renner
345 Lubowitz-Lehner
346 Kshlerin-Larson
347 Streich-Reichert
348 Hackett-Medhurst
349 Kozey-Stroman
350 McDermott-Kuhic
351 Willms-Farrell
352 Konopelski-Romaguera
353 Collier LLC
354 Carroll-Flatley
355 Gerhold Group
356 Stracke Group
357 Reynolds-Johns
358 Gottlieb-Haag
359 Cruickshank-Gusikowski
360 Baumbach and Sons
361 Dickinson-Ankunding
362 Schumm and Sons
363 Kulas-Simonis
364 Ziemann-Haag
365 Wunsch-Hilll
366 Klocko-Kassulke
367 Satterfield-DuBuque
368 Collier Inc
369 Herzog-Denesik
370 Gibson and Sons
371 Miller LLC
372 Hyatt LLC
373 Walter Group
374 DuBuque Inc
375 Reichert Group
376 Hoppe Group
377 Beier-Zieme
378 Hammes Group
379 Abshire-Bradtke
380 Hegmann and Sons
381 Schneider LLC
382 MacGyver LLC
383 Larkin LLC
384 Gislason-Cummings
385 Hickle-Simonis
386 Stokes-Bahringer
387 Greenholt Inc
388 Kozey Inc
389 Berge-Shields
390 Sauer-Hilpert
391 Rau Inc
392 Christiansen-Ortiz
393 Windler-Schneider
394 Waters Inc
395 Bayer LLC
396 Stokes Inc
397 Ward-Yost
398 Buckridge-Schowalter
399 Frami and Sons
400 Ruecker Group
401 Bosco-Walter
402 Hoeger-Reynolds
403 Reilly-Stiedemann
404 Krajcik LLC
405 Terry-Hermann
406 Kuhn-Baumbach
407 Lebsack LLC
408 Hagenes-Gottlieb
409 Kirlin Group
410 Klocko LLC
411 Harvey-Daugherty
412 Torp-Rowe
413 Franecki LLC
414 Padberg-Bechtelar
415 Kling Inc
416 Buckridge-Stamm
417 Kuphal and Sons
418 Stamm-Reichert
419 Windler Group
420 Turner LLC
421 Lehner and Sons
422 Nader-Sipes
423 Schuppe-Hettinger
424 Nicolas LLC
425 Metz and Sons
426 Trantow-Hahn
427 Predovic-Johnston
428 Farrell and Sons
429 Heaney Inc
430 Moen-Kassulke
431 Keebler Inc
432 Blanda-Herman
433 Hand LLC
434 White LLC
435 Wintheiser Group
436 Hahn-Treutel
437 Donnelly and Sons
438 Homenick-Torp
439 Beahan-Toy
440 Moore-McDermott
441 Stark Group
442 Muller Group
443 Prosacco-Bogisich
444 Connelly-Howell
445 Dietrich-Toy
446 Wolf and Sons
447 Conroy LLC
448 Toy Inc
449 Rippin Inc
450 Hickle Group
451 Anderson LLC
452 Ullrich Group
453 Kutch Group
454 Hudson Group
455 Sauer Group
456 Cruickshank-Harris
457 Schulist-Feest
458 Marquardt Group
459 Senger and Sons
460 Bogisich-Kessler
461 Jenkins-Zulauf
462 Gleichner-McCullough
463 Schamberger-Pfannerstill
464 Reichert-McClure
465 Kub-McCullough
466 Cummerata-Hoeger
467 Thiel Group
468 Little Inc
469 Ondricka-Jast
470 Dibbert LLC
471 Auer and Sons
472 Murray-Kutch
473 Dare-Streich
474 Schroeder Group
475 Gorczany Inc
476 Kuhic-Von
477 Wyman-Bins
478 Weber and Sons
479 VonRueden and Sons
480 Padberg-Gislason
481 Donnelly-Heaney
482 Hayes-Weissnat
483 Veum-Ankunding
484 Walsh Inc
485 Predovic-Reichert
486 Spencer Inc
487 Trantow-Murazik
488 Vandervort Inc
489 Brown LLC
490 Wiegand-Renner
491 Boehm-Durgan
492 Mayert Group
493 Cummerata and Sons
494 Nolan-Boyer
495 Pfannerstill Group
496 Rutherford Inc
497 Oberbrunner-Schumm
498 Oberbrunner LLC
499 Balistreri-Quitzon
500 Mante-Bednar
501 Friesen-Rempel
502 Schumm Inc
503 Pouros Inc
504 Zboncak-Purdy
505 Olson Inc
506 Emmerich and Sons
507 Schneider and Sons
508 Runte-Schoen
509 Streich-Douglas
510 Homenick-Simonis
511 Schiller and Sons
512 Spinka LLC
513 Senger Inc
514 Heller-Kling
515 Ebert-Haley
516 Weber and Sons
517 Block and Sons
518 Welch LLC
519 VonRueden-Sanford
520 Wyman and Sons
521 Hayes-Roob
522 Crist LLC
523 Kerluke and Sons
524 Jakubowski Group
525 Sawayn-Bergnaum
526 Stanton Inc
527 Lindgren-Rau
528 Morissette-Haley
529 Daniel and Sons
530 Zboncak-Emard
531 Predovic-Mann
532 Kling Inc
533 McClure LLC
534 Osinski-Bailey
535 Mueller Inc
536 McClure-Waters
537 Hahn-Schulist
538 Spencer and Sons
539 Williamson-Goodwin
540 Zemlak Inc
541 Watsica-Schamberger
542 Koelpin-Marquardt
543 Connelly and Sons
544 Bradtke Inc
545 Cronin Group
546 Donnelly Group
547 Schmitt Group
548 Hermann-King
549 Stamm-Littel
550 Shields Group
551 Rippin-Wiegand
552 Cremin Group
553 Balistreri-McCullough
554 Howe-Runolfsdottir
555 Zemlak Group
556 Hudson-Thiel
557 Klein-Larson
558 Harvey Inc
559 Auer Group
560 Keebler-Hyatt
561 Schmitt-Ratke
562 Price-Bins
563 Vandervort Group
564 Emard-Powlowski
565 Harvey Inc
566 Tillman Inc
567 Kris LLC
568 Fisher and Sons
569 Morissette LLC
570 Willms LLC
571 Strosin-Howe
572 Thompson Inc
573 Kihn Group
574 Donnelly and Sons
575 Labadie Group
576 Gerhold and Sons
577 Murray Inc
578 Kirlin-Lemke
579 Torphy-Lockman
580 Reinger Inc
581 Schuster-Jaskolski
582 Huels-Tromp
583 Wehner-Harber
584 Leuschke Inc
585 Volkman-Kertzmann
586 Gerlach-Toy
587 Casper-Ondricka
588 Wolf Inc
589 Wisozk Group
590 Wuckert Inc
591 Effertz Group
592 Schuppe and Sons
593 Rodriguez LLC
594 Goldner-Purdy
595 Welch Inc
596 Mann-Kling
597 Heidenreich and Sons
598 Williamson-Barton
599 McDermott-Dickinson
600 Torp-Vandervort
601 Wisozk Group
602 Reichert and Sons
603 Kirlin-Greenholt
604 Volkman Inc
605 Braun-Greenholt
606 Schmeler-Beatty

View File

@ -0,0 +1,20 @@
Aquamarine
Blue
Crimson
Fuscia
Goldenrod
Green
Indigo
Khaki
Maroon
Mauv
Orange
Pink
Puce
Purple
Red
Teal
Turquoise
Violet
Yellow
1 Aquamarine
2 Blue
3 Crimson
4 Fuscia
5 Goldenrod
6 Green
7 Indigo
8 Khaki
9 Maroon
10 Mauv
11 Orange
12 Pink
13 Puce
14 Purple
15 Red
16 Teal
17 Turquoise
18 Violet
19 Yellow

944
PostgreSQL/.csv/dates.csv Normal file
View File

@ -0,0 +1,944 @@
date
01-15-2011
01-02-1973
06-02-2004
08-01-2022
01-11-2008
01-10-1983
09-06-2016
09-01-2012
01-15-1970
09-14-1979
12-15-1991
05-20-1971
08-10-1986
12-07-2007
05-09-2020
05-12-2012
10-03-2000
04-14-1986
09-04-1997
10-17-1985
07-31-1971
09-09-1976
06-17-1971
06-01-1976
08-31-2018
12-26-1972
08-14-1983
04-11-1970
07-12-2016
06-02-2023
03-27-2020
05-16-1997
11-18-1976
03-03-1976
03-03-1975
12-20-1996
03-05-1980
11-14-2018
12-03-2006
05-08-2018
12-15-2009
06-21-1975
03-15-1996
08-22-2023
12-29-1997
11-18-1975
06-01-2012
05-09-2020
06-21-1987
08-18-1985
06-11-2014
05-29-1991
03-17-2002
11-10-2021
04-21-1976
06-28-1975
06-11-1984
03-22-2016
04-30-2016
05-06-2001
10-08-1970
06-21-1970
09-12-1999
06-24-2011
04-07-1974
08-22-1982
04-17-1975
10-16-2010
02-11-1988
05-12-2006
09-11-2006
04-01-1983
03-19-2018
06-13-1986
10-25-2020
12-17-2012
06-10-2004
04-18-2018
01-29-2006
07-10-1980
02-27-1985
08-06-1992
12-12-1993
06-06-1977
06-07-1979
08-29-2018
01-15-2021
06-07-2008
03-12-2013
04-22-1992
08-13-2009
11-11-1969
03-04-1978
03-06-2023
06-01-2014
03-02-1998
11-26-1975
05-14-1972
02-29-1996
04-06-2006
09-27-1979
09-22-2022
06-15-1985
09-14-1987
01-19-2024
08-12-1986
06-01-1983
03-06-2018
06-09-2015
02-14-2007
04-30-2024
03-03-1987
12-02-1976
02-28-1990
10-16-1983
10-17-1988
07-29-2019
10-21-1990
06-29-1999
12-11-1995
07-31-2015
10-18-2023
01-21-1974
09-04-1973
12-27-2017
09-21-1985
07-16-1990
03-09-1971
02-19-1978
11-19-1974
09-27-1976
12-13-1996
06-16-1998
12-24-1993
04-02-1984
01-25-1970
06-07-2013
07-05-2015
04-02-2014
09-20-1999
12-23-1972
04-11-1982
06-29-1979
04-03-1976
10-18-1988
01-31-2021
04-04-1997
01-15-2001
02-25-1987
06-05-2005
06-17-1983
01-31-1987
08-03-1981
12-08-2013
11-23-2002
03-23-1999
02-08-1971
12-29-1998
10-15-1983
04-06-2006
02-28-1984
06-06-2000
05-18-2007
09-05-2023
03-18-2016
03-02-1999
04-26-1984
10-09-1995
08-16-2004
08-08-2020
10-19-2001
04-13-1987
01-19-2012
09-29-2019
08-10-2000
04-06-2011
05-22-2010
11-04-1988
04-02-2015
04-05-2010
10-05-1982
12-30-1976
05-27-1980
08-15-1976
01-05-1975
01-02-1994
09-23-2024
11-12-2020
11-22-2020
08-27-1979
12-29-1991
08-20-2004
03-04-1988
02-25-2023
10-31-1984
05-05-2017
12-22-2022
07-31-1983
11-30-1991
04-08-1979
02-14-2008
07-27-2018
07-22-1989
06-17-1998
09-28-1983
02-01-2023
06-11-1972
02-28-1977
05-07-2013
06-25-1990
11-13-1994
12-28-1978
11-13-1992
03-23-2006
10-12-1984
09-09-1986
12-14-2009
11-09-2024
04-30-1973
06-14-1997
03-14-2011
09-13-2016
10-27-1999
10-20-1991
10-09-1978
07-30-1992
08-28-1992
03-07-2017
05-14-2008
02-21-1974
03-15-2007
12-13-2019
11-09-1997
12-11-1992
08-16-1993
11-20-1982
01-20-2016
04-29-2003
07-14-1974
04-01-1986
03-12-1992
06-14-2017
04-22-2007
01-28-2011
08-19-1977
04-23-2020
05-31-1973
08-17-1978
04-26-1972
12-02-2000
11-29-1974
01-30-1972
02-11-2006
11-05-2006
10-02-2016
05-04-1998
12-20-2023
05-09-2024
06-12-1986
03-17-1988
02-02-2021
01-25-1977
09-11-1970
09-25-1998
09-19-1986
11-01-1980
03-25-1988
08-01-1974
10-10-1991
07-09-1978
04-01-1970
07-07-1987
03-23-1983
07-04-2001
09-08-1985
02-22-1994
01-25-2016
01-09-2005
09-13-2015
01-30-2009
08-17-1995
02-14-1987
04-19-2010
09-11-1972
12-13-1986
02-28-2001
01-02-2001
06-25-1976
03-09-1998
10-08-2008
03-28-1981
07-21-1991
02-03-2022
01-25-1995
11-02-2007
02-20-1987
08-05-1992
10-22-2014
02-23-1996
11-07-2020
12-28-1976
04-11-2003
12-07-1984
01-11-1976
04-23-1991
04-19-1989
09-16-1998
09-11-1998
06-04-1982
09-09-1989
01-09-1983
03-25-1981
11-03-2005
02-06-1970
10-13-2011
11-04-1975
03-12-2004
03-09-1996
05-10-1998
08-16-1991
07-27-1991
05-09-1984
11-20-1989
12-23-1981
07-20-1984
11-24-1976
08-18-2010
02-03-1991
06-13-1991
11-27-1978
10-23-2023
06-06-1991
11-25-2012
02-28-1992
02-02-1979
07-27-1974
05-10-1990
05-14-2000
07-15-1988
12-25-1982
06-28-2000
09-11-1983
07-28-1978
04-23-2016
11-27-2018
06-22-2002
08-27-2004
02-06-1985
07-23-2012
10-25-1970
10-16-2016
06-15-1992
04-27-2024
11-28-1972
08-27-1970
03-19-2013
08-31-1988
08-07-1997
03-24-1984
11-10-1969
03-04-1989
04-23-2009
02-16-2020
12-18-1984
08-25-1988
02-08-1993
08-19-1989
09-02-1996
01-21-2020
01-27-1975
12-08-1973
02-22-1977
04-28-2006
11-24-2008
03-23-1971
09-26-2014
07-17-2019
05-09-2000
07-10-2008
08-27-1983
09-20-1972
12-09-1993
03-26-2004
06-13-1979
06-02-1977
03-20-2024
06-29-2000
09-19-1995
10-06-2020
04-18-1997
11-16-1997
10-28-1999
07-20-2006
01-20-2017
12-27-2016
07-05-2004
05-19-2013
12-03-1976
06-21-2012
06-23-2019
01-14-2019
09-21-2002
03-13-2004
07-28-1970
06-24-1989
11-21-2018
11-06-2023
04-21-1994
10-12-2001
07-24-2005
10-01-1984
10-17-1969
04-02-1994
10-19-2013
02-12-2003
01-16-2015
10-03-2000
06-15-1990
02-01-2013
09-15-1974
02-27-2015
08-11-2021
01-17-1987
09-02-2004
02-15-1988
01-24-1991
10-17-2022
12-19-2012
09-01-2006
06-04-1979
01-21-1989
11-14-1991
09-03-2008
07-13-2020
07-22-2018
05-06-1970
03-21-1976
04-25-1992
06-15-2003
08-31-2015
07-19-1977
10-30-2003
06-10-2013
10-05-2015
09-23-2000
12-27-1992
11-18-1981
07-10-1989
09-19-2015
12-31-1978
07-20-2001
10-16-1992
02-23-1988
03-10-2016
11-15-1969
07-16-2013
09-12-1989
09-06-1983
05-13-1979
11-14-1993
04-15-1991
02-22-1992
09-19-2013
09-15-1994
08-18-1993
09-11-1998
03-02-2016
07-18-2012
01-25-2005
06-14-1983
11-03-1992
11-27-1978
08-13-1999
03-21-1987
06-12-2014
07-19-1987
03-15-2021
10-27-1992
12-11-1990
12-04-2017
07-29-1979
10-24-1979
09-05-1984
03-08-2000
11-01-1993
05-22-2002
11-19-1985
01-29-2004
05-02-2008
03-20-1980
05-10-1990
10-26-1995
01-21-2011
03-07-1975
07-13-2000
12-05-1986
06-12-1982
09-21-1980
08-06-2010
07-30-1974
12-14-1980
03-22-1995
04-15-1972
05-09-1988
08-25-2007
01-18-1990
11-14-1999
01-17-1980
07-24-1976
07-08-1982
05-14-1985
10-10-2018
03-03-1984
12-08-1989
09-19-2020
07-06-1982
06-25-2015
01-25-2001
03-07-1988
11-17-1987
10-29-1991
03-31-2020
11-08-2001
04-25-2002
12-26-1992
01-28-2019
07-03-1972
01-04-2024
02-07-2009
09-28-2010
08-04-2015
06-18-2016
11-23-2018
05-26-2004
10-14-2001
08-10-1997
01-16-1970
10-19-2007
10-14-2005
05-14-2009
09-22-2010
05-11-1985
11-21-1995
09-21-2020
07-03-1991
01-11-1985
02-06-1993
09-03-2007
05-19-1973
04-02-1973
07-18-2021
05-06-1970
06-30-1980
12-26-1991
05-20-1995
05-12-1998
03-02-1970
09-03-2002
08-19-1987
01-03-2004
09-30-2005
12-30-1985
12-20-1992
04-04-2008
01-08-1986
01-28-2011
10-10-2010
12-21-2003
04-02-2004
07-07-1994
07-05-1984
10-08-1995
11-27-1979
10-31-2020
03-01-2004
06-27-1972
08-15-1975
01-10-1996
12-08-2012
01-14-2018
10-09-1982
03-19-1996
01-20-1994
09-17-1990
12-16-1971
08-25-1984
08-18-2020
02-04-1987
05-11-1975
05-14-1970
12-02-1994
10-11-1999
04-29-2013
08-09-2006
12-06-2023
07-20-2007
06-21-1987
10-22-1985
05-27-1980
01-15-2000
08-04-2010
03-08-2008
11-14-1974
04-06-1995
09-30-2006
12-10-1974
10-21-2008
01-24-1981
09-17-1975
10-15-2009
07-01-2019
01-11-1990
11-03-2005
06-27-2000
01-14-2015
09-11-2024
04-30-1997
10-07-2015
04-01-1976
12-08-1990
01-14-2019
12-27-1997
07-12-1981
05-25-2005
04-03-1985
09-30-1992
04-17-1983
01-17-2003
09-29-2017
06-02-1975
01-19-2006
07-07-1990
01-30-1972
11-07-1995
02-07-1994
09-28-2023
01-24-1980
03-19-1987
09-08-2013
11-05-2013
05-20-2014
01-16-2018
03-25-2012
08-27-1972
05-17-1976
05-20-2009
04-30-2014
08-25-2014
02-17-2024
07-30-1977
09-18-2022
07-24-1979
10-06-2020
11-15-1974
01-25-2019
05-19-1988
11-14-1978
04-06-2012
11-18-1981
01-06-1982
05-08-1995
07-12-2006
03-01-1970
12-05-1987
01-14-2005
09-25-1978
05-09-1997
09-11-1998
02-03-1990
05-28-1990
03-26-1999
02-17-2000
07-19-2007
02-29-1992
11-07-2004
04-24-2017
03-15-2010
11-21-2020
10-22-2003
02-03-1983
02-26-1971
09-19-1996
08-10-1974
10-25-2003
12-04-2019
07-12-2004
05-29-1997
12-18-1980
06-25-1999
10-13-1993
06-01-1977
09-14-1983
01-14-1979
07-20-2017
01-14-1993
09-29-2017
01-25-1980
09-01-1997
09-30-1989
01-20-1993
12-16-1997
11-14-1977
08-21-2005
11-18-2000
12-21-1987
04-23-1999
12-10-1986
08-01-1995
03-19-1988
08-25-1984
09-10-2008
09-15-1990
08-05-2002
02-17-2024
02-17-1972
01-09-1997
09-14-2004
10-13-2000
08-25-2019
06-13-1993
09-29-1987
06-07-2003
02-14-1986
10-01-1971
08-01-1975
03-17-2024
03-16-2009
07-28-1998
02-01-1995
02-25-2001
05-30-1998
11-10-1998
02-11-1983
04-08-1976
03-08-1970
02-10-2003
11-27-2020
03-25-2020
07-17-2015
05-31-1992
11-21-1969
05-31-2022
06-09-1984
06-15-2014
07-23-1994
01-29-1985
10-26-2015
04-21-2012
07-07-1972
02-12-2007
10-23-1996
05-20-1991
07-06-2003
12-06-1975
06-13-2009
09-17-2010
11-02-2022
03-07-1996
11-03-1995
02-15-1993
08-23-1995
11-14-1982
02-13-1973
12-29-1979
03-29-2005
09-30-1970
02-27-1982
09-14-2017
05-22-2020
09-09-1986
08-31-2008
04-07-1996
05-09-1971
01-07-1986
08-01-1979
01-04-2021
02-25-1975
01-27-1981
04-13-2015
12-10-1981
11-30-1989
10-13-2006
06-27-1990
06-01-1996
09-18-1991
07-16-2019
03-31-2013
04-02-1970
02-09-1998
07-26-1986
04-07-1976
08-13-1989
12-30-2015
04-04-2003
08-26-1991
03-06-1992
01-27-1987
02-04-1986
01-20-1999
04-13-1980
08-26-1992
06-05-2011
07-12-1990
03-29-1971
09-11-2016
05-16-1992
09-17-2022
09-05-2018
12-06-1986
11-10-1969
06-09-2018
12-04-1999
01-15-1997
03-17-2021
01-04-1990
12-04-1987
08-06-2019
03-17-2014
11-16-1980
01-26-2021
08-14-2000
05-13-1975
10-05-2011
11-17-2020
10-01-1971
10-05-1987
11-06-1973
04-23-1995
12-16-1996
12-20-1985
08-15-1980
07-21-1995
05-06-1998
06-25-1996
08-01-1988
10-22-1999
12-31-2023
03-06-1975
10-19-2000
11-07-1989
07-17-1980
02-25-2018
05-02-1993
03-12-2007
12-27-1972
06-29-2008
04-04-2016
06-18-2020
10-21-1975
11-05-2009
01-04-2010
12-19-1976
05-03-1992
08-11-1977
01-28-1984
06-01-2004
04-07-1990
04-23-1995
07-20-2011
01-26-2004
10-20-1997
04-04-1989
02-27-2015
02-26-2021
11-30-2000
06-23-2018
10-05-2007
10-19-1975
07-08-2013
09-30-2011
08-27-1991
03-04-1999
03-17-2001
09-18-1997
12-13-2014
04-15-2024
11-26-2009
10-22-2000
01-24-2014
10-30-1993
09-22-2016
11-06-1969
07-28-1995
12-26-1995
10-23-2005
02-20-1988
09-12-1983
08-01-2023
02-20-1988
09-19-2022
04-01-1998
04-10-1988
10-30-1989
12-06-1990
09-28-2022
06-28-1980
03-20-1987
05-21-1971
12-18-1986
06-15-1990
07-08-1972
12-26-1989
03-08-1978
06-29-1980
02-27-2011
08-15-2017
08-22-2007
08-19-1992
10-05-2016
09-18-2004
11-15-1971
02-13-2000
01-31-1989
03-22-1974
06-26-2021
07-19-1999
02-11-2003
08-12-2021
08-08-2011
12-15-2023
05-18-2014
10-28-2018
11-14-1996
12-03-2019
09-11-2001
08-28-2010
06-16-2014
01-13-2004
04-07-1981
02-14-2016
01-03-2022
06-06-2013
02-09-2023
04-11-1986
03-21-1979
12-25-1990
02-17-2020
09-18-2002
09-23-2010
11-21-1996
01-31-1980
01-27-2000
01-27-1988
1 date
2 01-15-2011
3 01-02-1973
4 06-02-2004
5 08-01-2022
6 01-11-2008
7 01-10-1983
8 09-06-2016
9 09-01-2012
10 01-15-1970
11 09-14-1979
12 12-15-1991
13 05-20-1971
14 08-10-1986
15 12-07-2007
16 05-09-2020
17 05-12-2012
18 10-03-2000
19 04-14-1986
20 09-04-1997
21 10-17-1985
22 07-31-1971
23 09-09-1976
24 06-17-1971
25 06-01-1976
26 08-31-2018
27 12-26-1972
28 08-14-1983
29 04-11-1970
30 07-12-2016
31 06-02-2023
32 03-27-2020
33 05-16-1997
34 11-18-1976
35 03-03-1976
36 03-03-1975
37 12-20-1996
38 03-05-1980
39 11-14-2018
40 12-03-2006
41 05-08-2018
42 12-15-2009
43 06-21-1975
44 03-15-1996
45 08-22-2023
46 12-29-1997
47 11-18-1975
48 06-01-2012
49 05-09-2020
50 06-21-1987
51 08-18-1985
52 06-11-2014
53 05-29-1991
54 03-17-2002
55 11-10-2021
56 04-21-1976
57 06-28-1975
58 06-11-1984
59 03-22-2016
60 04-30-2016
61 05-06-2001
62 10-08-1970
63 06-21-1970
64 09-12-1999
65 06-24-2011
66 04-07-1974
67 08-22-1982
68 04-17-1975
69 10-16-2010
70 02-11-1988
71 05-12-2006
72 09-11-2006
73 04-01-1983
74 03-19-2018
75 06-13-1986
76 10-25-2020
77 12-17-2012
78 06-10-2004
79 04-18-2018
80 01-29-2006
81 07-10-1980
82 02-27-1985
83 08-06-1992
84 12-12-1993
85 06-06-1977
86 06-07-1979
87 08-29-2018
88 01-15-2021
89 06-07-2008
90 03-12-2013
91 04-22-1992
92 08-13-2009
93 11-11-1969
94 03-04-1978
95 03-06-2023
96 06-01-2014
97 03-02-1998
98 11-26-1975
99 05-14-1972
100 02-29-1996
101 04-06-2006
102 09-27-1979
103 09-22-2022
104 06-15-1985
105 09-14-1987
106 01-19-2024
107 08-12-1986
108 06-01-1983
109 03-06-2018
110 06-09-2015
111 02-14-2007
112 04-30-2024
113 03-03-1987
114 12-02-1976
115 02-28-1990
116 10-16-1983
117 10-17-1988
118 07-29-2019
119 10-21-1990
120 06-29-1999
121 12-11-1995
122 07-31-2015
123 10-18-2023
124 01-21-1974
125 09-04-1973
126 12-27-2017
127 09-21-1985
128 07-16-1990
129 03-09-1971
130 02-19-1978
131 11-19-1974
132 09-27-1976
133 12-13-1996
134 06-16-1998
135 12-24-1993
136 04-02-1984
137 01-25-1970
138 06-07-2013
139 07-05-2015
140 04-02-2014
141 09-20-1999
142 12-23-1972
143 04-11-1982
144 06-29-1979
145 04-03-1976
146 10-18-1988
147 01-31-2021
148 04-04-1997
149 01-15-2001
150 02-25-1987
151 06-05-2005
152 06-17-1983
153 01-31-1987
154 08-03-1981
155 12-08-2013
156 11-23-2002
157 03-23-1999
158 02-08-1971
159 12-29-1998
160 10-15-1983
161 04-06-2006
162 02-28-1984
163 06-06-2000
164 05-18-2007
165 09-05-2023
166 03-18-2016
167 03-02-1999
168 04-26-1984
169 10-09-1995
170 08-16-2004
171 08-08-2020
172 10-19-2001
173 04-13-1987
174 01-19-2012
175 09-29-2019
176 08-10-2000
177 04-06-2011
178 05-22-2010
179 11-04-1988
180 04-02-2015
181 04-05-2010
182 10-05-1982
183 12-30-1976
184 05-27-1980
185 08-15-1976
186 01-05-1975
187 01-02-1994
188 09-23-2024
189 11-12-2020
190 11-22-2020
191 08-27-1979
192 12-29-1991
193 08-20-2004
194 03-04-1988
195 02-25-2023
196 10-31-1984
197 05-05-2017
198 12-22-2022
199 07-31-1983
200 11-30-1991
201 04-08-1979
202 02-14-2008
203 07-27-2018
204 07-22-1989
205 06-17-1998
206 09-28-1983
207 02-01-2023
208 06-11-1972
209 02-28-1977
210 05-07-2013
211 06-25-1990
212 11-13-1994
213 12-28-1978
214 11-13-1992
215 03-23-2006
216 10-12-1984
217 09-09-1986
218 12-14-2009
219 11-09-2024
220 04-30-1973
221 06-14-1997
222 03-14-2011
223 09-13-2016
224 10-27-1999
225 10-20-1991
226 10-09-1978
227 07-30-1992
228 08-28-1992
229 03-07-2017
230 05-14-2008
231 02-21-1974
232 03-15-2007
233 12-13-2019
234 11-09-1997
235 12-11-1992
236 08-16-1993
237 11-20-1982
238 01-20-2016
239 04-29-2003
240 07-14-1974
241 04-01-1986
242 03-12-1992
243 06-14-2017
244 04-22-2007
245 01-28-2011
246 08-19-1977
247 04-23-2020
248 05-31-1973
249 08-17-1978
250 04-26-1972
251 12-02-2000
252 11-29-1974
253 01-30-1972
254 02-11-2006
255 11-05-2006
256 10-02-2016
257 05-04-1998
258 12-20-2023
259 05-09-2024
260 06-12-1986
261 03-17-1988
262 02-02-2021
263 01-25-1977
264 09-11-1970
265 09-25-1998
266 09-19-1986
267 11-01-1980
268 03-25-1988
269 08-01-1974
270 10-10-1991
271 07-09-1978
272 04-01-1970
273 07-07-1987
274 03-23-1983
275 07-04-2001
276 09-08-1985
277 02-22-1994
278 01-25-2016
279 01-09-2005
280 09-13-2015
281 01-30-2009
282 08-17-1995
283 02-14-1987
284 04-19-2010
285 09-11-1972
286 12-13-1986
287 02-28-2001
288 01-02-2001
289 06-25-1976
290 03-09-1998
291 10-08-2008
292 03-28-1981
293 07-21-1991
294 02-03-2022
295 01-25-1995
296 11-02-2007
297 02-20-1987
298 08-05-1992
299 10-22-2014
300 02-23-1996
301 11-07-2020
302 12-28-1976
303 04-11-2003
304 12-07-1984
305 01-11-1976
306 04-23-1991
307 04-19-1989
308 09-16-1998
309 09-11-1998
310 06-04-1982
311 09-09-1989
312 01-09-1983
313 03-25-1981
314 11-03-2005
315 02-06-1970
316 10-13-2011
317 11-04-1975
318 03-12-2004
319 03-09-1996
320 05-10-1998
321 08-16-1991
322 07-27-1991
323 05-09-1984
324 11-20-1989
325 12-23-1981
326 07-20-1984
327 11-24-1976
328 08-18-2010
329 02-03-1991
330 06-13-1991
331 11-27-1978
332 10-23-2023
333 06-06-1991
334 11-25-2012
335 02-28-1992
336 02-02-1979
337 07-27-1974
338 05-10-1990
339 05-14-2000
340 07-15-1988
341 12-25-1982
342 06-28-2000
343 09-11-1983
344 07-28-1978
345 04-23-2016
346 11-27-2018
347 06-22-2002
348 08-27-2004
349 02-06-1985
350 07-23-2012
351 10-25-1970
352 10-16-2016
353 06-15-1992
354 04-27-2024
355 11-28-1972
356 08-27-1970
357 03-19-2013
358 08-31-1988
359 08-07-1997
360 03-24-1984
361 11-10-1969
362 03-04-1989
363 04-23-2009
364 02-16-2020
365 12-18-1984
366 08-25-1988
367 02-08-1993
368 08-19-1989
369 09-02-1996
370 01-21-2020
371 01-27-1975
372 12-08-1973
373 02-22-1977
374 04-28-2006
375 11-24-2008
376 03-23-1971
377 09-26-2014
378 07-17-2019
379 05-09-2000
380 07-10-2008
381 08-27-1983
382 09-20-1972
383 12-09-1993
384 03-26-2004
385 06-13-1979
386 06-02-1977
387 03-20-2024
388 06-29-2000
389 09-19-1995
390 10-06-2020
391 04-18-1997
392 11-16-1997
393 10-28-1999
394 07-20-2006
395 01-20-2017
396 12-27-2016
397 07-05-2004
398 05-19-2013
399 12-03-1976
400 06-21-2012
401 06-23-2019
402 01-14-2019
403 09-21-2002
404 03-13-2004
405 07-28-1970
406 06-24-1989
407 11-21-2018
408 11-06-2023
409 04-21-1994
410 10-12-2001
411 07-24-2005
412 10-01-1984
413 10-17-1969
414 04-02-1994
415 10-19-2013
416 02-12-2003
417 01-16-2015
418 10-03-2000
419 06-15-1990
420 02-01-2013
421 09-15-1974
422 02-27-2015
423 08-11-2021
424 01-17-1987
425 09-02-2004
426 02-15-1988
427 01-24-1991
428 10-17-2022
429 12-19-2012
430 09-01-2006
431 06-04-1979
432 01-21-1989
433 11-14-1991
434 09-03-2008
435 07-13-2020
436 07-22-2018
437 05-06-1970
438 03-21-1976
439 04-25-1992
440 06-15-2003
441 08-31-2015
442 07-19-1977
443 10-30-2003
444 06-10-2013
445 10-05-2015
446 09-23-2000
447 12-27-1992
448 11-18-1981
449 07-10-1989
450 09-19-2015
451 12-31-1978
452 07-20-2001
453 10-16-1992
454 02-23-1988
455 03-10-2016
456 11-15-1969
457 07-16-2013
458 09-12-1989
459 09-06-1983
460 05-13-1979
461 11-14-1993
462 04-15-1991
463 02-22-1992
464 09-19-2013
465 09-15-1994
466 08-18-1993
467 09-11-1998
468 03-02-2016
469 07-18-2012
470 01-25-2005
471 06-14-1983
472 11-03-1992
473 11-27-1978
474 08-13-1999
475 03-21-1987
476 06-12-2014
477 07-19-1987
478 03-15-2021
479 10-27-1992
480 12-11-1990
481 12-04-2017
482 07-29-1979
483 10-24-1979
484 09-05-1984
485 03-08-2000
486 11-01-1993
487 05-22-2002
488 11-19-1985
489 01-29-2004
490 05-02-2008
491 03-20-1980
492 05-10-1990
493 10-26-1995
494 01-21-2011
495 03-07-1975
496 07-13-2000
497 12-05-1986
498 06-12-1982
499 09-21-1980
500 08-06-2010
501 07-30-1974
502 12-14-1980
503 03-22-1995
504 04-15-1972
505 05-09-1988
506 08-25-2007
507 01-18-1990
508 11-14-1999
509 01-17-1980
510 07-24-1976
511 07-08-1982
512 05-14-1985
513 10-10-2018
514 03-03-1984
515 12-08-1989
516 09-19-2020
517 07-06-1982
518 06-25-2015
519 01-25-2001
520 03-07-1988
521 11-17-1987
522 10-29-1991
523 03-31-2020
524 11-08-2001
525 04-25-2002
526 12-26-1992
527 01-28-2019
528 07-03-1972
529 01-04-2024
530 02-07-2009
531 09-28-2010
532 08-04-2015
533 06-18-2016
534 11-23-2018
535 05-26-2004
536 10-14-2001
537 08-10-1997
538 01-16-1970
539 10-19-2007
540 10-14-2005
541 05-14-2009
542 09-22-2010
543 05-11-1985
544 11-21-1995
545 09-21-2020
546 07-03-1991
547 01-11-1985
548 02-06-1993
549 09-03-2007
550 05-19-1973
551 04-02-1973
552 07-18-2021
553 05-06-1970
554 06-30-1980
555 12-26-1991
556 05-20-1995
557 05-12-1998
558 03-02-1970
559 09-03-2002
560 08-19-1987
561 01-03-2004
562 09-30-2005
563 12-30-1985
564 12-20-1992
565 04-04-2008
566 01-08-1986
567 01-28-2011
568 10-10-2010
569 12-21-2003
570 04-02-2004
571 07-07-1994
572 07-05-1984
573 10-08-1995
574 11-27-1979
575 10-31-2020
576 03-01-2004
577 06-27-1972
578 08-15-1975
579 01-10-1996
580 12-08-2012
581 01-14-2018
582 10-09-1982
583 03-19-1996
584 01-20-1994
585 09-17-1990
586 12-16-1971
587 08-25-1984
588 08-18-2020
589 02-04-1987
590 05-11-1975
591 05-14-1970
592 12-02-1994
593 10-11-1999
594 04-29-2013
595 08-09-2006
596 12-06-2023
597 07-20-2007
598 06-21-1987
599 10-22-1985
600 05-27-1980
601 01-15-2000
602 08-04-2010
603 03-08-2008
604 11-14-1974
605 04-06-1995
606 09-30-2006
607 12-10-1974
608 10-21-2008
609 01-24-1981
610 09-17-1975
611 10-15-2009
612 07-01-2019
613 01-11-1990
614 11-03-2005
615 06-27-2000
616 01-14-2015
617 09-11-2024
618 04-30-1997
619 10-07-2015
620 04-01-1976
621 12-08-1990
622 01-14-2019
623 12-27-1997
624 07-12-1981
625 05-25-2005
626 04-03-1985
627 09-30-1992
628 04-17-1983
629 01-17-2003
630 09-29-2017
631 06-02-1975
632 01-19-2006
633 07-07-1990
634 01-30-1972
635 11-07-1995
636 02-07-1994
637 09-28-2023
638 01-24-1980
639 03-19-1987
640 09-08-2013
641 11-05-2013
642 05-20-2014
643 01-16-2018
644 03-25-2012
645 08-27-1972
646 05-17-1976
647 05-20-2009
648 04-30-2014
649 08-25-2014
650 02-17-2024
651 07-30-1977
652 09-18-2022
653 07-24-1979
654 10-06-2020
655 11-15-1974
656 01-25-2019
657 05-19-1988
658 11-14-1978
659 04-06-2012
660 11-18-1981
661 01-06-1982
662 05-08-1995
663 07-12-2006
664 03-01-1970
665 12-05-1987
666 01-14-2005
667 09-25-1978
668 05-09-1997
669 09-11-1998
670 02-03-1990
671 05-28-1990
672 03-26-1999
673 02-17-2000
674 07-19-2007
675 02-29-1992
676 11-07-2004
677 04-24-2017
678 03-15-2010
679 11-21-2020
680 10-22-2003
681 02-03-1983
682 02-26-1971
683 09-19-1996
684 08-10-1974
685 10-25-2003
686 12-04-2019
687 07-12-2004
688 05-29-1997
689 12-18-1980
690 06-25-1999
691 10-13-1993
692 06-01-1977
693 09-14-1983
694 01-14-1979
695 07-20-2017
696 01-14-1993
697 09-29-2017
698 01-25-1980
699 09-01-1997
700 09-30-1989
701 01-20-1993
702 12-16-1997
703 11-14-1977
704 08-21-2005
705 11-18-2000
706 12-21-1987
707 04-23-1999
708 12-10-1986
709 08-01-1995
710 03-19-1988
711 08-25-1984
712 09-10-2008
713 09-15-1990
714 08-05-2002
715 02-17-2024
716 02-17-1972
717 01-09-1997
718 09-14-2004
719 10-13-2000
720 08-25-2019
721 06-13-1993
722 09-29-1987
723 06-07-2003
724 02-14-1986
725 10-01-1971
726 08-01-1975
727 03-17-2024
728 03-16-2009
729 07-28-1998
730 02-01-1995
731 02-25-2001
732 05-30-1998
733 11-10-1998
734 02-11-1983
735 04-08-1976
736 03-08-1970
737 02-10-2003
738 11-27-2020
739 03-25-2020
740 07-17-2015
741 05-31-1992
742 11-21-1969
743 05-31-2022
744 06-09-1984
745 06-15-2014
746 07-23-1994
747 01-29-1985
748 10-26-2015
749 04-21-2012
750 07-07-1972
751 02-12-2007
752 10-23-1996
753 05-20-1991
754 07-06-2003
755 12-06-1975
756 06-13-2009
757 09-17-2010
758 11-02-2022
759 03-07-1996
760 11-03-1995
761 02-15-1993
762 08-23-1995
763 11-14-1982
764 02-13-1973
765 12-29-1979
766 03-29-2005
767 09-30-1970
768 02-27-1982
769 09-14-2017
770 05-22-2020
771 09-09-1986
772 08-31-2008
773 04-07-1996
774 05-09-1971
775 01-07-1986
776 08-01-1979
777 01-04-2021
778 02-25-1975
779 01-27-1981
780 04-13-2015
781 12-10-1981
782 11-30-1989
783 10-13-2006
784 06-27-1990
785 06-01-1996
786 09-18-1991
787 07-16-2019
788 03-31-2013
789 04-02-1970
790 02-09-1998
791 07-26-1986
792 04-07-1976
793 08-13-1989
794 12-30-2015
795 04-04-2003
796 08-26-1991
797 03-06-1992
798 01-27-1987
799 02-04-1986
800 01-20-1999
801 04-13-1980
802 08-26-1992
803 06-05-2011
804 07-12-1990
805 03-29-1971
806 09-11-2016
807 05-16-1992
808 09-17-2022
809 09-05-2018
810 12-06-1986
811 11-10-1969
812 06-09-2018
813 12-04-1999
814 01-15-1997
815 03-17-2021
816 01-04-1990
817 12-04-1987
818 08-06-2019
819 03-17-2014
820 11-16-1980
821 01-26-2021
822 08-14-2000
823 05-13-1975
824 10-05-2011
825 11-17-2020
826 10-01-1971
827 10-05-1987
828 11-06-1973
829 04-23-1995
830 12-16-1996
831 12-20-1985
832 08-15-1980
833 07-21-1995
834 05-06-1998
835 06-25-1996
836 08-01-1988
837 10-22-1999
838 12-31-2023
839 03-06-1975
840 10-19-2000
841 11-07-1989
842 07-17-1980
843 02-25-2018
844 05-02-1993
845 03-12-2007
846 12-27-1972
847 06-29-2008
848 04-04-2016
849 06-18-2020
850 10-21-1975
851 11-05-2009
852 01-04-2010
853 12-19-1976
854 05-03-1992
855 08-11-1977
856 01-28-1984
857 06-01-2004
858 04-07-1990
859 04-23-1995
860 07-20-2011
861 01-26-2004
862 10-20-1997
863 04-04-1989
864 02-27-2015
865 02-26-2021
866 11-30-2000
867 06-23-2018
868 10-05-2007
869 10-19-1975
870 07-08-2013
871 09-30-2011
872 08-27-1991
873 03-04-1999
874 03-17-2001
875 09-18-1997
876 12-13-2014
877 04-15-2024
878 11-26-2009
879 10-22-2000
880 01-24-2014
881 10-30-1993
882 09-22-2016
883 11-06-1969
884 07-28-1995
885 12-26-1995
886 10-23-2005
887 02-20-1988
888 09-12-1983
889 08-01-2023
890 02-20-1988
891 09-19-2022
892 04-01-1998
893 04-10-1988
894 10-30-1989
895 12-06-1990
896 09-28-2022
897 06-28-1980
898 03-20-1987
899 05-21-1971
900 12-18-1986
901 06-15-1990
902 07-08-1972
903 12-26-1989
904 03-08-1978
905 06-29-1980
906 02-27-2011
907 08-15-2017
908 08-22-2007
909 08-19-1992
910 10-05-2016
911 09-18-2004
912 11-15-1971
913 02-13-2000
914 01-31-1989
915 03-22-1974
916 06-26-2021
917 07-19-1999
918 02-11-2003
919 08-12-2021
920 08-08-2011
921 12-15-2023
922 05-18-2014
923 10-28-2018
924 11-14-1996
925 12-03-2019
926 09-11-2001
927 08-28-2010
928 06-16-2014
929 01-13-2004
930 04-07-1981
931 02-14-2016
932 01-03-2022
933 06-06-2013
934 02-09-2023
935 04-11-1986
936 03-21-1979
937 12-25-1990
938 02-17-2020
939 09-18-2002
940 09-23-2010
941 11-21-1996
942 01-31-1980
943 01-27-2000
944 01-27-1988

View File

@ -0,0 +1 @@
https://mockaroo.com/

View File

@ -0,0 +1,893 @@
Ninjago: Book of Adventures
Gears
Town Mini-Figures
Castle 2 for 1 Bonus Offer
Space Mini-Figures
Space Mini-Figures
Space Mini-Figures
Space Mini-Figures
Castle Mini Figures
4.5V Samsonite Gears Motor Set
Legend of Chima: Corbeaux et Gorilles
Master Mechanic Set
Master Builder Set
Basic Building Set in Cardboard
Discovery Set
Special Offer
Basic Building Set in Cardboard
Pre-School Set
Basic Building Set
The Majestic Horse
Chain Links
Basic Building Set
Bulldozer Chain Links
Extra Large Tires & Hubs
Wheel Set
Digger Bucket Assembly
Basic Building Set
Doll Furniture
Ninjago: Build Your Own Adventure
Star Wars: Build Your Own Adventure: Galactic Missions
Nursery Furniture
Building Set
The Race to Build It Board Game
Doors and Fences
Living Room
Farm Animals
Basic Building Set
Propellers and Wheels
Pre-School Beginners Set
Playhouse
Jumbo Brick Pull Toy
Basic Building Set
Jumbo Bricks
Farm
Assorted Clear Bricks & Plates
Gates and Fences
Windows / Doors & Trees / Bushes
Lighting Device Pack
Hinges
Assorted Basic Bricks - Red
Assorted Basic Bricks - White
Assorted Basic Bricks - Blue
Assorted Basic Bricks - Yellow
Trees & Bushes
Basic Building Set
Large Wheels
Small Wheels
Assorted White Plates
Jumbo Brick School Set
Motor Wires
Five Large Base Plates - Green
Five Large Base Plates - White
Five Large Base Plates - Blue
Ducks
Two Garage Door Kits
Basic Building Set
Governor Set
Battery Box
Block Box
Pre-School Set
Pre-School Set
The Ultimate LEGO Book
Atlantis: Brickmaster
Pirates: Brickmaster
Ninjago: Brickmaster
Harry Potter: Characters of the Magical World
Pre-School Set
Roadway Base Plate
Basic Building Set with Train
Ambassador Set
Police Station
4.5V Replacement Motor
Legoville
Racer
Tub Boat
Star Wars Battle Bridge storage case
Super Set
Trees & Flowers
Guarded Inn
Jurassic World - PC DVD
Mosaic Set
Metroliner
Railroad Club Car
Harry Potter: Years 5-7 - PS Vita
1 x 2 Sand Red Bricks
Batman the Videogame - PSP
2 x 2 Sand Red Bricks
Marvel Super Heroes - PS4
2 x 4 Sand Red Bricks
Jurassic World - Xbox One
Jurassic World - PS Vita
Marvel Avengers - Xbox One
Marvel Avengers - PS4
Marvel Avengers - PS Vita
Marvel Super Heroes - Xbox One
Marvel Avengers - PC
Star Wars: The Force Awakens - 3DS
Star Wars: The Force Awakens - PS Vita
Star Wars: The Force Awakens Deluxe Edition - PS3
Star Wars: The Force Awakens - PS3
1 x 6 Sand Red Bricks
Harry Potter Collection - PS4
Marvel Super Heroes 2 - Xbox One
Marvel Super Heroes 2 - PS4
Marvel Super Heroes 2 - Nintendo Switch
The Incredibles - Nintendo Switch
The Incredibles - PS4
DC Super-Villains - Nintendo Switch
DC Super-Villains - PS4
The Incredibles - Xbox One
2 x 4 Sand Red Ridge Roof Tiles Steep Slope
Harry Potter Collection - Xbox One
Harry Potter Collection - Nintendo Switch
The LEGO Movie 2 Videogame - Nintendo Switch
The LEGO Movie 2 Videogame - PS4
The LEGO Movie 2 Videogame - Xbox One
Jurassic World - Nintendo Switch
2 x 4 Roof Tile Sand Red
Assorted Blue Bricks
Assorted Yellow Bricks
Assorted Blue Plates
Assorted Yellow Plates
Open Freight Wagon
Caboose
Passenger Wagon
Tanker
Hopper Wagon
Darth Maul
Rebel Blockade Runner
Santa Fe Super Chief
Santa Fe Super Chief - Limited Edition
U.S.S. Constellation
Master Builder Set
Red Baron
Naboo Starfighter
Train Engine Shed
Lunar Lander
Ninjago Lloyd Backpack
Nexo Knights Backpack
Imperial Star Destroyer
Friends Backpack
Ninjago Green Lloyd Junior Backpack
Ninjago Prime Empire Junior Backpack
Mermaid Junior Backpack
Nexo Knights Shoulder Bag
Friends Juice Bar Shoulder Bag
Friend Pencil Case
Ninjago Lloyd Gym Bag
Star Wars The Dark Side Darth Vader Gym Bag
Star Wars Stormtrooper Gym Bag
Friends Pink Gym Bag
Ninjago Dragon Master Gym Bag
Ninjago Green Lloyd Gym Bag
Purple Gym Bag
Navy Gym Bag
Ninjago Kai Backpack Trolley
Ninjago Lloyd Backpack Trolley
Nexo Knights Backpack Trolley
Friends Funpark Backpack Trolley
Pizza To Go
Breezeway Cafe
Black Seas Barracuda
Main Street
American Flag
2x2 Electrical Plate
Windows and Doors
Pillars and Beams
City Police Backpack Trolley
Ninjago Urban Backpack Trolley
Friends Girls Rock Backpack Trolley
Friends Hearts Backpack Trolley
Brown Tiles
Light Gray Arches
Small Wheels and Axles
Large Wheels and Axles
Gray Fences
Star Wars Stormtrooper Pencil Case
Ninjago Lloyd Energy Pencil Case
Ninjago Green Lloyd Pencil Case
Purple Pencil Case
Parrot Pencil Case
Violet Pencil Case
Navy Pencil Case
Transparent Bricks
Ninjago Spinjitzu Jay Pencil Case
Ninjago Green Lloyd Pencil Case
Purple Pencil Case
Navy Pencil Case
Black Slopes 33
Black Slopes 33 3 x 2 and 3 x 4
Black Slopes 33 3 x 1 and 3 x 3
White Plates 2 x n
Black Plates 2 x n
Red Plates 2 x n
Dark Green Plates 2 x n
Light Gray Plates 2 x n
Duplo Bib
Black Plates 1 x n
Red Plates 1 x n
Green Plates 1 x n
Light Gray Plates 1 x n
White Plates 1 x n
Castle Accessories
Mini-Fig Headgear
Santa Claus
Christmas Tree
Reindeer
Mr. Bunny
TECHNIC Beams
Ninjago Green Lloyd Backpack
Stars Backpack
Purple Backpack
Navy Backpack
Bushes
Cross Axles
Spider-Man Action Pack
TECHNIC Gear Wheels
TECHNIC Motor
Train Connection Wire
Snowman
Angel
Birthday Pack Heart
Ninjago Green Lloyd Backpack Trolley
Ninjago Golden Lloyd Backpack Trolley
Birthday Pack Daisy
Birthday Pack Star
90 Years of Play Metal Key Chain
Turkey
100 LEGO Stores North America
Universal Building Set
Ninjago Kai Lunch Bag
Ninjago Lloyd Lunch Bag
Ninjago Cole Lunch Bag
Ninjago Jay Lunch Bag
City Citizens Wallet
Ninjago Into the Unknown Wallet
Ninjago Kai Pencil Case
Ninjago Jay Pencil Case
Friends Hearts Pencil Case
Ninjago Into the Unknown Pencil Case
City Race Pencil Case
City Citizens Gym Bag
Snowflake
4.5V Battery Case
Number/Symbol Blocks
Foliferous Tree
Bush
Cypress Trees
2 x 2 Sand Red Roof Tiles
Jumper Bricks
Accessories Heart
Accessories Daisy
Accessories Star
Imagination Set 1
Mosaic Set
NBA Basketball Teams
Cloud City
Wright Flyer
NHL Action Set with Stickers
Train Level Crossing
Train Level Crossing
Rebel Snowspeeder
4.5V Battery Case
TIE Fighter Collection
Motorized Hogwarts Express
Burlington Northern Santa Fe Locomotive
Y-wing Attack Starfighter
Holiday Decoration Kit
Universal Joints
Mosaic Set - Domestic Animals
Death Star II
Sandcrawler
Assorted Light Gray Bricks
Assorted Dark Gray Bricks
Assorted Brown Bricks
Assorted Light Gray Plates
Assorted Dark Gray Plates
Assorted Brown Plates
Letters Large
Hot Rod
Maersk Sealand Container Ship 2004 Edition
Maersk Sealand Container Ship 2005 Edition
Maersk Line Container Ship 2006 Edition
Maersk Line Container Ship 2010 Edition
LEGO Truck
High Speed Train Locomotive
High Speed Train Car
City Airport
Black Ridge Roof Tiles
Letter Bricks for Wall Board
Black Roof Tiles
Red Ridge Tiles
Red Roof Tiles
Elf Boy
Elf Girl
Brickmaster Welcome Kit
Mrs. Bunny
Chicken & Chicks
TTX Intermodal Double-Stack Car
Letter Bricks for Wall Board
Holiday Train
Imperial AT-ST
Boeing 787 Dreamliner
Motorized Walking AT-AT
Millennium Falcon
Letters
Eiffel Tower 1:300
Cafe Corner
Hobby Train
Town Plan
Green Grocer
General Grievous
Volkswagen Beetle
Death Star
Taj Mahal
Market Street
Mosaic Set - Lion
Star Justice
Space Skulls
Medieval Market Village
Emerald Night
Republic Dropship with AT-OT
Grand Carousel
Fire Brigade
Tantive IV
Winter Toy Shop
Tree and Signs
Custom Car Garage
Basic Bricks
Takutanuva
Ultimate Dume
Voporak
Vezon & Kardas
Locomotive
4.5V Motor Set
Imperial Flagship
Basic Vehicles
Grand Emporium
Imperial Shuttle
Shuttle Adventure
Supplemental Pack for Shuttle Adventure Set 10213
Tower Bridge
Winter Village Bakery
Diagon Alley
Pet Shop
Maersk Container Train
Imagination Basic Set 2
Volkswagen T1 Camper Van
Mini Basic Bricks
Super Star Destroyer
Winter Village Post Office
Kingdoms Joust
Town Hall
R2-D2
Sopwith Camel
B-wing Starfighter
Haunted House
Winter Village Cottage
Super Value Set
Mini Modulars
Red Baseplate
Shuttle Expedition
Palace Cinema
Horizon Express
Sydney Opera House
Winter Village Market
Ewok Village
The Tower of Orthanc
Red Five X-Wing Starfighter
Animals
Maersk Line Triple-E
MINI Cooper
Parisian Restaurant
Fairground Mixer
Adventurers Value Pack
Ferris Wheel
Ferrari F40
Winter Toy Shop
Year Of The Snake
Figures and Furniture
Brick Bank
Volkswagen Beetle
Big Ben
Winter Holiday Train
Assembly Square
Taj Mahal
Carousel
London Bus
Winter Village Station
Downtown Diner
Playhouse Boxes
Roller Coaster
James Bond Aston Martin DB5
Winter Village Fire Station
Corner Garage
Ford Mustang
NASA Apollo 11 Lunar Lander
Gingerbread House
Vestas Wind Turbine
Harley-Davidson Fat Boy
Bookshop
Vehicles
Fiat 500
Old Trafford - Manchester United
Haunted House
ECTO-1
Elf Club House
Colosseum
Crocodile Locomotive
Police Station
Volkswagen T2 Camper Van
Flower Bouquet
6 x 12 Base Bricks
Bonsai
adidas Originals Superstar
NASA Space Shuttle Discovery
Camp Nou - FC Barcelona
Compass Sensor for Mindstorms NXT
Bird of Paradise
Pickup Truck
Milk Delivery Truck - Tine
Queer Eye: The Fab 5 Loft
Friends - The Apartments
Titanic
Porsche 911 Turbo & 911 Targa
Boutique Hotel
Vespa 125
Real Madrid Santiago Bernabéu Stadium
Front-End Loader
Front-End Loader
Back to the Future Time Machine
TECHNIC I: Simple Machines Set
Optimus Prime
Loop Coaster
Chevrolet Camaro Z/28 1969
Atari 2600
Eiffel Tower
Holiday Main Street
Succulents
4.5V Motor Set with Rubber Tracks
Building Cards - 1030
Orchid
Jazz Club
Wildflower Bouquet
Dried Flower Centerpiece
Tranquil Garden
Lord of the Rings: Rivendell
Land Rover Classic Defender 90
Concorde
Imagination Set 3
Eldorado Fortress
TECHNIC II Set {4.5v}
Corvette
PAC-MAN Arcade
Alpine Lodge
Natural History Museum
Dune Atreides Royal Ornithopter
Bouquet of Roses
Tiny Plants
McLaren MP4/4 & Ayrton Senna
Building Cards - 1032
Kingfisher Bird
Medieval Town Square
The Lord of the Rings: Barad-dûr
Retro Radio
The Endurance
Lamborghini Countach 5000 Quattrovalvole
Bumblebee
Wreath
Teachers Resource Set
NASA Artemis Space Launch System
Pretty Pink Flower Bouquet
Mini Orchid
Lucky Bamboo
Flower Arrangement
Williams Racing FW14B & Nigel Mansell
Duplo Hooded Towel
Fountain Garden
Brick Tote Bag
Chrysanthemum
Plum Blossom
Poinsettia
ERBIE the Robo-Car
Manual Control Set 1
Over the Moon with Pharrell Williams
Rainbow Fun
Farm Set
Fun Future
Universal Building Set
World Fun
Mission to Mars
Replacement 4.5V Motor
Harbor
Learn About Chinese Culture
Universal Building Set
Animal Train
Daily Routines: Bath Time
Daily Routines: Eating & Bedtime
Big Feelings & Emotions
Caring for Animals at the Farm
Mack at the Race
Elsa & Bruni in the Enchanted Forest
Caring for Bees & Beehives
Imagination Set 4
Community People
Alphabet Truck
Universal Set for Boys and Girls from 1 1/2 Years
3in1 Space Shuttle Adventure
Buildable People with Big Emotions
Train Tunnel and Tracks Expansion Set
Train Bridge and Tracks Expansion Set
Interactive Adventure Train
Big Interactive Community Train
Peppa Pig Garden and Tree House
Peppa Pig Boat Trip
Peppa Pig Birthday House
Peppa Pig Supermarket
The LEGO Ninjago Movie Kai Backpack
Visit to the Vet Clinic
Cars and Trucks Brick Box
Community Vehicles
Industrial Elements
Educational LEGO Building Set
Train Set
Ninjago Foldable Backpack
Extra Track
Bridge and Crossing Tracks
Ships
Galaxy Explorer
Horse Stable
Basic Pack
Zoo Friends
Zoo Bus
Circus Show
My First Circus
Play House
Train Accessory Set
My First Train Set
Deluxe Train Set
Dusty and Chug
Canada Post Truck
Never Land Hideout
My First Garden
My First Construction Site
Garbage Truck
Building Set
Big Front Loader
Baby Calf
Farm Animals
Farm Tractor
Big Farm
Ambulance
School Bus
Truck
Imagination Set 5
Community Buildings
Mickey Mouse and Friends
My First Police Set
Z-Blob Plush
Fire and Rescue Team
Beach Racing
Stena Line Ferry
Superman Rescue
The Joker Challenge
Batcave Adventure
My First Shop
Circus Transport
Mini Basic Pack
Creative Cars
Toddler Build and Play Cubes
Toddler Build and Pull Along
Creative Bucket
Creative Chest
Giant Tower
Number Train
A Fairy Tale
Peekaboo Jungle
Toddler Starter Building Set
Creative Suitcase
Creative Picnic
Toddler Build and Boat Fun
Treasure Attack
All-in-One-Gift-Set
All-in-One-Pink-Box-of-Fun
All-in-One-Box-of-Fun
Creative Animals
Creative Ice Cream
Creative Building Cube
Zoo Care
Big Royal Castle
Clubhouse Café
Deluxe Box of Fun
Forest: Ducks
Forest: Animals
Forest: Fishing Trip
Forest: Park
Mom and Baby
Ice Cream Truck
Café
Rally Car
Airport
Fire Boat
Fire Truck
Fire Station
Disney Princess Collection
Birthday Parade
Batman Adventure
Classic Race
Road Plates and Signs
Delivery Vehicle
Camping
My First Bus
Treasure Island
Rosie the Ambulance
Backyard Clinic
Spider-Man Web-Bike Workshop
Spider-Man Spider Truck Adventure
UNICEF Van
Single Disk Pack
My First Tractor
My First Playhouse
My First Farm
Creative Building Box
Town Vehicles
Large Creative Box
Basic Bricks Large
Community Workers
Dacta Buildings
House Accessories - 182 elements
XL Creative Brick Box
Monster Trucks
My First LEGO Princess
My First LEGO Set
Blue Suitcase
Vehicle Suitcase
Pink Suitcase
36 Little People + Accessories
My First LEGO Fire Station
Creative Bucket
Creative Chest
Creative Tower
Spider-Man: Spider-Car Pursuit
Digger
Construction
Princess Play Castle
Turtle Lair
Community Vehicles
Fire Emergency
Batman: Defend the Batcave
Race Car Rally
Pony Farm
Police The Big Escape
Beach Trip
Pirate Treasure Hunt
Garbage Truck
Air Patrol
Creative Building Cube
Creative Suitcase
Road Work Truck
Supermarket Suitcase
Fire Suitcase
Family House
Spider-Man Hideout
Speedboat
Creative Bricks
Creative Supplement
Creative Supplement Bright
Creative Building Box
Medium Creative Brick Box
XXXL Box
Large Creative Brick Box
Sand Baseplate
Green Baseplate
Stunt Flyer
Gray Baseplate
Creative Building Set
Creative Builder Box
Creative Box
Creative Building Basket
Blue Creative Box
Red Creative Box
Green Creative Box
Orange Creative Box
4.5V Motor Set
Bricks 2 x 2 and 2 x 4
Bricks and Gears
Creative Suitcase
Blue Baseplate
Bricks on a Roll
Bricks Bricks Bricks
Canada Post Mail Truck
Police Helicopter Chase
Iron Man vs. Loki
Snake Showdown
Batman & Superman vs. Lex Luthor
Lost Temple
4.5V Reversible Power Unit
Lightning McQueen Speed Launcher
Cruz Ramirez Race Simulator
Demolition Site
Police Truck Chase
Batman vs. Mr. Freeze
Shark Attack
Fire Patrol Suitcase
Thunder Hollow Crazy 8 Race
Florida 500 Race Final
Road Repair Truck
LEGO People Supplementary Set
Mountain Police Chase
The Joker Batcave Attack
Spider-Man vs. Scorpion Street Showdown
Bunchu Plush
Pteranodon Escape
Raptor Rescue Truck
T. Rex Breakout
Underminer Bank Heist
Advent Calendar 1999
The Great Home Escape
City Central Airport
Woody & RC
Toy Story 4 RV Vacation
Supplementary Set
Carnival Thrill Coaster
Mickey & Friends Fire Truck & Station
"Mickey
Mickey and Friends Castle Defenders
Animal Mosaic Puzzle
Hulk vs. Rhino Truck Showdown
Spider-Man Webquarters Hangout
Bakey with Cakey Fun
Animal Mosaic Puzzle
Drill Spinner Vehicle
Spidey vs. Green Goblin
Team Spidey Web Spinner Headquarters
Crafting with Baby Box
Baby Animals
Savanna
Arctic
Jungle
Around the World
Horses
Horse Trailer
Little Plane
Police Patrol
Battery Box
Push Train
Backhoe Loader
Truck & Tracked Excavator
Big Construction Site
Tow Truck
My First Rocket
My First Cars and Trucks
Creative Chest
My First Truck
My First Garden
Creative Building Basket
Batwing Adventure
Mickey & Friends Beach House
Supplementary Pack
My First Caterpillar
Birthday Picnic
Preschool
Pizzeria
Family House
Family Pets
Shooting Gallery
Big Fair
Fun Family Fair
Batcave Challenge
Mickey Racer
Minnie Mouse Bow-tique
My First Carousel
My First Number Train
My First Bricks
My First Plane
My First Cakes
My First Bus
My First Bird
Creative Builder Box
Creative Box
Piston Cup Race
My First Puzzle Pets
My First Ladybug
My First Race Car
Bulk Bucket
My First Emotions
My First Celebration
My First Animal Brick Box
Large Playground Brick Box
Fun Creations
Farm Pony Stable
Farm Adventures
Farm Animals
Airport
Train Bridge and Tracks
Steam Train
Cargo Train
Spider-Man & Hulk Adventures
Gentle Giants Petting Zoo
T. rex Tower
Road Burner
Train Tracks
My First Tow Truck
My First Balancing Animals
My First Fun Puzzle
My First Car Creations
Creative Fun
Basic Figures
Spider-Man vs. Electro
Toy Story Train
My First Minnie Build
My First Mickey Build
Frozen Ice Castle
Police Bike
TECHNIC Control I
Fire Truck
Police Station
Fire Station
Baby Animals
Tropical Island
World Animals
Plane
Heart Box
Submarine Adventure
Brick Box
Deluxe Brick Box
Alphabet Truck
Fire Truck
Tow Truck
Batcave
TECHNIC Control II
Super Heroes Lab
Playroom
Bedroom
Pizza Stand
Bakery
Modular Playhouse
Bulldozer
Truck & Tracked Excavator
Wrecking Ball Demolition
Tower Crane & Construction
Creative Animals
Alphabet Town
Batman: Arkham Asylum Breakout
Dinosaur Nursery
T. rex and Triceratops Dinosaur Breakout
Spider-Man Headquarters
Johnny Thunder
Mickey & Minnie Birthday Train
Happy Childhood Moments
Space Shuttle Mission
Garbage Truck and Recycling
Family Camping Van Adventure
Race Cars
Parking Garage and Car Wash
Farm Animal Care
Farm Tractor & Animal Care
Super Sub
Horse Stable and Pony Care
"Barn
Unicorn
Number Train - Learn To Count
Animal Train
Amusement Park
Fire Helicopter & Police Car
Creative Birthday Party
Police Station & Helicopter
Race Buggy
Airplane & Airport
Spider-Man & Friends: Funfair Adventure
Bath Time Fun: Floating Red Panda
Bath Time Fun: Floating Animal Train
Bath Time Fun: Floating Animal Island
Police Motorcycle
Doctor Visit
Fire Truck
Fire Station & Helicopter
Res-Q Runner
Wild Animals of Africa
Wild Animals of the Ocean
Wild Animals of South America
Wild Animals of Asia
Wild Animals of the World
Can't render this file because it contains an unexpected character in line 870 and column 1.

987
PostgreSQL/.csv/names.csv Normal file
View File

@ -0,0 +1,987 @@
name
Tidcombe
MacKegg
Twelves
Fildes
Prin
Swinnard
Brithman
Matussow
Golborn
Crookston
Hegge
Milesop
Urpeth
Mixter
Forty
Bromilow
Upchurch
Heinsius
Bassham
Geindre
Yelding
Brownlea
Wimpress
Moodey
Clewlow
Tripp
Cromett
Lorait
Rohloff
Holdin
Lickess
Scohier
Letixier
Pegler
Perazzo
Odeson
Pakeman
Harbison
Belli
Bruna
Hembry
Prandi
Humbatch
Stilgoe
Puttock
Klima
Matousek
Najera
Inkin
Suttle
Imrie
Edmett
Enston
Redler
Aggs
Dugood
Aleksahkin
Fardo
Tolomio
Sancraft
Lapere
Hardan
Esposito
Stoggell
Bernardotte
Ucceli
Swadlin
Pawlyn
Langstone
Worley
Pearlman
McGrill
Kubicki
MacVicar
Cruickshank
Quigley
Bloschke
Rickards
Soreau
Bidwell
De Mitri
Yitzhak
Kettlestring
Drover
Tyrie
Taggart
Lane
Mithon
Kittoe
Reggiani
Bassam
Baake
Garrity
Blundon
Treneer
Antonoyev
Toor
Sockell
Cunningham
Bayldon
Worg
Inold
Briand
Jacobsohn
Ormes
Aitcheson
Meysham
Staton
Rosoni
Eliasen
Stubs
Outram
Scotchmore
Flatt
Amos
Elmes
Edeler
Kemster
Maskell
Braunthal
Penylton
Tidbold
Hooke
Domingues
Roget
Amdohr
Ivanishev
Mettetal
Spolton
Choak
Robbey
Grishankov
Braidwood
Sillis
Pozzi
Novotni
Habbijam
Tunney
Drable
Ladds
Wyldes
Chapple
Guille
Hanretty
Dare
McTrusty
Pilipets
Oakwell
Keyse
Benettini
Bresnahan
Eve
Opie
Somes
Gavaghan
Ollivier
Saterweyte
Benian
Cornils
Ager
Swatman
Grenfell
Hounson
Postlewhite
Esome
Castellino
Impleton
Bestall
Rudland
Wyke
Peppard
Cherm
Pullin
Girhard
Lago
Grossman
Janusz
Fetters
Hold
Hellens
McDill
Andreini
Anglin
Solleme
Mibourne
Abelov
Gwillyam
Scolli
Waslin
Heddon
Gross
McClory
Redwall
Lusted
Durrett
Warham
Raeside
Conaboy
Fraschini
Spracklin
Ingarfill
Asey
Plank
Kinahan
Allcoat
Lace
Hazelton
Sinton
Bretherick
Thornhill
Dearlove
Brain
Mollatt
Tann
Greydon
Abley
Keattch
Capps
Varsey
Plessing
Bowkett
Hanstock
Bachelar
Wayland
Raund
Howkins
Blampey
Hudleston
Barthelet
Lamont
Burley
Ackhurst
Stormes
Capelin
Mayhead
Gatty
Ryrie
Hollingshead
Phillippo
Giacometti
Jowsey
Cazereau
Seeman
Harnetty
Graysmark
Meere
Allerton
Bediss
Braunthal
Coot
Hulatt
Every
Foley
Balle
Winwood
Hookes
Poolman
Orman
Adlington
Dadson
Marcham
Vigurs
Gostling
Filyukov
Vasler
Wastall
Camilletti
Maylam
Jeanenet
Ashall
Gratrix
Chesshire
Bridson
Clines
Thebe
Burg
Cumbers
Snalham
Carnelley
Raffles
Viggars
Brok
Geistmann
Scutter
Kelsall
Degenhardt
McKmurrie
Swetland
Bastock
Baunton
Drakers
Vearncomb
Malyan
Blodgetts
Wingeat
Dovey
McGinlay
Assur
Schukraft
Shelper
Coldman
Huggard
Corney
Springtorpe
Gotfrey
Cottingham
Gudger
Bridgnell
McCallum
Witts
Terrazzo
Mangin
Konzelmann
Marsy
Gillingwater
Glandfield
Brumwell
Rice
Durram
Sandwith
Frankland
Carnson
Pacitti
Willoughway
Leonida
Fieller
Pallaske
Heeps
Itzcovichch
Hutchin
Konrad
Castelow
Narbett
Folca
Clynman
Battista
Bradnam
Clayton
Newstead
Wetherill
Wyd
Leachman
Clayal
Connah
Gretton
Ierland
Frogley
Lepard
Matyushonok
Kovelmann
Siely
Lefeaver
Rookledge
Wink
Derrell
Farbrother
Maddaford
Brayley
Stone Fewings
Hairon
Ree
Dohmer
Sandford
Darley
Kirkhouse
Srawley
Akhurst
De Coursey
Curnok
Grishagin
Pohlke
Coogan
Larkkem
Pargeter
Keaton
Brewerton
Outridge
Breckin
Cawse
Diffley
Caile
Ballston
Thatcher
Sydney
Jahn
Stokell
Calfe
Akker
Lethlay
Walewski
Basill
Morrid
Ansett
Gotfrey
Olivazzi
Skippon
Masarrat
Bavage
Josum
Eschalotte
Cawse
Larkby
Selland
Jagiello
Lintall
Pimblott
Winspeare
Airton
Mithun
Crich
Banbrook
Skellon
Shemelt
Stithe
Jorger
Cuss
Jovovic
Perrinchief
Borzoni
Brittian
Jamblin
Shepherd
Flintoffe
Gavin
Fockes
Lumsdon
McBean
Santorini
Bather
Crack
Sedgman
Cardenas
Fere
Horsey
Hingeley
Fieldhouse
Janiak
Swannell
Esgate
Hadcock
Geindre
Cleland
Blissett
Livock
Borland
Kleis
Koles
Currey
Thorneywork
Lonsdale
Slack
Nibley
Stainfield
Ram
Kollasch
Delve
Ismirnioglou
Casserley
Hallbird
Enos
Figurski
Caldicott
Barff
Kennea
Meeus
Iacovini
Hollow
Latham
Skoggings
Simmens
Durbyn
Hillyatt
Ashdown
Varty
Cleobury
Valentine
Wolverson
Abramchik
Mettetal
Baytrop
Gallatly
Christie
Rous
Henmarsh
Nother
Scammonden
Beaten
Scrinage
Josselson
Pavlitschek
Debill
Bennellick
Piburn
Monini
Sacchetti
Cicchillo
Allington
Ilsley
Python
Laguerre
Siveyer
Hailwood
Axelbey
Clout
Burfitt
Pinsent
Bischoff
Budleigh
Sessuns
Rutty
Corry
Bartusek
Verlinden
Lissett
Whimpenny
Kissock
Parlott
Venditti
Pavey
Dessaur
Fieldsend
Gerge
Melin
Boland
Gergus
Cossar
Tift
Carlucci
Cockings
Harty
Labbett
Deverick
Blurton
Strephan
Burles
Dwerryhouse
Weetch
Brierton
Colleton
Morsom
Jurries
Woakes
Ladbrook
Harrild
McBain
Fobidge
Pellington
Palin
Dumbleton
Messum
Yves
Alvar
Haywood
Sucre
Gomersal
Shilito
Voller
Dougill
Bevis
Kemmons
Limpricht
Kleisle
Filip
Moneti
Gooderridge
Culy
Vosper
Call
Freear
Kiebes
Polack
Marder
Lowin
Lewing
Daily
de Amaya
Matieu
Rowett
Manske
Ingleton
Oldknowe
Hartzenberg
Habron
Dodgshun
Roadknight
Eltune
Gallear
Stonestreet
Clewett
Confort
Agent
Gonnard
Malecky
Wyleman
McCarrison
Wasbrough
Shepland
Lieber
Stratten
Lantaph
Renfield
Vampouille
McSparran
Hargitt
Acland
Cunnell
Rosa
Cobbe
Yosselevitch
Dubble
Baudon
Vamplers
Milliken
Lundbeck
Kingcott
Issakov
Liebmann
Kattenhorn
Gaskins
Cornelius
Finnes
Meegin
Joincey
Gherardelli
Gowanson
Canty
Raywood
Heinsius
Wooles
Burde
Kisar
Allso
Sindall
Hurn
Doe
Ramsby
Gavriel
Clohissy
Vardey
Klimpt
Emberson
Isaacson
Lowther
Heyball
Woodruff
McDonell
Porcher
Silbermann
Cummins
Harrower
Roland
Wadwell
Baulch
McComb
Metcalf
Dmitrovic
Mylan
Jeannin
Mossdale
Odhams
Dignan
Heatly
Joye
Lorrimer
Damp
Faucett
Stilgo
Aberhart
Duffield
Maydwell
Du Plantier
Gare
Braker
Spread
Diffley
Eborall
Maddy
Nano
Salzen
Keerl
Bazoge
Deathridge
Geillier
Thiolier
Ausher
Laidel
Deeth
Willatt
Hinkensen
De Lacey
Cuddehay
Longland
Marde
Dungay
Buxcy
Lapides
Janaszkiewicz
Rizzelli
Christley
Luff
Lappin
Colnet
Flather
Treker
Forlong
Speddin
Melsome
Groome
Going
Enders
Rosone
Elegood
Isakowicz
Sieb
Sutch
Garvill
Rothera
Ceaplen
Hake
Babcock
Dautry
Beels
Bernardoux
Standen
Torricella
Gymblett
Storks
Dashkov
Hancell
Duhig
Scanlan
Hodjetts
Dunbar
Figger
Champion
Wikey
Priddie
Sausman
Durrand
Fridaye
Ellerby
Liebrecht
Kubu
Munden
Daggett
Colenutt
Trazzi
Coldbreath
Abson
Prosek
Gorelli
Lambeth
Pennell
Turnell
Crowch
Fossey
Helmke
Concannon
Fawcitt
Cumbridge
Scadden
Pate
Fike
Magauran
Ramsden
Hilley
Temple
Gumly
Brizland
Laverenz
Caney
Lahy
Tedahl
Geraldi
Columbine
Starbuck
Kennedy
Imlock
Adlem
Gotobed
Garken
Dawdary
Gregorace
Hogben
Paver
Branche
Hagan
McComish
Terlinden
Manson
Remmers
Greatex
Jackes
Mildmott
Biasotti
Newlands
Dewett
Bruinemann
Guiett
Boden
Wombwell
McGirl
Pabel
McKechnie
Greenough
Greenhalf
Bunyan
Zink
Blazic
Whitebrook
McRorie
Devine
Wolfenden
Dulwich
Calder
Bolley
Brouard
Hazeldine
Serjeant
Parman
Vela
Monteaux
Lune
Gaynes
Byneth
Fick
Shevlan
Herety
Vials
Featherbie
Whitwell
Petrik
Benditt
Willshaw
Brechin
Dwelley
Wicks
Anderl
Baldin
Webermann
Cheney
Kernar
Balazin
Sidry
Beecham
Sollas
Casotti
Pairpoint
Baggalley
Hastelow
Rebillard
Worsall
Falvey
Flanne
Storres
Jerrold
Money
Klehyn
Ridulfo
Fleay
Phuprate
Medlin
Outright
Bainbridge
Kitcat
Janek
Leech
Pavie
Hoolaghan
Matula
Haycock
Ungerechts
Omar
Davoren
Impey
Maffiotti
Pyrke
Beininck
Pizer
Melior
Yearnes
Rizzotto
Pincott
Shallcross
Marshal
Rubinowitsch
Pickance
Shearn
Edgerton
Crayker
Roebuck
Birchenhead
Shadrach
Sandercock
Rispin
Portch
Ebbens
Dransfield
Walster
Pilsbury
Lutzmann
Phillipson
Aldwick
Doyle
Starrs
Haugg
Lamplugh
Ketch
Arenson
Sasser
Severwright
Killner
Kubicka
Stanton
Jelley
Dorward
Jessel
Borel
Sutterfield
Treverton
Pero
Duffy
1 name
2 Tidcombe
3 MacKegg
4 Twelves
5 Fildes
6 Prin
7 Swinnard
8 Brithman
9 Matussow
10 Golborn
11 Crookston
12 Hegge
13 Milesop
14 Urpeth
15 Mixter
16 Forty
17 Bromilow
18 Upchurch
19 Heinsius
20 Bassham
21 Geindre
22 Yelding
23 Brownlea
24 Wimpress
25 Moodey
26 Clewlow
27 Tripp
28 Cromett
29 Lorait
30 Rohloff
31 Holdin
32 Lickess
33 Scohier
34 Letixier
35 Pegler
36 Perazzo
37 Odeson
38 Pakeman
39 Harbison
40 Belli
41 Bruna
42 Hembry
43 Prandi
44 Humbatch
45 Stilgoe
46 Puttock
47 Klima
48 Matousek
49 Najera
50 Inkin
51 Suttle
52 Imrie
53 Edmett
54 Enston
55 Redler
56 Aggs
57 Dugood
58 Aleksahkin
59 Fardo
60 Tolomio
61 Sancraft
62 Lapere
63 Hardan
64 Esposito
65 Stoggell
66 Bernardotte
67 Ucceli
68 Swadlin
69 Pawlyn
70 Langstone
71 Worley
72 Pearlman
73 McGrill
74 Kubicki
75 MacVicar
76 Cruickshank
77 Quigley
78 Bloschke
79 Rickards
80 Soreau
81 Bidwell
82 De Mitri
83 Yitzhak
84 Kettlestring
85 Drover
86 Tyrie
87 Taggart
88 Lane
89 Mithon
90 Kittoe
91 Reggiani
92 Bassam
93 Baake
94 Garrity
95 Blundon
96 Treneer
97 Antonoyev
98 Toor
99 Sockell
100 Cunningham
101 Bayldon
102 Worg
103 Inold
104 Briand
105 Jacobsohn
106 Ormes
107 Aitcheson
108 Meysham
109 Staton
110 Rosoni
111 Eliasen
112 Stubs
113 Outram
114 Scotchmore
115 Flatt
116 Amos
117 Elmes
118 Edeler
119 Kemster
120 Maskell
121 Braunthal
122 Penylton
123 Tidbold
124 Hooke
125 Domingues
126 Roget
127 Amdohr
128 Ivanishev
129 Mettetal
130 Spolton
131 Choak
132 Robbey
133 Grishankov
134 Braidwood
135 Sillis
136 Pozzi
137 Novotni
138 Habbijam
139 Tunney
140 Drable
141 Ladds
142 Wyldes
143 Chapple
144 Guille
145 Hanretty
146 Dare
147 McTrusty
148 Pilipets
149 Oakwell
150 Keyse
151 Benettini
152 Bresnahan
153 Eve
154 Opie
155 Somes
156 Gavaghan
157 Ollivier
158 Saterweyte
159 Benian
160 Cornils
161 Ager
162 Swatman
163 Grenfell
164 Hounson
165 Postlewhite
166 Esome
167 Castellino
168 Impleton
169 Bestall
170 Rudland
171 Wyke
172 Peppard
173 Cherm
174 Pullin
175 Girhard
176 Lago
177 Grossman
178 Janusz
179 Fetters
180 Hold
181 Hellens
182 McDill
183 Andreini
184 Anglin
185 Solleme
186 Mibourne
187 Abelov
188 Gwillyam
189 Scolli
190 Waslin
191 Heddon
192 Gross
193 McClory
194 Redwall
195 Lusted
196 Durrett
197 Warham
198 Raeside
199 Conaboy
200 Fraschini
201 Spracklin
202 Ingarfill
203 Asey
204 Plank
205 Kinahan
206 Allcoat
207 Lace
208 Hazelton
209 Sinton
210 Bretherick
211 Thornhill
212 Dearlove
213 Brain
214 Mollatt
215 Tann
216 Greydon
217 Abley
218 Keattch
219 Capps
220 Varsey
221 Plessing
222 Bowkett
223 Hanstock
224 Bachelar
225 Wayland
226 Raund
227 Howkins
228 Blampey
229 Hudleston
230 Barthelet
231 Lamont
232 Burley
233 Ackhurst
234 Stormes
235 Capelin
236 Mayhead
237 Gatty
238 Ryrie
239 Hollingshead
240 Phillippo
241 Giacometti
242 Jowsey
243 Cazereau
244 Seeman
245 Harnetty
246 Graysmark
247 Meere
248 Allerton
249 Bediss
250 Braunthal
251 Coot
252 Hulatt
253 Every
254 Foley
255 Balle
256 Winwood
257 Hookes
258 Poolman
259 Orman
260 Adlington
261 Dadson
262 Marcham
263 Vigurs
264 Gostling
265 Filyukov
266 Vasler
267 Wastall
268 Camilletti
269 Maylam
270 Jeanenet
271 Ashall
272 Gratrix
273 Chesshire
274 Bridson
275 Clines
276 Thebe
277 Burg
278 Cumbers
279 Snalham
280 Carnelley
281 Raffles
282 Viggars
283 Brok
284 Geistmann
285 Scutter
286 Kelsall
287 Degenhardt
288 McKmurrie
289 Swetland
290 Bastock
291 Baunton
292 Drakers
293 Vearncomb
294 Malyan
295 Blodgetts
296 Wingeat
297 Dovey
298 McGinlay
299 Assur
300 Schukraft
301 Shelper
302 Coldman
303 Huggard
304 Corney
305 Springtorpe
306 Gotfrey
307 Cottingham
308 Gudger
309 Bridgnell
310 McCallum
311 Witts
312 Terrazzo
313 Mangin
314 Konzelmann
315 Marsy
316 Gillingwater
317 Glandfield
318 Brumwell
319 Rice
320 Durram
321 Sandwith
322 Frankland
323 Carnson
324 Pacitti
325 Willoughway
326 Leonida
327 Fieller
328 Pallaske
329 Heeps
330 Itzcovichch
331 Hutchin
332 Konrad
333 Castelow
334 Narbett
335 Folca
336 Clynman
337 Battista
338 Bradnam
339 Clayton
340 Newstead
341 Wetherill
342 Wyd
343 Leachman
344 Clayal
345 Connah
346 Gretton
347 Ierland
348 Frogley
349 Lepard
350 Matyushonok
351 Kovelmann
352 Siely
353 Lefeaver
354 Rookledge
355 Wink
356 Derrell
357 Farbrother
358 Maddaford
359 Brayley
360 Stone Fewings
361 Hairon
362 Ree
363 Dohmer
364 Sandford
365 Darley
366 Kirkhouse
367 Srawley
368 Akhurst
369 De Coursey
370 Curnok
371 Grishagin
372 Pohlke
373 Coogan
374 Larkkem
375 Pargeter
376 Keaton
377 Brewerton
378 Outridge
379 Breckin
380 Cawse
381 Diffley
382 Caile
383 Ballston
384 Thatcher
385 Sydney
386 Jahn
387 Stokell
388 Calfe
389 Akker
390 Lethlay
391 Walewski
392 Basill
393 Morrid
394 Ansett
395 Gotfrey
396 Olivazzi
397 Skippon
398 Masarrat
399 Bavage
400 Josum
401 Eschalotte
402 Cawse
403 Larkby
404 Selland
405 Jagiello
406 Lintall
407 Pimblott
408 Winspeare
409 Airton
410 Mithun
411 Crich
412 Banbrook
413 Skellon
414 Shemelt
415 Stithe
416 Jorger
417 Cuss
418 Jovovic
419 Perrinchief
420 Borzoni
421 Brittian
422 Jamblin
423 Shepherd
424 Flintoffe
425 Gavin
426 Fockes
427 Lumsdon
428 McBean
429 Santorini
430 Bather
431 Crack
432 Sedgman
433 Cardenas
434 Fere
435 Horsey
436 Hingeley
437 Fieldhouse
438 Janiak
439 Swannell
440 Esgate
441 Hadcock
442 Geindre
443 Cleland
444 Blissett
445 Livock
446 Borland
447 Kleis
448 Koles
449 Currey
450 Thorneywork
451 Lonsdale
452 Slack
453 Nibley
454 Stainfield
455 Ram
456 Kollasch
457 Delve
458 Ismirnioglou
459 Casserley
460 Hallbird
461 Enos
462 Figurski
463 Caldicott
464 Barff
465 Kennea
466 Meeus
467 Iacovini
468 Hollow
469 Latham
470 Skoggings
471 Simmens
472 Durbyn
473 Hillyatt
474 Ashdown
475 Varty
476 Cleobury
477 Valentine
478 Wolverson
479 Abramchik
480 Mettetal
481 Baytrop
482 Gallatly
483 Christie
484 Rous
485 Henmarsh
486 Nother
487 Scammonden
488 Beaten
489 Scrinage
490 Josselson
491 Pavlitschek
492 Debill
493 Bennellick
494 Piburn
495 Monini
496 Sacchetti
497 Cicchillo
498 Allington
499 Ilsley
500 Python
501 Laguerre
502 Siveyer
503 Hailwood
504 Axelbey
505 Clout
506 Burfitt
507 Pinsent
508 Bischoff
509 Budleigh
510 Sessuns
511 Rutty
512 Corry
513 Bartusek
514 Verlinden
515 Lissett
516 Whimpenny
517 Kissock
518 Parlott
519 Venditti
520 Pavey
521 Dessaur
522 Fieldsend
523 Gerge
524 Melin
525 Boland
526 Gergus
527 Cossar
528 Tift
529 Carlucci
530 Cockings
531 Harty
532 Labbett
533 Deverick
534 Blurton
535 Strephan
536 Burles
537 Dwerryhouse
538 Weetch
539 Brierton
540 Colleton
541 Morsom
542 Jurries
543 Woakes
544 Ladbrook
545 Harrild
546 McBain
547 Fobidge
548 Pellington
549 Palin
550 Dumbleton
551 Messum
552 Yves
553 Alvar
554 Haywood
555 Sucre
556 Gomersal
557 Shilito
558 Voller
559 Dougill
560 Bevis
561 Kemmons
562 Limpricht
563 Kleisle
564 Filip
565 Moneti
566 Gooderridge
567 Culy
568 Vosper
569 Call
570 Freear
571 Kiebes
572 Polack
573 Marder
574 Lowin
575 Lewing
576 Daily
577 de Amaya
578 Matieu
579 Rowett
580 Manske
581 Ingleton
582 Oldknowe
583 Hartzenberg
584 Habron
585 Dodgshun
586 Roadknight
587 Eltune
588 Gallear
589 Stonestreet
590 Clewett
591 Confort
592 Agent
593 Gonnard
594 Malecky
595 Wyleman
596 McCarrison
597 Wasbrough
598 Shepland
599 Lieber
600 Stratten
601 Lantaph
602 Renfield
603 Vampouille
604 McSparran
605 Hargitt
606 Acland
607 Cunnell
608 Rosa
609 Cobbe
610 Yosselevitch
611 Dubble
612 Baudon
613 Vamplers
614 Milliken
615 Lundbeck
616 Kingcott
617 Issakov
618 Liebmann
619 Kattenhorn
620 Gaskins
621 Cornelius
622 Finnes
623 Meegin
624 Joincey
625 Gherardelli
626 Gowanson
627 Canty
628 Raywood
629 Heinsius
630 Wooles
631 Burde
632 Kisar
633 Allso
634 Sindall
635 Hurn
636 Doe
637 Ramsby
638 Gavriel
639 Clohissy
640 Vardey
641 Klimpt
642 Emberson
643 Isaacson
644 Lowther
645 Heyball
646 Woodruff
647 McDonell
648 Porcher
649 Silbermann
650 Cummins
651 Harrower
652 Roland
653 Wadwell
654 Baulch
655 McComb
656 Metcalf
657 Dmitrovic
658 Mylan
659 Jeannin
660 Mossdale
661 Odhams
662 Dignan
663 Heatly
664 Joye
665 Lorrimer
666 Damp
667 Faucett
668 Stilgo
669 Aberhart
670 Duffield
671 Maydwell
672 Du Plantier
673 Gare
674 Braker
675 Spread
676 Diffley
677 Eborall
678 Maddy
679 Nano
680 Salzen
681 Keerl
682 Bazoge
683 Deathridge
684 Geillier
685 Thiolier
686 Ausher
687 Laidel
688 Deeth
689 Willatt
690 Hinkensen
691 De Lacey
692 Cuddehay
693 Longland
694 Marde
695 Dungay
696 Buxcy
697 Lapides
698 Janaszkiewicz
699 Rizzelli
700 Christley
701 Luff
702 Lappin
703 Colnet
704 Flather
705 Treker
706 Forlong
707 Speddin
708 Melsome
709 Groome
710 Going
711 Enders
712 Rosone
713 Elegood
714 Isakowicz
715 Sieb
716 Sutch
717 Garvill
718 Rothera
719 Ceaplen
720 Hake
721 Babcock
722 Dautry
723 Beels
724 Bernardoux
725 Standen
726 Torricella
727 Gymblett
728 Storks
729 Dashkov
730 Hancell
731 Duhig
732 Scanlan
733 Hodjetts
734 Dunbar
735 Figger
736 Champion
737 Wikey
738 Priddie
739 Sausman
740 Durrand
741 Fridaye
742 Ellerby
743 Liebrecht
744 Kubu
745 Munden
746 Daggett
747 Colenutt
748 Trazzi
749 Coldbreath
750 Abson
751 Prosek
752 Gorelli
753 Lambeth
754 Pennell
755 Turnell
756 Crowch
757 Fossey
758 Helmke
759 Concannon
760 Fawcitt
761 Cumbridge
762 Scadden
763 Pate
764 Fike
765 Magauran
766 Ramsden
767 Hilley
768 Temple
769 Gumly
770 Brizland
771 Laverenz
772 Caney
773 Lahy
774 Tedahl
775 Geraldi
776 Columbine
777 Starbuck
778 Kennedy
779 Imlock
780 Adlem
781 Gotobed
782 Garken
783 Dawdary
784 Gregorace
785 Hogben
786 Paver
787 Branche
788 Hagan
789 McComish
790 Terlinden
791 Manson
792 Remmers
793 Greatex
794 Jackes
795 Mildmott
796 Biasotti
797 Newlands
798 Dewett
799 Bruinemann
800 Guiett
801 Boden
802 Wombwell
803 McGirl
804 Pabel
805 McKechnie
806 Greenough
807 Greenhalf
808 Bunyan
809 Zink
810 Blazic
811 Whitebrook
812 McRorie
813 Devine
814 Wolfenden
815 Dulwich
816 Calder
817 Bolley
818 Brouard
819 Hazeldine
820 Serjeant
821 Parman
822 Vela
823 Monteaux
824 Lune
825 Gaynes
826 Byneth
827 Fick
828 Shevlan
829 Herety
830 Vials
831 Featherbie
832 Whitwell
833 Petrik
834 Benditt
835 Willshaw
836 Brechin
837 Dwelley
838 Wicks
839 Anderl
840 Baldin
841 Webermann
842 Cheney
843 Kernar
844 Balazin
845 Sidry
846 Beecham
847 Sollas
848 Casotti
849 Pairpoint
850 Baggalley
851 Hastelow
852 Rebillard
853 Worsall
854 Falvey
855 Flanne
856 Storres
857 Jerrold
858 Money
859 Klehyn
860 Ridulfo
861 Fleay
862 Phuprate
863 Medlin
864 Outright
865 Bainbridge
866 Kitcat
867 Janek
868 Leech
869 Pavie
870 Hoolaghan
871 Matula
872 Haycock
873 Ungerechts
874 Omar
875 Davoren
876 Impey
877 Maffiotti
878 Pyrke
879 Beininck
880 Pizer
881 Melior
882 Yearnes
883 Rizzotto
884 Pincott
885 Shallcross
886 Marshal
887 Rubinowitsch
888 Pickance
889 Shearn
890 Edgerton
891 Crayker
892 Roebuck
893 Birchenhead
894 Shadrach
895 Sandercock
896 Rispin
897 Portch
898 Ebbens
899 Dransfield
900 Walster
901 Pilsbury
902 Lutzmann
903 Phillipson
904 Aldwick
905 Doyle
906 Starrs
907 Haugg
908 Lamplugh
909 Ketch
910 Arenson
911 Sasser
912 Severwright
913 Killner
914 Kubicka
915 Stanton
916 Jelley
917 Dorward
918 Jessel
919 Borel
920 Sutterfield
921 Treverton
922 Pero
923 Duffy

View File

@ -0,0 +1,953 @@
row_number
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
17
18
19
20
21
22
23
24
25
26
27
28
29
31
32
33
34
36
37
38
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
110
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
183
184
185
186
187
188
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
218
219
220
221
223
224
225
226
227
228
230
231
232
233
234
235
236
237
238
239
240
241
243
244
246
247
248
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
288
289
290
291
292
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
332
333
334
335
336
338
339
340
341
342
343
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
373
375
376
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
527
528
529
530
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
555
556
557
559
560
561
562
563
564
565
566
567
568
569
570
571
572
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
593
594
595
596
597
598
599
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
617
618
619
620
622
623
624
625
626
627
628
629
630
632
633
634
635
636
637
638
639
640
641
642
643
645
646
647
649
650
651
653
654
655
656
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
709
710
711
712
713
714
715
716
717
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
822
823
824
825
826
827
828
829
830
831
832
833
834
835
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
857
858
859
860
861
862
863
864
865
866
867
868
869
870
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
909
910
911
912
913
914
915
916
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1 row_number
2 1
3 2
4 3
5 4
6 5
7 6
8 7
9 8
10 9
11 10
12 11
13 12
14 13
15 14
16 15
17 17
18 18
19 19
20 20
21 21
22 22
23 23
24 24
25 25
26 26
27 27
28 28
29 29
30 31
31 32
32 33
33 34
34 36
35 37
36 38
37 40
38 41
39 42
40 43
41 44
42 45
43 46
44 47
45 48
46 49
47 50
48 51
49 52
50 53
51 54
52 55
53 56
54 57
55 58
56 59
57 60
58 61
59 62
60 63
61 64
62 65
63 66
64 67
65 68
66 69
67 70
68 71
69 72
70 73
71 74
72 75
73 76
74 77
75 78
76 79
77 80
78 81
79 82
80 83
81 84
82 85
83 86
84 87
85 88
86 89
87 90
88 91
89 92
90 93
91 94
92 95
93 96
94 97
95 98
96 99
97 100
98 101
99 102
100 103
101 104
102 105
103 106
104 107
105 108
106 110
107 112
108 113
109 114
110 115
111 116
112 117
113 118
114 119
115 120
116 121
117 122
118 123
119 124
120 125
121 126
122 127
123 128
124 129
125 130
126 131
127 132
128 133
129 134
130 135
131 136
132 137
133 138
134 139
135 140
136 141
137 142
138 143
139 144
140 145
141 146
142 147
143 148
144 149
145 150
146 151
147 152
148 153
149 154
150 155
151 156
152 157
153 158
154 159
155 160
156 161
157 162
158 163
159 164
160 165
161 166
162 167
163 168
164 169
165 170
166 171
167 172
168 173
169 174
170 175
171 176
172 177
173 178
174 179
175 180
176 181
177 183
178 184
179 185
180 186
181 187
182 188
183 190
184 191
185 192
186 193
187 194
188 195
189 196
190 197
191 198
192 199
193 200
194 201
195 202
196 203
197 204
198 205
199 206
200 207
201 208
202 209
203 210
204 211
205 212
206 213
207 214
208 215
209 216
210 218
211 219
212 220
213 221
214 223
215 224
216 225
217 226
218 227
219 228
220 230
221 231
222 232
223 233
224 234
225 235
226 236
227 237
228 238
229 239
230 240
231 241
232 243
233 244
234 246
235 247
236 248
237 250
238 251
239 252
240 253
241 254
242 255
243 256
244 257
245 258
246 259
247 260
248 261
249 262
250 263
251 264
252 265
253 266
254 267
255 268
256 269
257 270
258 271
259 272
260 273
261 274
262 275
263 276
264 277
265 278
266 279
267 280
268 281
269 282
270 283
271 284
272 285
273 286
274 288
275 289
276 290
277 291
278 292
279 294
280 295
281 296
282 297
283 298
284 299
285 300
286 301
287 302
288 303
289 304
290 305
291 306
292 307
293 308
294 309
295 310
296 311
297 312
298 313
299 314
300 315
301 316
302 317
303 318
304 319
305 320
306 321
307 322
308 323
309 324
310 325
311 326
312 327
313 328
314 329
315 330
316 332
317 333
318 334
319 335
320 336
321 338
322 339
323 340
324 341
325 342
326 343
327 345
328 346
329 347
330 348
331 349
332 350
333 351
334 352
335 353
336 354
337 355
338 356
339 357
340 358
341 359
342 360
343 361
344 362
345 363
346 364
347 365
348 366
349 367
350 368
351 369
352 370
353 371
354 373
355 375
356 376
357 378
358 379
359 380
360 381
361 382
362 383
363 384
364 385
365 386
366 387
367 388
368 389
369 390
370 391
371 392
372 393
373 394
374 395
375 396
376 397
377 398
378 399
379 400
380 401
381 402
382 403
383 404
384 405
385 406
386 407
387 408
388 409
389 410
390 411
391 412
392 413
393 414
394 415
395 416
396 417
397 418
398 419
399 420
400 421
401 422
402 423
403 424
404 425
405 426
406 427
407 428
408 429
409 430
410 431
411 432
412 433
413 434
414 435
415 436
416 437
417 438
418 439
419 440
420 441
421 442
422 443
423 444
424 445
425 446
426 447
427 448
428 449
429 450
430 451
431 452
432 453
433 454
434 455
435 456
436 457
437 458
438 459
439 460
440 461
441 462
442 463
443 464
444 465
445 466
446 468
447 469
448 470
449 471
450 472
451 473
452 474
453 475
454 476
455 477
456 478
457 479
458 480
459 481
460 482
461 483
462 484
463 485
464 486
465 487
466 488
467 489
468 490
469 491
470 492
471 494
472 495
473 496
474 497
475 498
476 499
477 500
478 501
479 502
480 503
481 504
482 505
483 506
484 507
485 508
486 509
487 510
488 511
489 512
490 513
491 514
492 515
493 516
494 517
495 518
496 519
497 520
498 521
499 522
500 523
501 524
502 525
503 527
504 528
505 529
506 530
507 532
508 533
509 534
510 535
511 536
512 537
513 538
514 539
515 540
516 541
517 542
518 543
519 544
520 545
521 546
522 547
523 548
524 549
525 550
526 551
527 552
528 553
529 555
530 556
531 557
532 559
533 560
534 561
535 562
536 563
537 564
538 565
539 566
540 567
541 568
542 569
543 570
544 571
545 572
546 574
547 575
548 576
549 577
550 578
551 579
552 580
553 581
554 582
555 583
556 584
557 585
558 586
559 587
560 588
561 589
562 590
563 591
564 593
565 594
566 595
567 596
568 597
569 598
570 599
571 601
572 602
573 603
574 604
575 605
576 606
577 607
578 608
579 609
580 610
581 611
582 612
583 613
584 614
585 615
586 617
587 618
588 619
589 620
590 622
591 623
592 624
593 625
594 626
595 627
596 628
597 629
598 630
599 632
600 633
601 634
602 635
603 636
604 637
605 638
606 639
607 640
608 641
609 642
610 643
611 645
612 646
613 647
614 649
615 650
616 651
617 653
618 654
619 655
620 656
621 658
622 659
623 660
624 661
625 662
626 663
627 664
628 665
629 666
630 667
631 668
632 669
633 670
634 671
635 672
636 673
637 674
638 675
639 676
640 677
641 678
642 679
643 680
644 681
645 682
646 683
647 684
648 685
649 686
650 687
651 688
652 689
653 690
654 691
655 692
656 693
657 694
658 695
659 696
660 697
661 698
662 699
663 700
664 701
665 702
666 703
667 704
668 705
669 706
670 707
671 709
672 710
673 711
674 712
675 713
676 714
677 715
678 716
679 717
680 719
681 720
682 721
683 722
684 723
685 724
686 725
687 726
688 727
689 728
690 729
691 730
692 731
693 732
694 733
695 734
696 735
697 736
698 737
699 738
700 739
701 740
702 741
703 742
704 743
705 744
706 745
707 746
708 747
709 748
710 749
711 750
712 751
713 752
714 753
715 754
716 757
717 758
718 759
719 760
720 761
721 762
722 763
723 764
724 765
725 766
726 767
727 768
728 769
729 770
730 771
731 772
732 773
733 774
734 775
735 776
736 777
737 778
738 779
739 780
740 781
741 782
742 783
743 784
744 785
745 786
746 787
747 788
748 789
749 790
750 791
751 792
752 793
753 794
754 795
755 796
756 797
757 798
758 799
759 800
760 801
761 802
762 803
763 804
764 805
765 806
766 807
767 808
768 809
769 810
770 811
771 812
772 813
773 814
774 815
775 816
776 817
777 818
778 819
779 820
780 822
781 823
782 824
783 825
784 826
785 827
786 828
787 829
788 830
789 831
790 832
791 833
792 834
793 835
794 837
795 838
796 839
797 840
798 841
799 842
800 843
801 844
802 845
803 846
804 847
805 848
806 849
807 850
808 851
809 852
810 853
811 854
812 855
813 857
814 858
815 859
816 860
817 861
818 862
819 863
820 864
821 865
822 866
823 867
824 868
825 869
826 870
827 872
828 873
829 874
830 875
831 876
832 877
833 878
834 879
835 880
836 881
837 882
838 883
839 884
840 885
841 886
842 887
843 888
844 889
845 890
846 891
847 892
848 893
849 894
850 895
851 896
852 897
853 898
854 899
855 900
856 901
857 902
858 903
859 904
860 905
861 906
862 907
863 909
864 910
865 911
866 912
867 913
868 914
869 915
870 916
871 918
872 919
873 920
874 921
875 922
876 923
877 924
878 925
879 926
880 927
881 928
882 929
883 930
884 931
885 932
886 933
887 934
888 935
889 936
890 937
891 938
892 939
893 940
894 941
895 942
896 943
897 944
898 945
899 946
900 947
901 948
902 949
903 950
904 951
905 952
906 953
907 954
908 955
909 956
910 957
911 958
912 959
913 960
914 961
915 962
916 963
917 964
918 965
919 966
920 967
921 968
922 969
923 970
924 971
925 972
926 973
927 974
928 975
929 976
930 977
931 978
932 979
933 980
934 981
935 982
936 983
937 984
938 985
939 986
940 987
941 988
942 989
943 990
944 991
945 992
946 993
947 994
948 995
949 996
950 997
951 998
952 999
953 1000

File diff suppressed because it is too large Load Diff

1001
PostgreSQL/.csv/urls.csv Normal file

File diff suppressed because it is too large Load Diff

1001
PostgreSQL/.csv/words.csv Normal file

File diff suppressed because it is too large Load Diff

View File

@ -3,5 +3,4 @@ FROM postgres:17
WORKDIR /db
# postgresql will execute the files in that folder after build
COPY tables/tables.sql /docker-entrypoint-initdb.d/
COPY build/* /docker-entrypoint-initdb.d/

30
PostgreSQL/Makefile Normal file
View File

@ -0,0 +1,30 @@
DIR_SRC = src
DIR_BUILD = build
BIN = 00_drop.sql 01_create.sql 02_insert.sql \
03_select.sql 04_update.sql
all: $(BIN)
generate_data:
python generate_data.py
rm .data/*.data
00_drop.sql:
cp $(DIR_SRC)/drop.sql $(DIR_BUILD)/$@
01_create.sql:
cp $(DIR_SRC)/create.sql $(DIR_BUILD)/$@
02_insert.sql:
cp $(DIR_SRC)/insert.sql $(DIR_BUILD)/$@
03_select.sql:
cp $(DIR_SRC)/select.sql $(DIR_BUILD)/$@
04_update.sql:
cp $(DIR_SRC)/update.sql $(DIR_BUILD)/$@
clean:
rm -f $(DIR_BUILD)/* .data/*.data

633
PostgreSQL/generate_data.py Normal file
View File

@ -0,0 +1,633 @@
###############################################################################
#
# PYTHON SCRIPT TO RANDOMLY GENERATE DATA
# STEPS :
# 1 --> Generate a line of a table.
# 2 --> Generate an entire table.
# 3 --> Resolve the issues of dependencies and others.
# 4 --> Convert the created tables to the PostgreSQL code.
# Bonus --> Enjoy !
#
###############################################################################
import os
import random
import csv
###############################################################################
#
# HERE IS ALL THE RAW DATA
#
# It is just csv files with for each a single column.
#
###############################################################################
pathIntegers : str = ".csv/row_numbers.csv"
pathSentences : str = ".csv/sentences.csv"
pathUrls : str = ".csv/urls.csv"
pathWords : str = ".csv/words.csv"
pathNames : str = ".csv/names.csv"
pathNameModels : str = ".csv/name_models.csv"
pathDates : str = ".csv/dates.csv"
pathColors : str = ".csv/colors.csv"
pathBrands : str = ".csv/brands.csv"
###############################################################################
#
# TO KNOW WHICH NUMBER IS USED FOR A PRIMARY KEY
#
###############################################################################
def initialize_dict_primary_key(pathFile : str) -> dict:
"""
:param pathFile: merely is `pathIntegers`.
"""
d : dict = {}
with open(pathFile, 'r') as toto:
csvList = list(csv.reader(toto))
for element in csvList[1:]:
d[int(element[0])] = 0
return d
###############################################################################
# id_truc = { X (int) : 1 or 0 } 1 for used, 0 for not.
idMembreDict : dict = initialize_dict_primary_key(pathIntegers)
idBoiteDict : dict = initialize_dict_primary_key(pathIntegers)
idCouleurDict : dict = initialize_dict_primary_key(pathIntegers)
idFilDict : dict = initialize_dict_primary_key(pathIntegers)
idFormeDict : dict = initialize_dict_primary_key(pathIntegers)
idIllustrDict : dict = initialize_dict_primary_key(pathIntegers)
idMarqueDict : dict = initialize_dict_primary_key(pathIntegers)
idMessageDict : dict = initialize_dict_primary_key(pathIntegers)
idModeleDict : dict = initialize_dict_primary_key(pathIntegers)
idMotifDict : dict = initialize_dict_primary_key(pathIntegers)
idPieceDict : dict = initialize_dict_primary_key(pathIntegers)
idPieceCompDict : dict = initialize_dict_primary_key(pathIntegers)
idTagDict : dict = initialize_dict_primary_key(pathIntegers)
###############################################################################
#
# STEP 1 : GENERATE A LINE OF A TABLE
#
###############################################################################
def give_used_key(idDict : dict) -> str:
"""
:param idDict: idTructDict.
:return: a key X that is used i.e idTrucDict[X] == 1
"""
dictUsed : dict = { k: v for k, v in idDict.items() if v == 1 }
keysUsed : list = list(dictUsed.keys())
length : int = len(keysUsed)
# If the associated table has no instances yet.
if length == 0:
return ''
randomKey : int = keysUsed[random.randrange(length)]
return str(randomKey)
###############################################################################
def give_not_used_key(idDict : dict) -> str:
"""
:param idDict: idTructDict.
:return: a key X that is not used i.e idTrucDict[X] == 0
It updates the dict : 0 --> 1.
"""
dictNotUsed : dict = { k: v for k, v in idDict.items() if v == 0 }
keysNotUsed : list = list(dictNotUsed.keys())
# If the associated table has no instances yet.
if len(keysNotUsed) == 0:
return ''
randomKey : int = random.choice(keysNotUsed)
idDict[randomKey] = 1
return str(randomKey)
###############################################################################
#
# USED FOR NOT PRIMARY KEY VARIABLES
#
###############################################################################
def random_element(pathFile : str) -> str:
"""
:param pathFile: the relative path of the csv file to read.
:return: a random element from this file.
"""
with open(pathFile, 'r') as file:
csvList : list = list(csv.reader(file))
random_index_line : int = random.randint(1, len(csvList) - 1)
return "" if ( csvList[random_index_line] == [] ) \
else csvList[random_index_line][0]
###############################################################################
def construct_line(*args : tuple) -> str:
"""
:param *args: a tuple of elements.
example : [ "1", "'toto'", "'Lorem PIPsum'", "42" ].
:return: a line to give to the sql.
example : "(1, 'toto', 'Lorem PIPsum', 42)".
"""
return "(" + ', '.join(list(args)) + ")"
###############################################################################
def generate_line_acheter(idMembre : str, idPiece : str,
quantite : str) -> str:
return construct_line(idMembre, idPiece, quantite)
def generate_line_avoir_motif(idPiece : str, idMotif : str) -> str:
return construct_line(idPiece, idMotif)
def generate_line_avoir_tag(idTag : str, idBoite : str) -> str:
return construct_line(idTag, idBoite)
def generate_line_boites(idMarque : str) -> str:
idBoite : str = give_not_used_key(idBoiteDict)
titre : str = "\'" + random_element(pathWords) + "\'"
dateBoite : str = "\'" + random_element(pathDates) + "\'"
return construct_line(idBoite, titre, dateBoite, idMarque)
def generate_line_colorer(idPiece : str, idCouleur : str) -> str:
return construct_line(idPiece, idCouleur)
def generate_line_construire(idBoite : str, idModele : str) -> str:
return construct_line(idBoite, idModele)
def generate_line_contenir(idBoite : str, idPiece : str,
quantite : str) -> str:
return construct_line(idBoite, idPiece, quantite)
def generate_line_couleurs() -> str:
idCouleur : str = give_not_used_key(idCouleurDict)
nomCouleur : str = "\'" + random_element(pathColors) + "\'"
return construct_line(idCouleur, nomCouleur)
def generate_line_enregistrer(idBoite : str, idMembre : str,
quantite : str) -> str:
return construct_line(idBoite, idMembre, quantite)
def generate_line_etre(idPiece : str, idMarque : str) -> str:
return construct_line(idPiece, idMarque)
def generate_line_etre_complexe(idPiece : str, idPieceComp : str) -> str:
return construct_line(idPiece, idPieceComp)
def generate_line_etre_forme(idForme : str, idPiece : str) -> str:
return construct_line(idForme, idPiece)
def generate_line_fils(idModele : str) -> str:
idFil : str = give_not_used_key(idFilDict)
return construct_line(idFil, idModele)
def generate_line_illustrations(idModele : str) -> str:
idIllustr : str = give_not_used_key(idIllustrDict)
urlIllustr : str = "\'" + random_element(pathUrls) + "\'"
return construct_line(idIllustr, urlIllustr, idModele)
def generate_line_marques() -> str:
idMarque : str = give_not_used_key(idMarqueDict)
nomMarque : str = "\'" + random_element(pathBrands) + "\'"
return construct_line(idMarque, nomMarque)
def generate_line_membres() -> str:
idMembre : str = give_not_used_key(idMembreDict)
nomMembre : str = "\'" + random_element(pathNames) + "\'"
return construct_line(idMembre, nomMembre)
def generate_line_messages(idMembre : str, idFil : str,
idMessage2 : str) -> str:
idMessage : str = give_not_used_key(idMessageDict)
contenu : str = "\'" + random_element(pathSentences) + "\'"
# When the first message is declared.
if idMessage2 == '':
idMessage2 = idMessage
return construct_line(idMessage, contenu, idMembre, idFil, \
idMessage2)
def generate_line_modeles(idMembre : str, idModeleEte : str) -> str:
idModele : str = give_not_used_key(idModeleDict)
nomModele : str = "\'" + random_element(pathNameModels) + "\'"
urlNotice : str = "\'" + random_element(pathUrls) + "\'"
# When the first modele is declared.
if idModeleEte == '':
idModeleEte = idModele
return construct_line(idModele, nomModele, urlNotice, idMembre, \
idModeleEte)
def generate_line_necessiter(idModele : str, idPiece : str,
quantite : str) -> str:
return construct_line(idModele, idPiece, quantite)
def generate_line_noter(idModele : str, idMembre : str) -> str:
note : str = "\'" + random_element(pathSentences) + "\'"
return construct_line(idModele, idMembre, note)
def generate_line_perdre(idMembre : str, idBoite : str,
idPiece : str, quantite : str) -> str:
return construct_line(idMembre, idBoite, idPiece, quantite)
def generate_line_tags() -> str:
idTag : str = give_not_used_key(idTagDict)
nomTag : str = "\'" + random_element(pathWords) + "\'"
return construct_line(idTag, nomTag)
def generate_line_varier(idModele_1 : str, idModele_et : str) -> str:
return construct_line(idModele_1, idModele_et)
def generate_line_formes() -> str:
idForme : str = give_not_used_key(idFormeDict)
nomForme : str = "\'" + random_element(pathWords) + "\'"
return construct_line(idForme, nomForme)
def generate_line_motifs() -> str:
idMotif : str = give_not_used_key(idMotifDict)
nomMotif : str = "\'" + random_element(pathWords) + "\'"
return construct_line(idMotif, nomMotif)
def generate_line_pieces() -> str:
idPiece : str = give_not_used_key(idPieceDict)
return construct_line(idPiece)
def generate_line_pieces_complexes() -> str:
idPieceCo : str = give_not_used_key(idPieceCompDict)
return construct_line(idPieceCo)
###############################################################################
#
# STEP 2 : GENERATE AN ENTIRE TABLE
#
# It is temporarily stored in a file with the extension .data
#
###############################################################################
def store_a_line_in_table(pathFile : str, funcGenerationLine) -> None:
"""
:param pathFile: the relative path where we want to store the table.
:param funcGenerationLine: the function generate_line_* for the table.
Write the line of the table in a .data file.
"""
with open(pathFile, 'a+') as file: # w+ : if does not exist.
file.write(funcGenerationLine() + ",\n")
###############################################################################
def store_table(nbElements : int, nameTable : str, funcGenerationLine) -> None:
"""
:param nbElements: the number of instances we want to get.
:param nameTable: from `dictTables.keys()`.
:param funcGenerationLine: the function generate_line_* for the table.
"""
for i in range(nbElements):
store_a_line_in_table(give_path_file(nameTable), funcGenerationLine)
###############################################################################
def generate_table(nbElements : int, nameTable : str, funcGen) -> None:
for i in range(nbElements):
store_table(1, nameTable, funcGen)
###############################################################################
def generate_table_using_quantite(nbElements : int, nameTable : str,
funcGen) -> None:
# total : int = nbElements
# for i in range(nbElements):
# quantite : int = random.randint(0, int(total / 10)) if i < nbElements \
# else total
# total = total - quantite
# funcGen_2 = lambda : funcGen(
# str(quantite)
# )
# store_table(1, nameTable, funcGen_2)
for i in range(nbElements):
quantite : int = random.randint(0, nbElements)
funcGen_2 = lambda : funcGen( str(quantite) )
store_table(1, nameTable, funcGen_2)
###############################################################################
#
# STEP 3 : RESOLVE THE ISSUES OF DEPENDENCIES AND OTHERS
#
# Just edits the .data files.
#
###############################################################################
def remove_duplicata(pathFile : str) -> None:
"""
:param pathFile: a .data file.
"""
lines_seen = set() # holds lines already seen.
outfile = open("temp.data", "w")
for line in open(pathFile, "r"):
if line not in lines_seen: # not a duplicate.
outfile.write(line)
lines_seen.add(line)
outfile.close()
os.rename("temp.data", pathFile)
###############################################################################
#
# STEP 4 : CONVERSION TO PostgreSQL
#
###############################################################################
def convert_table_to_sql(pathFile : str, nameTable : str) -> None:
"""
:param pathFile: the relative path to the .data file
which contains the table.
:param nameTable: the name of the table.
Write the code in append mode to the file called `insert.sql`.
"""
fileSql = open("src/insert.sql", 'a') # append mode.
fileSql.write("INSERT INTO " + nameTable + " VALUES\n")
if os.path.exists(pathFile):
with open(pathFile, 'r') as fileData:
fileSql.writelines(fileData.readlines())
fileSql.close()
# Replace last ',' by ';'.
with open("src/insert.sql", 'rb+') as fileSql:
fileSql.seek(-2, 2)
fileSql.truncate()
with open("src/insert.sql", 'a') as fileSql:
fileSql.write(";\n")
fileSql.write("\n")
###############################################################################
tablesDict : dict = {
"membres" : generate_line_membres,
"couleurs" : generate_line_couleurs,
"marques" : generate_line_marques,
"tags" : generate_line_tags,
"formes" : generate_line_formes,
"motifs" : generate_line_motifs,
"pieces" : generate_line_pieces,
"pieces_complexes" : generate_line_pieces_complexes,
"modeles" : generate_line_modeles,
"boites" : generate_line_boites,
"fils" : generate_line_fils,
"messages" : generate_line_messages,
"illustrations" : generate_line_illustrations,
"acheter" : generate_line_acheter,
"avoir_motif" : generate_line_avoir_motif,
"avoir_tag" : generate_line_avoir_tag,
"colorer" : generate_line_colorer,
"construire" : generate_line_construire,
"contenir" : generate_line_contenir,
"enregistrer" : generate_line_enregistrer,
"etre" : generate_line_etre,
"etre_complexe" : generate_line_etre_complexe,
"etre_forme" : generate_line_etre_forme,
"necessiter" : generate_line_necessiter,
"noter" : generate_line_noter,
"perdre" : generate_line_perdre,
"varier" : generate_line_varier
}
###############################################################################
def give_path_file(nameTable : str) -> str:
repertory : str = ".data/"
return repertory + nameTable + ".data"
###############################################################################
if __name__ == '__main__':
###########################################################################
#
# The tables that have no foreign keys.
#
###########################################################################
nbMembres : int = 101
store_table(nbMembres, "membres", tablesDict["membres"])
nbCouleurs : int = 21
store_table(nbCouleurs, "couleurs", tablesDict["couleurs"])
nbMarques : int = 10
store_table(nbMarques, "marques", tablesDict["marques"])
nbTags : int = 69
store_table(nbTags, "tags", tablesDict["tags"])
nbFormes : int = 69
store_table(nbFormes, "formes", tablesDict["formes"])
nbMotifs : int = 100
store_table(nbMotifs, "motifs", tablesDict["motifs"])
nbPieces : int = 750
store_table(nbPieces, "pieces", tablesDict["pieces"])
nbPiecesComp : int = 250
store_table(nbPiecesComp, "pieces_complexes",
tablesDict["pieces_complexes"])
###########################################################################
#
# The tables that are needed for the verb tables.
#
###########################################################################
nbModeles : int = 10
funcGen = lambda : tablesDict["modeles"](
give_used_key(idMembreDict),
give_used_key(idModeleDict)
)
generate_table(nbModeles, "modeles", funcGen)
nbBoites : int = 20
funcGen = lambda : tablesDict["boites"](
give_used_key(idMarqueDict)
)
generate_table(nbBoites, "boites", funcGen)
nbFils : int = 100
funcGen = lambda : tablesDict["fils"](
give_used_key(idModeleDict)
)
generate_table(nbFils, "fils", funcGen)
nbMessages : int = 300
funcGen = lambda : tablesDict["messages"](
give_used_key(idMembreDict),
give_used_key(idFilDict),
give_used_key(idMessageDict)
)
generate_table(nbMessages, "messages", funcGen)
nbIllustrations : int = nbModeles
funcGen = lambda : tablesDict["illustrations"](
give_used_key(idModeleDict)
)
generate_table(nbIllustrations, "illustrations", funcGen)
###########################################################################
#
# The verb tables.
#
###########################################################################
nbAcheter : int = nbMembres if nbMembres < nbPieces else nbPieces
funcGen = lambda x: tablesDict["acheter"](
give_used_key(idMembreDict),
give_used_key(idPieceDict),
x
)
generate_table_using_quantite(nbAcheter, "acheter", funcGen)
nbAvoirMotif : int = nbPieces if nbPieces < nbMotifs else nbMotifs
funcGen = lambda : tablesDict["avoir_motif"](
give_used_key(idPieceDict),
give_used_key(idMotifDict)
)
generate_table(nbAvoirMotif, "avoir_motif", funcGen)
nbAvoirTag : int = nbTags if nbTags < nbBoites else nbBoites
funcGen = lambda : tablesDict["avoir_tag"](
give_used_key(idTagDict),
give_used_key(idBoiteDict)
)
generate_table(nbAvoirTag, "avoir_tag", funcGen)
nbColorer : int = nbPieces if nbPieces < nbCouleurs else nbCouleurs
funcGen = lambda : tablesDict["colorer"](
give_used_key(idPieceDict),
give_used_key(idCouleurDict)
)
generate_table(nbColorer, "colorer", funcGen)
nbConstruire : int = nbBoites if nbBoites < nbModeles else nbModeles
funcGen = lambda : tablesDict["construire"](
give_used_key(idBoiteDict),
give_used_key(idModeleDict)
)
generate_table(nbConstruire, "construire", funcGen)
nbContenir : int = nbBoites if nbBoites < nbPieces else nbPieces
funcGen = lambda x: tablesDict["contenir"](
give_used_key(idBoiteDict),
give_used_key(idPieceDict),
x
)
generate_table_using_quantite(nbContenir, "contenir", funcGen)
nbEnregistrer : int = nbBoites if nbBoites < nbMembres else nbMembres
funcGen = lambda x: tablesDict["enregistrer"](
give_used_key(idBoiteDict),
give_used_key(idMembreDict),
x
)
generate_table_using_quantite(nbEnregistrer, "enregistrer", funcGen)
nbEtre : int = nbPieces - int(nbPieces / 4)
funcGen = lambda : tablesDict["etre"](
give_used_key(idPieceDict),
give_used_key(idMarqueDict)
)
generate_table(nbEtre, "etre", funcGen)
nbEtreComp : int = nbPieces - nbEtre
funcGen = lambda : tablesDict["etre_complexe"](
give_used_key(idPieceDict),
give_used_key(idPieceCompDict)
)
generate_table(nbEtreComp, "etre_complexe", funcGen)
nbEtreForme : int = nbPieces
funcGen = lambda : tablesDict["etre_forme"](
give_used_key(idFormeDict),
give_used_key(idPieceDict)
)
generate_table(nbEtreForme, "etre_forme", funcGen)
nbNecessiter : int = nbModeles if nbModeles < nbPieces else nbPieces
funcGen = lambda x: tablesDict["necessiter"](
give_used_key(idModeleDict),
give_used_key(idPieceDict),
x
)
generate_table_using_quantite(nbNecessiter, "necessiter", funcGen)
nbNoter : int = nbModeles if nbModeles < nbMembres else nbMembres
funcGen = lambda : tablesDict["noter"](
give_used_key(idModeleDict),
give_used_key(idMembreDict)
)
generate_table(nbNoter, "noter", funcGen)
nbPerdre : int = nbPieces
funcGen = lambda x: tablesDict["perdre"](
give_used_key(idMembreDict),
give_used_key(idBoiteDict),
give_used_key(idPieceDict),
x
)
generate_table_using_quantite(nbPerdre, "perdre", funcGen)
nbVarier : int = nbModeles
funcGen = lambda : tablesDict["varier"](
give_used_key(idModeleDict),
give_used_key(idModeleDict)
)
generate_table(nbVarier, "varier", funcGen)
###########################################################################
#
# To write `insert.sql`.
#
###########################################################################
# Remove duplicatas.
for nameTable in tablesDict:
remove_duplicata(give_path_file(nameTable))
# Writing in `insert.sql`.
fileSql = open("src/insert.sql", 'w+')
fileSql.write("TRUNCATE " + ', '.join(tablesDict) + ";\n")
fileSql.write("\n")
fileSql.close()
with open("src/insert.sql", 'a') as fileSql:
for nameTable in tablesDict:
convert_table_to_sql(give_path_file(nameTable), nameTable)
###############################################################################

View File

@ -4,32 +4,6 @@
-- CREATION Date : 24/10/24
-- ============================================================================
DROP TABLE IF EXISTS acheter CASCADE;
DROP TABLE IF EXISTS avoir_motif CASCADE;
DROP TABLE IF EXISTS boites CASCADE;
DROP TABLE IF EXISTS colorer CASCADE;
DROP TABLE IF EXISTS construire CASCADE;
DROP TABLE IF EXISTS contenir CASCADE;
DROP TABLE IF EXISTS couleurs CASCADE;
DROP TABLE IF EXISTS enregistrer CASCADE;
DROP TABLE IF EXISTS etre CASCADE;
DROP TABLE IF EXISTS etre_complexe CASCADE;
DROP TABLE IF EXISTS etre_forme CASCADE;
DROP TABLE IF EXISTS fils CASCADE;
DROP TABLE IF EXISTS illustrations CASCADE;
DROP TABLE IF EXISTS marques CASCADE;
DROP TABLE IF EXISTS messages CASCADE;
DROP TABLE IF EXISTS modeles CASCADE;
DROP TABLE IF EXISTS necessiter CASCADE;
DROP TABLE IF EXISTS noter CASCADE;
DROP TABLE IF EXISTS perdre CASCADE;
DROP TABLE IF EXISTS varier CASCADE;
DROP TABLE IF EXISTS formes CASCADE;
DROP TABLE IF EXISTS membres CASCADE;
DROP TABLE IF EXISTS motifs CASCADE;
DROP TABLE IF EXISTS pieces CASCADE;
DROP TABLE IF EXISTS pieces_complexes CASCADE;
-- ============================================================================
-- Tables
-- ============================================================================
@ -38,80 +12,88 @@ CREATE TABLE acheter
(
id_membre INTEGER NOT NULL,
id_piece INTEGER NOT NULL,
quantite_acheter INTEGER ,
quantite_acheter INTEGER ,
CONSTRAINT pk__acheter PRIMARY KEY (id_membre, id_piece)
);
CREATE TABLE avoir_motif
(
id_piece INTEGER NOT NULL,
id_motif INTEGER NOT NULL,
id_piece INTEGER ,
id_motif INTEGER ,
CONSTRAINT pk__avoir_motif PRIMARY KEY (id_piece, id_motif)
);
CREATE TABLE avoir_tag
(
id_tag INTEGER ,
id_boite INTEGER ,
CONSTRAINT pk__avoir_tag PRIMARY KEY (id_tag, id_boite)
);
CREATE TABLE boites
(
id_boite SERIAL NOT NULL,
titre_boite varchar(255) NOT NULL,
date_boite DATE ,
id_boite INTEGER NOT NULL,
titre_boite varchar(255) NOT NULL,
date_boite DATE ,
id_marque INTEGER ,
CONSTRAINT pk__boites PRIMARY KEY (id_boite)
);
CREATE TABLE colorer
(
id_piece INTEGER NOT NULL,
id_couleur INTEGER NOT NULL,
id_couleur INTEGER ,
CONSTRAINT pk__colorer PRIMARY KEY (id_piece, id_couleur)
);
CREATE TABLE construire
(
id_boite INTEGER NOT NULL,
id_modele INTEGER NOT NULL,
id_boite INTEGER ,
id_modele INTEGER ,
CONSTRAINT pk__construire PRIMARY KEY (id_boite, id_modele)
);
CREATE TABLE contenir
(
id_boite INTEGER NOT NULL,
id_piece INTEGER NOT NULL,
quantite_contenir INTEGER NOT NULL,
id_boite INTEGER ,
id_piece INTEGER ,
quantite_contenir INTEGER NOT NULL,
CONSTRAINT pk__contenir PRIMARY KEY (id_boite, id_piece)
);
CREATE TABLE couleurs
(
id_couleur SERIAL NOT NULL,
nom_couleur VARCHAR(255) ,
id_couleur INTEGER NOT NULL,
nom_couleur VARCHAR(255) ,
CONSTRAINT pk__couleurs PRIMARY KEY (id_couleur)
);
CREATE TABLE enregistrer
(
id_boite INTEGER NOT NULL,
id_membre INTEGER NOT NULL,
quantite_enregistrer INTEGER NOT NULL,
id_boite INTEGER ,
id_membre INTEGER ,
quantite_enregistrer INTEGER NOT NULL,
CONSTRAINT pk__enregistrer PRIMARY KEY (id_boite, id_membre)
);
CREATE TABLE etre
(
id_piece INTEGER NOT NULL,
id_marque INTEGER NOT NULL,
id_marque INTEGER ,
CONSTRAINT pk__etre PRIMARY KEY (id_piece, id_marque)
);
CREATE TABLE etre_complexe
(
id_piece INTEGER NOT NULL,
id_piece_complexe INTEGER NOT NULL,
id_piece INTEGER NOT NULL,
id_piece_complexe INTEGER NOT NULL,
CONSTRAINT pk__etre_complexe PRIMARY KEY (id_piece, id_piece_complexe)
);
CREATE TABLE etre_forme
(
id_forme INTEGER NOT NULL,
id_piece INTEGER NOT NULL,
id_forme INTEGER NOT NULL,
id_piece INTEGER NOT NULL,
CONSTRAINT pk__etre_forme PRIMARY KEY (id_forme, id_piece)
);
@ -124,102 +106,109 @@ CREATE TABLE fils
CREATE TABLE illustrations
(
id_illustration SERIAL NOT NULL,
url_illustration VARCHAR(2048) ,
id_modele INTEGER NOT NULL,
id_illustration INTEGER NOT NULL,
url_illustration VARCHAR(2048) ,
id_modele INTEGER NOT NULL,
CONSTRAINT pk__illustrations PRIMARY KEY (id_illustration)
);
CREATE TABLE marques
(
id_marque SERIAL NOT NULL,
nom_marque VARCHAR(255) ,
id_marque INTEGER NOT NULL,
nom_marque VARCHAR(255) ,
CONSTRAINT pk__marques PRIMARY KEY (id_marque)
);
CREATE TABLE membres
(
id_membre INTEGER NOT NULL,
nom_membre VARCHAR(255) NOT NULL,
CONSTRAINT pk__membres PRIMARY KEY (id_membre)
);
CREATE TABLE messages
(
id_message SERIAL NOT NULL,
contenu_message VARCHAR(255) ,
id_membre SERIAL NOT NULL,
id_fil SERIAL NOT NULL,
id_message_2 SERIAL NOT NULL,
id_message INTEGER NOT NULL,
contenu_message VARCHAR(255) ,
id_membre INTEGER NOT NULL,
id_fil INTEGER NOT NULL,
id_message_2 INTEGER NOT NULL,
CONSTRAINT pk__messages PRIMARY KEY (id_message)
);
CREATE TABLE modeles
(
id_modele SERIAL NOT NULL,
nom_modele VARCHAR(255) ,
url_notice_modele VARCHAR(2048) ,
id_membre INTEGER NOT NULL,
id_modele_2 INTEGER NOT NULL,
id_modele INTEGER NOT NULL,
nom_modele VARCHAR(255) ,
url_notice_modele VARCHAR(2048) ,
id_membre INTEGER NOT NULL,
id_modele_etendu INTEGER NOT NULL,
CONSTRAINT pk__modeles PRIMARY KEY (id_modele)
);
CREATE TABLE necessiter
(
id_modele INTEGER NOT NULL,
id_modele INTEGER ,
id_piece INTEGER NOT NULL,
quantite_necessiter INTEGER NOT NULL,
quantite_necessiter INTEGER NOT NULL,
CONSTRAINT pk__necessiter PRIMARY KEY (id_modele, id_piece)
);
CREATE TABLE noter
(
id_modele INTEGER NOT NULL,
id_membre INTEGER NOT NULL,
note_noter VARCHAR(255) NOT NULL,
id_modele INTEGER ,
id_membre INTEGER ,
note_noter VARCHAR(255) NOT NULL,
CONSTRAINT pk__noter PRIMARY KEY (id_modele, id_membre)
);
CREATE TABLE perdre
(
id_membre INTEGER NOT NULL,
id_boite INTEGER NOT NULL,
id_membre INTEGER ,
id_boite INTEGER ,
id_piece INTEGER NOT NULL,
quantite_perdre INTEGER NOT NULL,
quantite_perdre INTEGER NOT NULL,
CONSTRAINT pk__perdre PRIMARY KEY (id_membre, id_boite, id_piece)
);
CREATE TABLE tags
(
id_tag INTEGER NOT NULL,
nom_tag VARCHAR(255) ,
CONSTRAINT pk__tags PRIMARY KEY (id_tag)
);
CREATE TABLE varier
(
id_modele INTEGER NOT NULL,
id_modele_2 INTEGER NOT NULL,
CONSTRAINT pk__varier PRIMARY KEY (id_modele, id_modele_2)
id_modele INTEGER ,
id_modele_etendu INTEGER ,
CONSTRAINT pk__varier PRIMARY KEY (id_modele, id_modele_etendu)
);
CREATE TABLE formes
(
id_forme SERIAL NOT NULL,
nom_forme VARCHAR(255) NOT NULL,
id_forme INTEGER NOT NULL,
nom_forme VARCHAR(255) NOT NULL,
CONSTRAINT pk__formes PRIMARY KEY (id_forme)
);
CREATE TABLE membres
(
id_membre SERIAL NOT NULL,
nom_membre VARCHAR(255) NOT NULL,
mdp_membre VARCHAR(255) NOT NULL,
CONSTRAINT pk__membres PRIMARY KEY (id_membre)
);
CREATE TABLE motifs
(
id_motif SERIAL NOT NULL,
nom_motif VARCHAR(255) NOT NULL,
id_motif INTEGER NOT NULL,
nom_motif VARCHAR(255) NOT NULL,
CONSTRAINT pk__motifs PRIMARY KEY (id_motif)
);
CREATE TABLE pieces
(
id_piece SERIAL NOT NULL,
id_piece INTEGER NOT NULL,
CONSTRAINT pk__pieces PRIMARY KEY (id_piece)
);
CREATE TABLE pieces_complexes
(
id_piece_complexe SERIAL NOT NULL,
id_piece_complexe INTEGER NOT NULL,
CONSTRAINT pk__pieces_complexes PRIMARY KEY (id_piece_complexe)
);
@ -243,6 +232,18 @@ ALTER TABLE avoir_motif
ADD CONSTRAINT fk2__avoir_motif FOREIGN KEY (id_motif)
REFERENCES motifs (id_motif);
ALTER TABLE avoir_tag
ADD CONSTRAINT fk1__avoir_tag FOREIGN KEY (id_tag)
REFERENCES tags (id_tag);
ALTER TABLE avoir_tag
ADD CONSTRAINT fk2__avoir_tag FOREIGN KEY (id_boite)
REFERENCES boites (id_boite);
ALTER TABLE boites
ADD CONSTRAINT fk1__boites FOREIGN KEY (id_marque)
REFERENCES marques (id_marque);
ALTER TABLE colorer
ADD CONSTRAINT fk1__colorer FOREIGN KEY (id_piece)
REFERENCES pieces (id_piece);
@ -260,7 +261,11 @@ ALTER TABLE construire
REFERENCES modeles (id_modele);
ALTER TABLE contenir
ADD CONSTRAINT fk2__contenir FOREIGN KEY (id_boite)
ADD CONSTRAINT fk1__contenir FOREIGN KEY (id_boite)
REFERENCES boites (id_boite);
ALTER TABLE contenir
ADD CONSTRAINT fk2__contenir FOREIGN KEY (id_piece)
REFERENCES pieces (id_piece);
ALTER TABLE enregistrer
@ -275,6 +280,10 @@ ALTER TABLE etre
ADD CONSTRAINT fk1__etre FOREIGN KEY (id_piece)
REFERENCES pieces (id_piece);
ALTER TABLE etre
ADD CONSTRAINT fk2__etre FOREIGN KEY (id_marque)
REFERENCES marques (id_marque);
ALTER TABLE etre_complexe
ADD CONSTRAINT fk1__etre_complexe FOREIGN KEY (id_piece)
REFERENCES pieces (id_piece);
@ -300,13 +309,25 @@ ALTER TABLE illustrations
REFERENCES modeles (id_modele);
ALTER TABLE messages
ADD CONSTRAINT fk1__messages FOREIGN KEY (id_fil)
ADD CONSTRAINT fk1__messages FOREIGN KEY (id_membre)
REFERENCES membres (id_membre);
ALTER TABLE messages
ADD CONSTRAINT fk2__messages FOREIGN KEY (id_fil)
REFERENCES fils (id_fil);
ALTER TABLE messages
ADD CONSTRAINT fk2__messages FOREIGN KEY (id_message_2)
ADD CONSTRAINT fk3__messages FOREIGN KEY (id_message_2)
REFERENCES messages (id_message);
ALTER TABLE modeles
ADD CONSTRAINT fk1__modeles FOREIGN KEY (id_membre)
REFERENCES membres (id_membre);
ALTER TABLE modeles
ADD CONSTRAINT fk2__modeles FOREIGN KEY (id_modele_etendu)
REFERENCES modeles (id_modele);
ALTER TABLE necessiter
ADD CONSTRAINT fk1__necessiter FOREIGN KEY (id_modele)
REFERENCES modeles (id_modele);
@ -340,7 +361,7 @@ ALTER TABLE varier
REFERENCES modeles (id_modele);
ALTER TABLE varier
ADD CONSTRAINT fk2__varier FOREIGN KEY (id_modele_2)
ADD CONSTRAINT fk2__varier FOREIGN KEY (id_modele_etendu)
REFERENCES modeles (id_modele);
-- ============================================================================

34
PostgreSQL/src/drop.sql Normal file
View File

@ -0,0 +1,34 @@
-- ============================================================================
-- To drop the tables once created.
-- ============================================================================
DROP TABLE IF EXISTS acheter CASCADE;
DROP TABLE IF EXISTS avoir_motif CASCADE;
DROP TABLE IF EXISTS avoir_tag CASCADE;
DROP TABLE IF EXISTS boites CASCADE;
DROP TABLE IF EXISTS colorer CASCADE;
DROP TABLE IF EXISTS construire CASCADE;
DROP TABLE IF EXISTS contenir CASCADE;
DROP TABLE IF EXISTS couleurs CASCADE;
DROP TABLE IF EXISTS enregistrer CASCADE;
DROP TABLE IF EXISTS etre CASCADE;
DROP TABLE IF EXISTS etre_complexe CASCADE;
DROP TABLE IF EXISTS etre_forme CASCADE;
DROP TABLE IF EXISTS fils CASCADE;
DROP TABLE IF EXISTS illustrations CASCADE;
DROP TABLE IF EXISTS marques CASCADE;
DROP TABLE IF EXISTS membres CASCADE;
DROP TABLE IF EXISTS messages CASCADE;
DROP TABLE IF EXISTS modeles CASCADE;
DROP TABLE IF EXISTS necessiter CASCADE;
DROP TABLE IF EXISTS noter CASCADE;
DROP TABLE IF EXISTS perdre CASCADE;
DROP TABLE IF EXISTS tags CASCADE;
DROP TABLE IF EXISTS varier CASCADE;
DROP TABLE IF EXISTS formes CASCADE;
DROP TABLE IF EXISTS motifs CASCADE;
DROP TABLE IF EXISTS pieces CASCADE;
DROP TABLE IF EXISTS pieces_complexes CASCADE;
-- ============================================================================

4409
PostgreSQL/src/insert.sql Normal file

File diff suppressed because it is too large Load Diff

74
PostgreSQL/src/select.sql Normal file
View File

@ -0,0 +1,74 @@
-- ============================================================================
-- Some requests for the statistics and to consult the database.
-- ============================================================================
-- ============================================================================
-- CONSULTATION
-- ============================================================================
-- Liste des boîtes parues depuis 5 ans.
SELECT boites.titre_boite
FROM boites
WHERE DATE_PART('year', AGE(NOW(), boites.date_boite) < 5;
--Liste des modèles proposés par des fans.
SELECT id_modeles
FROM modeles
WHERE id_membre NOT NULL;
-- Liste des pièces qui apparaissent dans des boîtes de différentes marques.
SELECT id_piece
FROM ( -- couple (piece,marque) d'ou vient les pieces
SELECT DISTINCT id_piece, id_marque FROM contenir
NATURAL JOIN boites
NATURAL JOIN marques
)
GROUP BY id_piece
WHERE COUNT(*) > 1;
-- ============================================================================
-- ============================================================================
-- STATISTIQUES
-- ============================================================================
-- Nombre de piece par boite
CREATE OR REPLACE VIEW nb_piece_par_boite AS
(
SELECT id_boite, SUM(quantite_contenir) as nb_piece
FROM contenir
GROUP BY id_boite
);
-- Le nombre moyen de pièces par boîte.
SELECT AVG(nb_piece)
FROM nb_piece_par_boite
;
-- nombre de modele proposés par membre
CREATE OR REPLACE VIEW nb_modele_par_boite AS
(
SELECT id_membre, COUNT(*) as nb_boite
FROM modeles
GROUP BY id_membre
);
-- La liste des membres qui ont proposé le plus de modèles.
SELECT id_membre, nb_boite
FROM nb_modele_par_boite
ORDER BY nb_boite
DESC
LIMIT 5
;
-- La liste des modèles, classés par note moyenne descendante.
SELECT id_modele, AVG(note_noter) as note_moyenne
FROM noter
GROUP BY id_modele
ORDER BY note_moyenne
DESC
;
-- ============================================================================

351
PostgreSQL/src/update.sql Normal file
View File

@ -0,0 +1,351 @@
-- ============================================================================
-- Those are the requests to update the database.
-- ============================================================================
-- Verifying functions.
CREATE OR REPLACE FUNCTION is_existing_piece(
toadd_id_piece INT
) RETURNS VOID AS $$
BEGIN
IF NOT EXISTS(SELECT 1 FROM etre WHERE id_piece = toadd_id_piece) THEN
RAISE EXCEPTION 'The % piece does not exist.', toadd_id_piece;
RETURN;
END IF;
END; $$
LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION is_existing_marque(
toadd_id_marque INT
) RETURNS VOID AS $$
BEGIN
IF NOT EXISTS(
SELECT 1 FROM marques
WHERE id_marque = toadd_id_marque
)
THEN
RAISE NOTICE 'The % marque does not exist.', toadd_id_marque;
RETURN;
END IF;
END; $$
LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION is_existing_note(
toadd_id_modele INT,
toadd_id_membre INT
) RETURNS VOID AS $$
BEGIN
IF NOT EXISTS(
SELECT 1 FROM noter
WHERE id_modele = toadd_id_modele
AND id_membre = toadd_id_membre
)
THEN
RAISE NOTICE 'The notes does not exist.';
RETURN;
END IF;
END; $$
LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION is_existing_membre(
toadd_id_membre INT
) RETURNS VOID AS $$
BEGIN
IF NOT EXISTS(SELECT 1 FROM membres WHERE id_membre = toadd_id_membre) THEN
RAISE NOTICE 'The % membre does not exist.', toadd_id_membre;
RETURN;
END IF;
END; $$
LANGUAGE plpgsql;
-- To add/remove a piece.
CREATE OR REPLACE FUNCTION add_piece(
toadd_id_piece INT,
toadd_id_couleur INT,
toadd_id_forme INT,
toadd_id_marque INT
) RETURNS VOID AS $$
BEGIN
-- If the piece is already in the database, do nothing.
IF EXISTS(SELECT 1 FROM etre WHERE id_piece = toadd_id_piece) THEN
RAISE NOTICE 'The % piece is already in the db.', toadd_id_piece;
RETURN;
END IF;
INSERT INTO pieces VALUES (toadd_id_piece);
INSERT INTO etre VALUES (toadd_id_piece, toadd_id_marque);
INSERT INTO colorer VALUES (toadd_id_piece, toadd_id_couleur);
INSERT INTO etre_forme VALUES (toadd_id_forme, toadd_id_piece);
END; $$
LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION remove_piece(
torem_id_piece INT
) RETURNS VOID AS $$
BEGIN
-- If the piece does not exist.
SELECT is_existing_piece(torem_id_piece);
-- If the piece is complex.
IF EXISTS(SELECT 1 FROM etre_complexe WHERE id_piece = torem_id_piece) THEN
DELETE FROM piece_complexe WHERE id_piece_complexe IN (
SELECT id_piece_complexe
FROM etre_complexe
WHERE id_piece = torem_id_piece
);
DELETE FROM etre_complexe WHERE id_piece = torem_id_piece;
END IF;
DELETE FROM colorer WHERE id_piece = torem_id_piece;
DELETE FROM avoir_motif WHERE id_piece = torem_id_piece;
DELETE FROM etre_forme WHERE id_piece = torem_id_piece;
DELETE FROM necessiter WHERE id_piece = torem_id_piece;
DELETE FROM acheter WHERE id_piece = torem_id_piece;
DELETE FROM perdre WHERE id_piece = torem_id_piece;
DELETE FROM contenir WHERE id_piece = torem_id_piece;
DELETE FROM etre WHERE id_piece = torem_id_piece;
DELETE FROM pieces WHERE id_piece = torem_id_piece;
RAISE NOTICE '% piece sucessfully removed.', torem_id_piece;
END; $$
LANGUAGE plpgsql;
-- To add a complex piece.
CREATE OR REPLACE FUNCTION add_piece_comp(
toadd_id_piece INT,
toadd_id_piece_comp INT,
toadd_id_couleur INT,
toadd_id_forme INT,
toadd_id_marque INT
) RETURNS VOID AS $$
BEGIN
-- If the piece is already complex.
IF EXISTS(
SELECT 1 FROM etre_complexe
WHERE id_piece_complexe = toadd_id_piece_comp
) THEN
RAISE NOTICE 'The % piece is already in the db.', toadd_id_piece;
RETURN;
END IF;
-- If the piece is already in the database, do nothing.
IF EXISTS(SELECT 1 FROM etre WHERE id_piece = toadd_id_piece) THEN
RAISE NOTICE 'The % piece is already in the db.', toadd_id_piece;
RETURN;
END IF;
INSERT INTO pieces VALUES (toadd_id_piece);
INSERT INTO piece_complexes VALUES (toadd_id_piece_comp);
INSERT INTO etre VALUES (toadd_id_piece, toadd_id_marque);
INSERT INTO etre_complexe VALUES (toadd_id_piece, toadd_id_piece_comp);
INSERT INTO colorer VALUES (toadd_id_piece, toadd_id_couleur);
INSERT INTO etre_forme VALUES (toadd_id_forme, toadd_id_piece);
END; $$
LANGUAGE plpgsql;
-- To add/remove a member.
CREATE OR REPLACE FUNCTION add_membre(
toadd_id_membre INT,
toadd_nom_membre TEXT
) RETURNS VOID AS $$
BEGIN
-- If the member is already in the database, do nothing.
IF EXISTS(SELECT 1 FROM membres WHERE id_membre = toadd_id_membre) THEN
RAISE NOTICE 'The % member is already in the db.', toadd_id_membre;
RETURN;
END IF;
INSERT INTO membres VALUES (toadd_id_membre, toadd_nom_membre);
END; $$
LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION remove_membre(
torem_id_membre INT
) RETURNS VOID AS $$
BEGIN
-- If the membre does not exist.
SELECT is_existing_membre(torem_id_membre);
DELETE FROM acheter WHERE id_membre = torem_id_membre;
DELETE FROM enregister WHERE id_membre = torem_id_membre;
DELETE FROM messages WHERE id_membre = torem_id_membre;
DELETE FROM modeles WHERE id_membre = torem_id_membre;
DELETE FROM noter WHERE id_membre = torem_id_membre;
DELETE FROM perdre WHERE id_membre = torem_id_membre;
DELETE FROM membres WHERE id_membre = torem_id_membre;
RAISE NOTICE '% membre sucessfully removed.', torem_id_membre;
END; $$
LANGUAGE plpgsql;
-- To add/remove messages.
CREATE OR REPLACE FUNCTION add_message(
toadd_id_message INT,
toadd_contenu TEXT,
toadd_id_membre INT,
toadd_id_fil INT,
toadd_id_message_2 INT DEFAULT NULL
) RETURNS VOID AS $$
BEGIN
-- If the message is already in the database, do nothing.
IF EXISTS(SELECT 1 FROM messages WHERE id_message = toadd_id_message) THEN
RAISE NOTICE 'The % message is already in the db.', toadd_id_message;
RETURN;
END IF;
-- To verify if the member exists.
IF NOT EXISTS(SELECT 1 FROM membres WHERE id_membre = toadd_id_membre) THEN
RAISE NOTICE 'The % membre does not exist.', toadd_id_membre;
RETURN;
END IF;
-- To verify if the fil exists.
IF NOT EXISTS(SELECT 1 FROM fils WHERE id_fil = toadd_id_fil) THEN
RAISE NOTICE 'The % fil does not exist.', toadd_id_fil;
RETURN;
END IF;
INSERT INTO messages VALUES (
toadd_id_message,
toadd_contenu,
toadd_id_membre,
toadd_id_fil,
toadd_id_message_2
);
END; $$
LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION remove_message(
torem_id_message INT
) RETURNS VOID AS $$
BEGIN
-- If the message does not exist.
IF NOT EXISTS(
SELECT 1 FROM messages
WHERE id_messages = torem_id_messages
)
THEN
RAISE NOTICE 'The % message does not exist.', torem_id_message;
RETURN;
END IF;
DELETE FROM messages WHERE id_message = torem_id_message;
RAISE NOTICE '% message sucessfully removed.', torem_id_message;
END; $$
LANGUAGE plpgsql;
-- To change the name of a brand.
CREATE OR REPLACE FUNCTION change_brand_name(
toadd_id_marque INT,
toadd_nom_marque TEXT
) RETURNS VOID AS $$
BEGIN
-- If the marque does not exist.
SELECT is_existing_marque(toadd_id_marque);
UPDATE marques
SET nom_marque = toadd_nom_marque
WHERE id_marque = toadd_id_marque;
RAISE NOTICE '% marque sucessfully changed.', toadd_id_marque;
END; $$
LANGUAGE plpgsql;
-- To change a notes.
CREATE OR REPLACE FUNCTION change_note(
toadd_id_modele INT,
toadd_id_membre INT,
toadd_note TEXT
) RETURNS VOID AS $$
BEGIN
-- If the notes do not exist.
SELECT is_existing_note(toadd_id_modele, toadd_id_membre);
UPDATE noter
SET note_noter = toadd_note
WHERE id_modele = toadd_id_modele
AND id_membre = toadd_id_membre;
RAISE NOTICE 'Notes sucessfully changed';
END; $$
LANGUAGE plpgsql;
-- To add the pieces of a set to a member possession.
CREATE OR REPLACE FUNCTION add_pieces_to_member(
toadd_id_membre INT,
toadd_id_boite INT
) RETURNS VOID AS $$
DECLARE
var_id_piece INT;
var_quantite INT;
BEGIN
-- If the membre does not exist.
SELECT is_existing_piece(torem_id_membre);
-- If the piece does not exist.
SELECT is_existing_piece(torem_id_piece);
FOR var_id_piece, var_quantite IN
SELECT id_piece, quantite
FROM contenir
WHERE id_boite = toadd_id_boite
LOOP
IF EXISTS(SELECT 1 FROM acheter
WHERE id_membre = toadd_id_membre
AND id_piece = toadd_id_piece)
THEN
UPDATE acheter
SET quantite = quantite + var_quantite
WHERE id_membre = toadd_id_membre AND id_piece = toadd_id_piece;
ELSE
INSERT INTO acheter VALUES (
toadd_id_membre,
var_id_piece,
var_quantite
);
END IF;
END LOOP;
RAISE NOTICE 'Pieces sucessfully added.';
END; $$
LANGUAGE plpgsql;
-- ============================================================================

View File

@ -2,11 +2,25 @@
On aime les briques
## Sujet
* [Projet: Travail et modalités de rendu Fichier](https://moodle.bordeaux-inp.fr/mod/resource/view.php?id=48191)
* [Sujet : Briques Fichier](https://moodle.bordeaux-inp.fr/mod/resource/view.php?id=132493)
## Generating data
```
cd PostgreSQL/
make generate_data
```
## Dev
To run postgresql server + adminer in dev environnement (assuming you're running the backend manually with node), run :
```
cd free-briques/
make
docker compose -f docker-compose.dev.yml up
```

View File

@ -6,11 +6,12 @@ WORKDIR /usr/src/back
# Copy sources
COPY . .
COPY .env.production .env
# install deps, and pm2 to run the app
RUN npm install
RUN npm install -g pm2
# RUN npm install -g pm2
COPY .env.production .env
# Compilation des fichiers TypeScript
RUN npm run build
@ -23,4 +24,5 @@ RUN chmod -R u=rwx,g=,o= ./
EXPOSE 3000
# Start app
CMD ["pm2", "start", "dist/app.js", "--no-daemon"]
CMD ["npm", "run", "startonly"]
# CMD ["pm2", "start", "dist/app.js", "--no-daemon"]

View File

@ -4,8 +4,8 @@
"main": "dist/app.js",
"scripts": {
"startonly": "node dist/app.js",
"start": "tsc && node dist/app.js",
"build": "tsc && cp -r src/templates dist",
"start": "npm run build && node dist/app.js",
"build": "tsc && cp -r src/templates dist && cp -r src/static dist",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],

View File

@ -12,7 +12,7 @@ const app = express();
const port = process.env.PORT ?? 3000;
const log_format = (process.env.NODE_ENV === "dev") ? "dev": "combined";
const log_format = (process.env.NODE_ENV === "dev") ? "dev" : "combined";
console.log("=== LOG CONFIG ===");
console.log(`log format: ${log_format}`);
console.log("=== END LOG CONFIG ===");
@ -30,5 +30,5 @@ app.use(morgan(log_format));
app.use(routes);
app.listen(port, () => {
return console.log(`Briques is listening at http://localhost:${port}`);
return console.log(`Briques is listening at http://localhost:${port}`);
});

View File

@ -3,69 +3,69 @@ import bcrypt from 'bcrypt';
import { SignJWT } from 'jose';
import { JWT_ISSUER, JWT_AUDIENCE, JWT_SECRET, JWT_EXPIRATION, JWT_SECRET_KEY } from '../config/auth.config';
import { Member, User } from '../types/member';
import { getMember, createMember, userAdapter } from './member.controller';
import memberService from '../services/member.service';
import { Either, eitherLeft, eitherRight } from '../utils/utils';
const register = (req: Request, res: Response) => {
if (!req || !req.body || !req.body.name || !req.body.password) {
res.status(400).send();
return;
if (!req || !req.body || !req.body.name || !req.body.password) {
res.status(400).send();
return;
}
const name: string = req.body.name;
bcrypt.genSalt(10, (err, salt) => {
if (err) {
res.status(500).send();
return;
}
const name: string = req.body.name;
bcrypt.genSalt(10, (err, salt) => {
if (err) {
res.status(500).send();
return;
}
bcrypt.hash(req.body.password, salt, async (err, hash) => {
if (err) {
res.status(500).send();
return;
}
const member: Either<Member, string> = await createMember(name, hash);
if (member.hasRight) {
res.status(401).send(member.right);
return;
}
const token = await new SignJWT({ name })
.setProtectedHeader({ alg: 'HS256' })
.setAudience(JWT_AUDIENCE)
.setIssuer(JWT_ISSUER)
.setExpirationTime(JWT_EXPIRATION)
.sign(JWT_SECRET_KEY);
res.status(200).send({ member: userAdapter(member.left), token: token});
});
bcrypt.hash(req.body.password, salt, async (err, hash) => {
if (err) {
res.status(500).send();
return;
}
const member: Either<Member, string> = await memberService.createMember(name, hash);
if (member.hasRight) {
res.status(401).send(member.right);
return;
}
const token = await new SignJWT({ name })
.setProtectedHeader({ alg: 'HS256' })
.setAudience(JWT_AUDIENCE)
.setIssuer(JWT_ISSUER)
.setExpirationTime(JWT_EXPIRATION)
.sign(JWT_SECRET_KEY);
res.status(200).send({ member: memberService.userAdapter(member.left), token: token });
});
});
};
const login = async (req: Request, res: Response) => {
if (!req || !req.body || !req.body.name || !req.body.password) {
res.status(400).send();
return;
if (!req || !req.body || !req.body.name || !req.body.password) {
res.status(400).send();
return;
}
const name: string = req.body.name;
const member: Either<Member, string> = await memberService.getMember(name);
if (member.hasRight) {
res.send(member.right).send();
return;
}
bcrypt.compare(req.body.password, member.left.password, async (err, r) => {
if (err) {
res.status(500).send();
return;
}
const name: string = req.body.name;
const member: Either<Member, string> = await getMember(name);
if (member.hasRight) {
res.send(member.right).send();
return;
if (!r) {
res.status(401).send();
return;
}
bcrypt.compare(req.body.password, member.left.password, async (err, r) => {
if (err) {
res.status(500).send();
return;
}
if (!r) {
res.status(401).send();
return;
}
const token = await new SignJWT({ name })
.setProtectedHeader({ alg: 'HS256' })
.setAudience(JWT_AUDIENCE)
.setIssuer(JWT_ISSUER)
.setExpirationTime(JWT_EXPIRATION)
.sign(JWT_SECRET_KEY);
res.status(200).send({ member: userAdapter(member.left), token: token});
});
const token = await new SignJWT({ name })
.setProtectedHeader({ alg: 'HS256' })
.setAudience(JWT_AUDIENCE)
.setIssuer(JWT_ISSUER)
.setExpirationTime(JWT_EXPIRATION)
.sign(JWT_SECRET_KEY);
res.status(200).send({ member: memberService.userAdapter(member.left), token: token });
});
};
export { register, login };

View File

@ -0,0 +1,55 @@
import { RequestHandler } from "express";
import boxService from "../services/box.service";
const boxByTitle: RequestHandler<{ title: string; }> = async (req, res) => {
const boxEither = await boxService.getBox(req.params.title);
if (boxEither.hasRight) {
res.sendStatus(404);
return;
}
const box = boxEither.left;
res.render('box.ejs', { box });
};
const allBoxes: RequestHandler = async (_req, res) => {
const boxes = await boxService.getAllBoxes();
res.render('boxes.ejs', { boxes });
};
const allBoxesFromDate: RequestHandler<{ date: string; }> = async (req, res) => {
const date = new Date(req.params.date);
// If the input isn't a date
if (isNaN(date.getTime())) {
res.sendStatus(400);
return;
}
const boxes = await boxService.getAllBoxesFromDate(date);
res.render('boxes.ejs', { boxes });
};
const boxById: RequestHandler<{ id: string; }> = async (req, res) => {
const id = parseInt(req.params.id);
const boxEither = await boxService.getBox(id);
if (boxEither.hasRight) {
res.sendStatus(404);
return;
}
const box = boxEither.left;
res.render('box.ejs', { box });
};
const boxController = {
boxByTitle,
allBoxes,
allBoxesFromDate,
boxById,
};
export default boxController;

View File

@ -1,57 +1,25 @@
import { Request, Response } from 'express';
import { new_client } from '../db/db_client';
import { Marque } from '../types/marque';
import { Either, eitherLeft, eitherRight } from '../utils/utils';
const getMarque = async (idOrName: number | string): Promise<Either<Marque, string>> => {
const client = new_client();
await client.connect();
let res;
if (typeof idOrName !== 'number') {
res = await client.query("SELECT * FROM marques WHERE nom_marque=$1;", [`${idOrName}`]);
} else {
res = await client.query("SELECT * FROM marques WHERE id_marque=$1;", [idOrName]);
}
if (res.rows.length === 0) {
await client.end();
return eitherRight<Marque, string>("Does not exist.");
}
const marque: Marque = { id_marque: res.rows[0].id_marque, name: res.rows[0].nom_marque };
await client.end();
return eitherLeft<Marque, string>(marque);
}
const createMarque = async (name: string): Promise<Either<Marque, string>> => {
const gettingMarque = await getMarque(name);
if (!gettingMarque.hasRight) {
return eitherRight<Marque, string>("Already in database.");
}
const client = new_client();
await client.connect();
const res = await client.query("INSERT INTO marques (nom_membre) VALUES ($1) RETURNING *;", [`${name}`]);
if (res.rows.length === 0) {
await client.end();
return eitherRight<Marque, string>("Something went wrong");
}
const marque: Marque = { id_marque: res.rows[0].id_marque, name: res.rows[0].nom_marque };
await client.end();
return eitherLeft<Marque, string>(marque);
};
import marqueService from '../services/marque.service';
import { Either } from '../utils/utils';
const register = async (req: Request, res: Response) => {
if (!req || !req.body || !req.body.name) {
res.status(400).send();
return;
}
const name: string = req.body.name;
const marque: Either<Marque, string> = await createMarque(name);
if (marque.hasRight) {
res.status(403).send(marque.right);
return;
}
if (!req || !req.body || !req.body.name) {
res.status(400).send();
return;
}
const name: string = req.body.name;
const marque: Either<Marque, string> = await marqueService.createMarque(name);
if (marque.hasRight) {
res.status(403).send(marque.right);
return;
}
res.status(200).send(marque);
res.status(200).send(marque);
}
export { register };
const marqueController = {
register
};
export default marqueController;

View File

@ -1,48 +1,42 @@
import { new_client } from '../db/db_client';
import { Member, User } from '../types/member';
import { Either, eitherLeft, eitherRight } from '../utils/utils';
import { RequestHandler } from "express";
import memberService from "../services/member.service";
const getDefaultUser = (): User => ({ id_member: -1, name: "unknown" });
const getDefaultMember = (): Member => ({ id_member: -1, name: "unknown", password: "none" });
const memberByName: RequestHandler<{ name: string; }> = async (req, res) => {
const memberEither = await memberService.getMember(req.params.name);
const getMember = async (idOrName: number | string): Promise<Either<Member, string>> => {
const client = new_client();
await client.connect();
let res;
if (typeof idOrName !== 'number') {
res = await client.query("SELECT * FROM membres WHERE nom_membre=$1;", [`${idOrName}`]);
} else {
res = await client.query("SELECT * FROM membres WHERE id_membre=$1;", [idOrName]);
}
if (res.rows.length === 0) {
await client.end();
return eitherRight<Member, string>("Does not exist.");
}
const member: Member = { id_member: res.rows[0].id_membre, name: res.rows[0].nom_membre, password: res.rows[0].mdp_membre };
await client.end();
if (memberEither.hasRight) {
res.sendStatus(404);
return;
}
return eitherLeft<Member, string>(member);
}
const member = memberEither.left;
const createMember = async (name: string, passwd: string): Promise<Either<Member, string>> => {
const gettingMember = await getMember(name);
if (!gettingMember.hasRight) {
return eitherRight<Member, string>("Already in database.");
}
const client = new_client();
await client.connect();
const res = await client.query("INSERT INTO membres (nom_membre, mdp_membre) VALUES ($1, $2) RETURNING *;", [`${name}`, `${passwd}`]);
if (res.rows.length === 0) {
await client.end();
return eitherRight<Member, string>("Something went wrong");
}
const member: Member = { id_member: res.rows[0].id_membre, name: res.rows[0].nom_membre, password: res.rows[0].mdp_membre };
await client.end();
return eitherLeft<Member, string>(member);
}
res.render('member.ejs', { member });
};
function userAdapter(member: Member): User {
return { id_member: member.id_member, name: member.name };
}
const allMembers: RequestHandler = async (_req, res) => {
const members = await memberService.getAllMembers();
res.render('members.ejs', { members });
};
export { getDefaultUser, getDefaultMember, getMember, createMember, userAdapter };
const memberById: RequestHandler<{ id: string; }> = async (req, res) => {
const id = parseInt(req.params.id);
const memberEither = await memberService.getMember(id);
if (memberEither.hasRight) {
res.sendStatus(404);
return;
}
const member = memberEither.left;
res.render('member.ejs', { member });
};
const memberController = {
memberByName,
memberById,
allMembers,
};
export default memberController;

View File

@ -0,0 +1,42 @@
import { RequestHandler } from "express";
import modelService from "../services/model.service";
const modelByName: RequestHandler<{ name: string; }> = async (req, res) => {
const modelEither = await modelService.getModel(req.params.name);
if (modelEither.hasRight) {
res.sendStatus(404);
return;
}
const model = modelEither.left;
res.render('model.ejs', { model });
};
const allModels: RequestHandler = async (_req, res) => {
const models = await modelService.getAllModels();
res.render('models.ejs', { models });
};
const modelById: RequestHandler<{ id: string; }> = async (req, res) => {
const id = parseInt(req.params.id);
const modelEither = await modelService.getModel(id);
if (modelEither.hasRight) {
res.sendStatus(404);
return;
}
const model = modelEither.left;
res.render('model.ejs', { model });
};
const modelController = {
modelByName,
allModels,
modelById,
};
export default modelController;

View File

@ -1,48 +1,48 @@
import { Request, Response } from 'express';
import { jwtVerify } from 'jose';
import { JWT_SECRET_KEY } from '../config/auth.config';
import { getMember } from '../controllers/member.controller';
import memberService from '../services/member.service';
import { Member } from '../types/member';
import { Either } from '../utils/utils';
const extractBearerToken = (headerValue: string) => {
const matches = headerValue.match(/(bearer)\s+(\S+)/i);
return matches && matches[2];
const matches = headerValue.match(/(bearer)\s+(\S+)/i);
return matches && matches[2];
}
const getUsername = async (req: Request, res: Response, next: () => void) => {
const token = req.headers.authorization && extractBearerToken(req.headers.authorization);
const token = req.headers.authorization && extractBearerToken(req.headers.authorization);
if (!token) {
next();
return;
}
try {
const { payload } = await jwtVerify(token, JWT_SECRET_KEY);
const name: string = payload.name as string;
const member: Either<Member, string> = await getMember(name);
if (!member.hasRight) {
res.locals.user = {
id_member: member.left.id_member,
name: member.left.name
}
next()
} else {
res.status(401).send(member.right)
}
} catch (e) {
res.status(401).send();
if (!token) {
next();
return;
}
try {
const { payload } = await jwtVerify(token, JWT_SECRET_KEY);
const name: string = payload.name as string;
const member: Either<Member, string> = await memberService.getMember(name);
if (!member.hasRight) {
res.locals.user = {
id_member: member.left.id_member,
name: member.left.name
}
next()
} else {
res.status(401).send(member.right)
}
} catch (e) {
res.status(401).send();
}
}
function verifyAuthentication(req: Request, res: Response, next: () => void) {
if (!res.locals.user) {
res.status(401).send();
return;
}
next();
if (!res.locals.user) {
res.status(401).send();
return;
}
next();
}
export { getUsername, verifyAuthentication };

View File

@ -0,0 +1,14 @@
import express from 'express';
import boxController from '../controllers/box.controller';
const boxRouter = express.Router();
boxRouter.get("/", boxController.allBoxes);
boxRouter.get("/from/:date", boxController.allBoxesFromDate);
boxRouter.get("/:title", boxController.boxByTitle);
boxRouter.get("/byid/:id", boxController.boxById);
export default boxRouter;

View File

@ -1,24 +1,28 @@
import express from 'express';
import path from 'path';
import db from '../db';
import { getUsername, verifyAuthentication } from '../middlewares/auth.middleware'
import authRoute from './auth.route'
import marquesRoute from './marque.route'
import piecesRoute from './piece.route'
import memberRouter from './member.route'
import modelRouter from './model.route';
import boxRouter from './box.route';
const routes = express.Router();
routes.get('/', async (_req, res) => {
const message = await db.example_request();
res.send(message);
});
routes.get("/message", async (_req, res) => {
const message = await db.example_request();
res.render('index.ejs', { message });
});
routes.use("/static", express.static(path.join(__dirname, '../static')));
routes.use("/auth", authRoute);
routes.use("/marques", getUsername, verifyAuthentication, marquesRoute);
routes.use("/pieces", getUsername, verifyAuthentication, piecesRoute);
routes.use("/membres", memberRouter);
routes.use("/models", modelRouter);
routes.use("/boxes", boxRouter);
// 404 fallback
routes.get("*", (_req, res) => {
res.render('notfound.ejs');
});
export default routes;

View File

@ -1,8 +1,8 @@
import express from 'express';
import { register } from '../controllers/marque.controller';
import marqueController from '../controllers/marque.controller';
const router = express.Router();
router.post('/register', register);
router.post('/register', marqueController.register);
export default router;

View File

@ -0,0 +1,12 @@
import express from 'express';
import memberController from '../controllers/member.controller';
const router = express.Router();
router.get("/", memberController.allMembers);
router.get("/:name", memberController.memberByName);
router.get("/byid/:id", memberController.memberById);
export default router;

View File

@ -0,0 +1,12 @@
import express from 'express';
import modelController from '../controllers/model.controller';
const modelRouter = express.Router();
modelRouter.get("/", modelController.allModels);
modelRouter.get("/:name", modelController.modelByName);
modelRouter.get("/byid/:id", modelController.modelById);
export default modelRouter;

View File

@ -0,0 +1,68 @@
import { new_client } from '../db/db_client';
import { Box } from '../types/box';
import { Either, eitherLeft, eitherRight } from '../utils/utils';
type DBBox = {
id_boite: number;
titre_boite: string;
date_boite: string;
};
function db2box(data: DBBox): Box {
const box: Box = {
id: data.id_boite,
title: data.titre_boite,
date: new Date(data.date_boite),
};
return box;
}
const getBox = async (idOrTitle: number | string): Promise<Either<Box, string>> => {
const client = new_client();
await client.connect();
let res;
if (typeof idOrTitle !== 'number') {
res = await client.query("SELECT * FROM boites WHERE titre_boite=$1;", [`${idOrTitle}`]);
} else {
res = await client.query("SELECT * FROM boites WHERE id_boite=$1;", [idOrTitle]);
}
if (res.rows.length === 0) {
await client.end();
return eitherRight<Box, string>("Does not exist.");
}
const box = db2box(res.rows[0]);
await client.end();
return eitherLeft<Box, string>(box);
}
const getAllBoxes = async () => {
const client = new_client();
await client.connect();
const res = await client.query("SELECT * FROM boites");
await client.end();
return res.rows.map(db2box);
}
const getAllBoxesFromDate = async (date: Date) => {
const client = new_client();
await client.connect();
const YYYY = date.getFullYear();
const MM = date.getMonth() + 1;
const DD = date.getDate();
const dateString = `${YYYY}-${MM}-${DD}`;
const res = await client.query("SELECT * FROM boites WHERE date_boite > $1", [dateString]);
await client.end();
return res.rows.map(db2box);
}
const boxService = {
getBox,
getAllBoxes,
getAllBoxesFromDate,
};
export default boxService;

View File

@ -0,0 +1,47 @@
import { Request, Response } from 'express';
import { new_client } from '../db/db_client';
import { Marque } from '../types/marque';
import { Either, eitherLeft, eitherRight } from '../utils/utils';
const getMarque = async (idOrName: number | string): Promise<Either<Marque, string>> => {
const client = new_client();
await client.connect();
let res;
if (typeof idOrName !== 'number') {
res = await client.query("SELECT * FROM marques WHERE nom_marque=$1;", [`${idOrName}`]);
} else {
res = await client.query("SELECT * FROM marques WHERE id_marque=$1;", [idOrName]);
}
if (res.rows.length === 0) {
await client.end();
return eitherRight<Marque, string>("Does not exist.");
}
const marque: Marque = { id_marque: res.rows[0].id_marque, name: res.rows[0].nom_marque };
await client.end();
return eitherLeft<Marque, string>(marque);
}
const createMarque = async (name: string): Promise<Either<Marque, string>> => {
const gettingMarque = await getMarque(name);
if (!gettingMarque.hasRight) {
return eitherRight<Marque, string>("Already in database.");
}
const client = new_client();
await client.connect();
const res = await client.query("INSERT INTO marques (nom_membre) VALUES ($1) RETURNING *;", [`${name}`]);
if (res.rows.length === 0) {
await client.end();
return eitherRight<Marque, string>("Something went wrong");
}
const marque: Marque = { id_marque: res.rows[0].id_marque, name: res.rows[0].nom_marque };
await client.end();
return eitherLeft<Marque, string>(marque);
};
const marqueService = {
getMarque,
createMarque
};
export default marqueService;

View File

@ -0,0 +1,80 @@
import { new_client } from '../db/db_client';
import { Member, User } from '../types/member';
import { Either, eitherLeft, eitherRight } from '../utils/utils';
type DBMembre = {
id_membre: number;
nom_membre: string;
mdp_membre: string;
};
function db2member(data: DBMembre) {
const member: Member = {
id_member: data.id_membre,
name: data.nom_membre,
password: data.mdp_membre,
};
return member;
}
const getMember = async (idOrName: number | string): Promise<Either<Member, string>> => {
const client = new_client();
await client.connect();
let res;
if (typeof idOrName !== 'number') {
res = await client.query("SELECT * FROM membres WHERE nom_membre=$1;", [`${idOrName}`]);
} else {
res = await client.query("SELECT * FROM membres WHERE id_membre=$1;", [idOrName]);
}
if (res.rows.length === 0) {
await client.end();
return eitherRight<Member, string>("Does not exist.");
}
const member = db2member(res.rows[0]);
await client.end();
return eitherLeft<Member, string>(member);
}
const getAllMembers = async () => {
const client = new_client();
await client.connect();
const res = await client.query("SELECT * FROM membres");
await client.end();
return res.rows.map(db2member);
}
const createMember = async (name: string, passwd: string): Promise<Either<Member, string>> => {
const gettingMember = await getMember(name);
if (!gettingMember.hasRight) {
return eitherRight<Member, string>("Already in database.");
}
const client = new_client();
await client.connect();
const res = await client.query("INSERT INTO membres (nom_membre, mdp_membre) VALUES ($1, $2) RETURNING *;", [`${name}`, `${passwd}`]);
if (res.rows.length === 0) {
await client.end();
return eitherRight<Member, string>("Something went wrong");
}
const member: Member = { id_member: res.rows[0].id_membre, name: res.rows[0].nom_membre, password: res.rows[0].mdp_membre };
await client.end();
return eitherLeft<Member, string>(member);
}
const getDefaultUser = (): User => ({ id_member: -1, name: "unknown" });
const getDefaultMember = (): Member => ({ id_member: -1, name: "unknown", password: "none" });
function userAdapter(member: Member): User {
return { id_member: member.id_member, name: member.name };
}
const memberService = {
getMember,
createMember,
getDefaultUser,
getDefaultMember,
userAdapter,
getAllMembers,
};
export default memberService;

View File

@ -0,0 +1,81 @@
import { new_client } from '../db/db_client';
import { Model } from '../types/model';
import { Either, eitherLeft, eitherRight } from '../utils/utils';
type DBModel = {
id_modele: number;
nom_modele: string;
url_notice_modele: string;
id_membre: number;
id_modele_2: number;
};
function db2Model(data: DBModel) {
const model: Model = {
id: data.id_modele,
name: data.nom_modele,
url: data.url_notice_modele,
creator: data.id_membre,
inheritFrom: data.id_modele_2,
};
return model;
}
const getModel = async (idOrName: number | string): Promise<Either<Model, string>> => {
const client = new_client();
await client.connect();
let res;
if (typeof idOrName !== 'number') {
res = await client.query("SELECT * FROM modeles WHERE nom_modele=$1;", [`${idOrName}`]);
} else {
res = await client.query("SELECT * FROM modeles WHERE id_modele=$1;", [idOrName]);
}
if (res.rows.length === 0) {
await client.end();
return eitherRight<Model, string>("Does not exist.");
}
const model = db2Model(res.rows[0]);
await client.end();
return eitherLeft<Model, string>(model);
}
const getAllModels = async () => {
const client = new_client();
await client.connect();
const res = await client.query("SELECT * FROM modeles");
await client.end();
return res.rows.map(db2Model);
}
const createModel = async (name: string, url: string, creator: number, inheritFrom: number): Promise<Either<Model, string>> => {
const gettingModel = await getModel(name);
if (!gettingModel.hasRight) {
return eitherRight<Model, string>("Already in database.");
}
const client = new_client();
await client.connect();
const res = await client.query(
"INSERT INTO modeles \
(nom_modele, url_notice_modele, id_membre, id_modele_2) \
VALUES ($1, $2, $3, $4) \
RETURNING *;",
[`${name}`, `${url}`, `${creator}`, `${inheritFrom}`]);
if (res.rows.length === 0) {
await client.end();
return eitherRight<Model, string>("Something went wrong");
}
const model: Model = db2Model(res.rows[0]);
await client.end();
return eitherLeft<Model, string>(model);
}
const modelService = {
getModel,
getAllModels,
createModel,
};
export default modelService;

View File

@ -0,0 +1,7 @@
:root {
--fg: #161925;
--bg: #FDFFFC;
--blue: #235789;
--red: #C1292E;
--yellow: #F1D302;
}

View File

@ -0,0 +1,22 @@
.header nav ul {
display: flex;
list-style: none;
}
.header {
background-color: var(--fg);
color: var(--bg);
}
.header a {
color: var(--bg);
}
.header li {
padding: 2rem 1rem;
}
.header li:hover {
background-color: var(--bg);
color: var(--fg);
}

View File

@ -0,0 +1,15 @@
* {
margin: 0;
padding: 0;
outline: 0;
border: 0;
font-family: sans-serif;
}
pre, code {
font-family: monospace;
}
hr {
border-bottom: 2px solid var(--fg);
}

View File

@ -0,0 +1,25 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
<%= box.title %>
</title>
<%- include('partials/links.ejs') %>
</head>
<body>
<%- include('partials/header.ejs') %>
<h1>
<%= box.title %>
</h1>
<pre>
id : <%= box.id %>
date : <%= box.date %>
</pre>
</body>
</html>

View File

@ -0,0 +1,39 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
Liste des boîtes
</title>
<%- include('partials/links.ejs') %>
</head>
<body>
<%- include('partials/header.ejs') %>
<h1>
Liste des boîtes
</h1>
<div class="fromDate">
<label for="fromDate">À partir de : </label>
<input type="date" name="fromDate" id="fromDate">
<input type="submit" value="Filtrer" onclick="window.location.pathname = '/boxes/from/' + document.getElementById('fromDate').value;">
</div>
<hr>
<ul>
<% boxes.forEach(function(box) { %>
<li>
<a href="/boxes/<%=box.title%>">
<%=box.title%>
</a>
</li>
<% }); %>
</ul>
</body>
</html>

View File

@ -1,13 +1,21 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Leohl !dworl</title>
<%- include('partials/links.ejs') %>
</head>
<body>
<%- include('partials/header.ejs') %>
<h1>Naisu</h1>
<h2><%= message %></h2>
<p>Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sapiente quod dicta molestiae harum veniam iste, nostrum nemo earum commodi fugit modi, ratione obcaecati, beatae ullam. Debitis ducimus dignissimos rem at.</p>
<h2>
<%= message %>
</h2>
<p>Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sapiente quod dicta molestiae harum veniam iste, nostrum
nemo earum commodi fugit modi, ratione obcaecati, beatae ullam. Debitis ducimus dignissimos rem at.</p>
</body>
</html>

View File

@ -0,0 +1,23 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
<%= member.name %>
</title>
<%- include('partials/links.ejs') %>
</head>
<body>
<%- include('partials/header.ejs') %>
<h1>
<%= member.name %>
</h1>
<h2>id: <%= member.id_member%>
</h2>
</body>
</html>

View File

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
Liste des membres
</title>
<%- include('partials/links.ejs') %>
</head>
<body>
<%- include('partials/header.ejs') %>
<h1>
Liste des membres
</h1>
<ul>
<% members.forEach(function(member) { %>
<li>
<a href="/membres/<%=member.name%>">
<%=member.name%>
</a>
</li>
<% }); %>
</ul>
</body>
</html>

View File

@ -0,0 +1,27 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
<%= model.name %>
</title>
<%- include('partials/links.ejs') %>
</head>
<body>
<%- include('partials/header.ejs') %>
<h1>
<%= model.name %>
</h1>
<pre>
id : <%= model.id %>
url : <%= model.url %>
creator : <%= model.creator %>
inheritFrom : <%= model.inheritFrom %>
</pre>
</body>
</html>

View File

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
Liste des modeles
</title>
<%- include('partials/links.ejs') %>
</head>
<body>
<%- include('partials/header.ejs') %>
<h1>
Liste des modeles
</h1>
<ul>
<% models.forEach(function(model) { %>
<li>
<a href="/models/<%=model.name%>">
<%=model.name%>
</a>
</li>
<% }); %>
</ul>
</body>
</html>

View File

@ -0,0 +1,19 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
404 -- Not Found
</title>
<%- include('partials/links.ejs') %>
</head>
<body>
<%- include('partials/header.ejs') %>
<h1>
¯\_(ツ)_/¯
</h1>
</body>
</html>

View File

@ -0,0 +1,23 @@
<header class="header">
<nav>
<ul>
<a href="/membres">
<li>
Membres
</li>
</a>
<a href="/models">
<li>
Modèles
</li>
</a>
<a href="/boxes">
<li>
Boîtes
</li>
</a>
</ul>
</nav>
</header>

View File

@ -0,0 +1,3 @@
<link href="/static/css/colors.css" rel="stylesheet" />
<link href="/static/css/header.css" rel="stylesheet" />
<link href="/static/css/reset.css" rel="stylesheet" />

View File

@ -0,0 +1,7 @@
type Box = {
id: number;
title: string;
date: Date;
};
export { Box };

View File

@ -1,6 +1,6 @@
type Marque = {
id_marque: number,
name: string
id_marque: number,
name: string
};
export { Marque };

View File

@ -1,6 +1,6 @@
type User = {
id_member: number,
name: string
id_member: number,
name: string
}
type Member = User & { password: string };

View File

@ -0,0 +1,9 @@
type Model = {
id: number;
name: string;
url: string;
creator: number;
inheritFrom: number;
};
export { Model };

View File

@ -1,7 +1,7 @@
type Either<T, U> = {
hasRight: boolean,
left: T,
right: U
hasRight: boolean,
left: T,
right: U
};
type Error = {
@ -12,11 +12,11 @@ type Error = {
type Result<T> = Error | T;
function eitherLeft<T, U>(left: T): Either<T, U> {
return { hasRight: false, left: left, right: undefined };
return { hasRight: false, left: left, right: undefined };
}
function eitherRight<T, U>(right: U): Either<T, U> {
return { hasRight: true, left: undefined, right: right };
return { hasRight: true, left: undefined, right: right };
}
function eitherFormatError<T, string>(either: Either<T, string>): Result<T> {

View File

@ -2,10 +2,10 @@ services:
database:
hostname: database
container_name: briques_postgres
env_file: back-end/.env
build:
context: ./PostgreSQL
dockerfile: Dockerfile
restart: always
environment:
- POSTGRES_DB=${DB_NAME}
- POSTGRES_USER=${DB_USER}
@ -17,6 +17,5 @@ services:
adminer:
image: adminer
restart: always
ports:
- 8080:8080

View File

@ -6,6 +6,7 @@ services:
context: ./PostgreSQL
dockerfile: Dockerfile
restart: always
env_file: back-end/.env.production
environment:
- POSTGRES_DB=${DB_NAME}
- POSTGRES_USER=${DB_USER}