jegatroncomponents_recreate.sql 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. /* Remove everything */
  2. -- Remove all group detail tables
  3. SET @tbls = (
  4. SELECT GROUP_CONCAT(TABLE_NAME)
  5. FROM information_schema.TABLES t
  6. WHERE t.TABLE_SCHEMA = 'jegatroncomponents'
  7. AND TABLE_NAME LIKE 'group_details%');
  8. -- SELECT @tbls;
  9. delimiter //
  10. BEGIN NOT ATOMIC
  11. IF @tbls IS NOT null THEN
  12. PREPARE stmt FROM concat('DROP TABLE ', @tbls);
  13. EXECUTE stmt;
  14. DEALLOCATE PREPARE stmt;
  15. END IF;
  16. END;
  17. //
  18. delimiter ;
  19. -- Remove all view that I know of
  20. DROP VIEW IF EXISTS kicad_resistors;
  21. -- Remove all functions and stored procedures
  22. DROP PROCEDURE IF EXISTS `add_part_group`;
  23. DROP PROCEDURE IF EXISTS `add_internal_part`;
  24. DROP PROCEDURE IF EXISTS `add_manufacturer_part`;
  25. DROP FUNCTION IF EXISTS `to_value_string`;
  26. DROP FUNCTION IF EXISTS `to_pn_string`;
  27. -- Remove all tables
  28. SET FOREIGN_KEY_CHECKS=0;
  29. DROP TABLE IF EXISTS `qualified_parts`;
  30. DROP TABLE IF EXISTS `part_group_properties`;
  31. DROP TABLE IF EXISTS `internal_parts`;
  32. DROP TABLE IF EXISTS `part_groups`;
  33. DROP TABLE IF EXISTS `manufacturer_parts`;
  34. DROP TABLE IF EXISTS `manufacturers`;
  35. DROP TABLE IF EXISTS `supplier_part_numbers`;
  36. DROP TABLE IF EXISTS `suppliers`;
  37. DROP TABLE IF EXISTS `debug_msg`;
  38. DROP TABLE IF EXISTS `component_packages`;
  39. DROP TABLE IF EXISTS `component_symbols`;
  40. DROP TABLE IF EXISTS `footprints_kicad`;
  41. DROP TABLE IF EXISTS `symbols_kicad`;
  42. SET FOREIGN_KEY_CHECKS=1;
  43. -- Finished removing everything
  44. /* Debug table to store whatever in */
  45. /*
  46. CREATE TABLE `debug_msg` (
  47. msg_id int PRIMARY KEY AUTO_INCREMENT,
  48. msg text
  49. );
  50. */
  51. /* Contains listing of part groups. Each group should have a dedicated
  52. * table containing part group specific details. */
  53. CREATE TABLE `part_groups` (
  54. `part_group_id` varchar(50) NOT NULL,
  55. `part_group_detail_table` varchar(50) DEFAULT NULL,
  56. `group_display_name` varchar(50) DEFAULT NULL,
  57. `group_description` text DEFAULT NULL,
  58. PRIMARY KEY (`part_group_id`)
  59. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
  60. /* Helper function for adding component categories (groups)
  61. * It creates a row in part_group table and a corresponding new table */
  62. DELIMITER //
  63. CREATE OR REPLACE PROCEDURE `add_part_group`(
  64. IN group_name varchar(50),
  65. IN group_display_name varchar(50),
  66. IN group_description text)
  67. BEGIN
  68. SET @table_name := concat('group_details_', group_name);
  69. INSERT INTO `part_groups` (`part_group_id`, `group_display_name`, `group_description`, `part_group_detail_table`) VALUES (group_name, group_display_name, group_description, @table_name);
  70. SET @create_detail_table_query := concat('CREATE TABLE `', @table_name, '` (
  71. `detail_id` int NOT NULL AUTO_INCREMENT,
  72. PRIMARY KEY `', @table_name, '_PK` (`detail_id`),
  73. `internal_pn` int DEFAULT NULL,
  74. CONSTRAINT `', @table_name, '_part_FK` FOREIGN KEY (`internal_pn`) REFERENCES `internal_parts` (`internal_pn`) ON DELETE CASCADE,
  75. CONSTRAINT `', @table_name, '_part_AK` UNIQUE (`internal_pn`),
  76. `mpn` varchar(50) DEFAULT NULL,
  77. `mfr` varchar(50) DEFAULT NULL,
  78. CONSTRAINT `', @table_name, '_mpn_FK` FOREIGN KEY (`mpn`, `mfr`) REFERENCES `manufacturer_parts` (`mpn`, `mfr`) ON DELETE CASCADE ON UPDATE CASCADE,
  79. CONSTRAINT `', @table_name, '_mpn_AK` UNIQUE (`mpn`, `mfr`)
  80. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
  81. ');
  82. -- INSERT INTO `debug_msg`(`msg`) VALUES (@create_detail_table_query);
  83. EXECUTE IMMEDIATE @create_detail_table_query;
  84. END;
  85. //
  86. DELIMITER ;
  87. CREATE TABLE `internal_parts` (
  88. `internal_pn` int(11) NOT NULL AUTO_INCREMENT,
  89. `part_group_id` varchar(50) NOT NULL,
  90. `part_description` text DEFAULT NULL,
  91. `exclude_from_bom` tinyint(1) NOT NULL DEFAULT 0,
  92. `exclude_from_board` tinyint(1) NOT NULL DEFAULT 0,
  93. PRIMARY KEY (`internal_pn`),
  94. KEY `internal_parts_group_id_fk` (`part_group_id`),
  95. CONSTRAINT `internal_parts_group_id_fk` FOREIGN KEY (`part_group_id`) REFERENCES `part_groups` (`part_group_id`)
  96. ) ENGINE=InnoDB AUTO_INCREMENT=1062 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
  97. ALTER TABLE `internal_parts` AUTO_INCREMENT=1000000;
  98. # Helper function to convert int to a formatted part number string xx-xx-xxx
  99. delimiter //
  100. CREATE OR REPLACE FUNCTION to_pn_string(pn int) RETURNS varchar(9)
  101. BEGIN
  102. DECLARE pnstrtmp varchar(7);
  103. DECLARE pnstr varchar(9);
  104. SET pnstrtmp := lpad(cast(pn AS char), 7, 0);
  105. SET pnstr := concat(substring(pnstrtmp, 1, 2), '-', substring(pnstrtmp, 3, 2), '-', substring(pnstrtmp, 5, 3));
  106. RETURN pnstr;
  107. END
  108. //
  109. delimiter ;
  110. /* Helper function for adding internal components
  111. * It creates a row in internal parts table and a row in the corresponding details table */
  112. /*
  113. DELIMITER //
  114. CREATE OR REPLACE PROCEDURE `add_internal_part`(
  115. IN part_display_name varchar(50),
  116. IN part_group_id varchar(50),
  117. IN part_description text,
  118. OUT internal_pn int)
  119. BEGIN
  120. SELECT pg.part_group_detail_table INTO @table_name FROM `part_groups` pg WHERE pg.part_group_id = part_group_id;
  121. INSERT INTO `internal_parts` (`part_display_name`, `part_group_id`, `part_description`) VALUES (part_display_name, part_group_id, part_description);
  122. SET @last_id := last_insert_id();
  123. SET internal_pn := @last_id;
  124. SET @part_detail_query := concat('INSERT INTO `', @table_name, '` (`internal_pn`) VALUES (', @last_id, ')');
  125. -- SELECT @part_detail_query;
  126. EXECUTE IMMEDIATE @part_detail_query;
  127. END;
  128. //
  129. DELIMITER ;
  130. */
  131. CREATE TABLE `manufacturers` (
  132. `mfr` varchar(50) NOT NULL,
  133. `mfr_display_name` varchar(100) DEFAULT NULL,
  134. `url` varchar(250) DEFAULT NULL,
  135. PRIMARY KEY (`mfr`)
  136. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
  137. CREATE TABLE `manufacturer_parts` (
  138. `mpn` varchar(50) NOT NULL,
  139. `mfr` varchar(50) NOT NULL,
  140. `part_group_id` varchar(50) NOT NULL,
  141. `part_description` text DEFAULT NULL,
  142. `lifecycle_status` enum('Active','NRND','Last Time Buy','Obsolete') NOT NULL,
  143. PRIMARY KEY (`mpn`,`mfr`),
  144. KEY `manufacturer_parts_mfr_FK` (`mfr`),
  145. KEY `manufacturer_parts_group_id_fk` (`part_group_id`),
  146. CONSTRAINT `manufacturer_parts_group_id_fk` FOREIGN KEY (`part_group_id`) REFERENCES `part_groups` (`part_group_id`),
  147. CONSTRAINT `manufacturer_parts_mfr_FK` FOREIGN KEY (`mfr`) REFERENCES `manufacturers` (`mfr`) ON UPDATE CASCADE
  148. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
  149. /* Helper function for adding manufacturer components
  150. * It creates a row in internal parts table and a row in the corresponding details table */
  151. /*
  152. DELIMITER //
  153. CREATE OR REPLACE PROCEDURE `add_manufacturer_part`(
  154. IN mpn varchar(50),
  155. IN mfr varchar(50),
  156. IN part_group_id varchar(50),
  157. IN part_description text)
  158. BEGIN
  159. SELECT pg.part_group_detail_table INTO @table_name FROM `part_groups` pg WHERE pg.part_group_id = part_group_id;
  160. INSERT INTO `manufacturer_parts` (`mpn`, `mfr`, `part_group_id`, `part_description`) VALUES (mpn, mfr, part_group_id, part_description);
  161. SET @part_detail_query := concat('INSERT INTO `', @table_name, '` (`mpn`, `mfr`) VALUES (\'', mpn , '\', \'', mfr, '\' )');
  162. -- SELECT @part_detail_query;
  163. EXECUTE IMMEDIATE @part_detail_query;
  164. END;
  165. //
  166. DELIMITER ;
  167. */
  168. CREATE TABLE `qualified_parts` (
  169. `internal_pn` int(11) NOT NULL,
  170. `mpn` varchar(50) NOT NULL,
  171. `mfr` varchar(50) NOT NULL,
  172. PRIMARY KEY (`internal_pn`,`mpn`,`mfr`),
  173. KEY `qualified_parts_FK_1` (`mpn`,`mfr`),
  174. CONSTRAINT `qualified_parts_FK` FOREIGN KEY (`internal_pn`) REFERENCES `internal_parts` (`internal_pn`) ON DELETE CASCADE ON UPDATE CASCADE,
  175. CONSTRAINT `qualified_parts_FK_1` FOREIGN KEY (`mpn`, `mfr`) REFERENCES `manufacturer_parts` (`mpn`, `mfr`) ON DELETE CASCADE ON UPDATE CASCADE
  176. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
  177. CREATE TABLE `suppliers` (
  178. `supplier` varchar(100) NOT NULL,
  179. `url` varchar(100) DEFAULT NULL,
  180. PRIMARY KEY (`supplier`)
  181. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
  182. CREATE TABLE `supplier_part_numbers` (
  183. `supplier_pno` varchar(100) NOT NULL,
  184. `supplier` varchar(100) NOT NULL,
  185. `mpn` varchar(50) NOT NULL,
  186. `mfr` varchar(100) NOT NULL,
  187. `url` varchar(250) DEFAULT NULL,
  188. PRIMARY KEY (`supplier_pno`,`supplier`),
  189. KEY `supplier_part_numbers_FK_1` (`supplier`),
  190. KEY `supplier_part_numbers_FK` (`mpn`,`mfr`),
  191. CONSTRAINT `supplier_part_numbers_FK` FOREIGN KEY (`mpn`, `mfr`) REFERENCES `manufacturer_parts` (`mpn`, `mfr`) ON DELETE CASCADE ON UPDATE CASCADE,
  192. CONSTRAINT `supplier_part_numbers_FK_1` FOREIGN KEY (`supplier`) REFERENCES `suppliers` (`supplier`) ON DELETE CASCADE ON UPDATE CASCADE
  193. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
  194. CREATE TABLE `component_packages` (
  195. `component_package` varchar(50) NOT NULL,
  196. `package_display_name` varchar(100) DEFAULT NULL,
  197. PRIMARY KEY (`component_package`)
  198. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
  199. CREATE TABLE `footprints_kicad` (
  200. `footprint_kicad_id` int(11) NOT NULL AUTO_INCREMENT,
  201. `component_package` varchar(50) DEFAULT NULL,
  202. `kicad_footprint` varchar(100) DEFAULT NULL,
  203. `kicad_footprint_filter` varchar(100) DEFAULT NULL,
  204. PRIMARY KEY (`footprint_kicad_id`),
  205. UNIQUE KEY `footprints_kicad_AK` (`component_package`),
  206. CONSTRAINT `footprints_kicad_FK` FOREIGN KEY (`component_package`) REFERENCES `component_packages` (`component_package`)
  207. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
  208. CREATE TABLE `component_symbols` (
  209. `component_symbol` varchar(50) NOT NULL,
  210. `symbol_display_name` varchar(100) DEFAULT NULL,
  211. PRIMARY KEY (`component_symbol`)
  212. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
  213. CREATE TABLE `symbols_kicad` (
  214. `kicad_symbol_id` int(11) NOT NULL AUTO_INCREMENT,
  215. `component_symbol` varchar(50) DEFAULT NULL,
  216. `kicad_symbol` varchar(100) DEFAULT NULL,
  217. PRIMARY KEY (`kicad_symbol_id`),
  218. UNIQUE KEY `symbols_kicad_AK` (`component_symbol`),
  219. KEY `symbols_kicad_FK` (`component_symbol`),
  220. CONSTRAINT `symbols_kicad_FK` FOREIGN KEY (`component_symbol`) REFERENCES `component_symbols` (`component_symbol`)
  221. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
  222. /* Utility function for converting values to electrical value strings, e.g. 4k7 */
  223. DELIMITER //
  224. CREATE OR REPLACE FUNCTION to_value_string(n float, unit varchar(1)) RETURNS varchar(10)
  225. BEGIN
  226. DECLARE exponent int;
  227. DECLARE suffix varchar(2);
  228. DECLARE string_to_return varchar(10);
  229. SET exponent = floor(log10(n)/3);
  230. SET exponent = greatest(-5, exponent);
  231. SET exponent = least(3, exponent);
  232. IF exponent <= -5 THEN
  233. SET suffix = 'f';
  234. ELSEIF exponent = -4 THEN
  235. SET suffix = 'p';
  236. ELSEIF exponent = -3 THEN
  237. SET suffix = 'n';
  238. ELSEIF exponent = -2 THEN
  239. SET suffix = 'u';
  240. ELSEIF exponent = -1 THEN
  241. SET suffix = 'm';
  242. ELSEIF exponent = 0 THEN
  243. SET suffix = unit;
  244. ELSEIF exponent = 1 THEN
  245. SET suffix = 'k';
  246. ELSEIF exponent = 2 THEN
  247. SET suffix = 'M';
  248. ELSEIF exponent >= 3 THEN
  249. SET suffix = 'G';
  250. END IF;
  251. SET string_to_return = trim( TRAILING '0' from CAST( round(n/(power(1000, exponent)), 3) AS varchar(10) ));
  252. -- SET string_to_return = n;
  253. IF instr(string_to_return, '.') THEN
  254. SET string_to_return = replace(string_to_return, '.', suffix);
  255. ELSE
  256. SET string_to_return = concat(string_to_return, suffix);
  257. END IF;
  258. RETURN string_to_return;
  259. END
  260. //
  261. DELIMITER ;