Guest User

Untitled

a guest
Jun 21st, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 49.13 KB | None | 0 0
  1. SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
  2. SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
  3. SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
  4.  
  5. -- -----------------------------------------------------
  6. -- Schema mydb
  7. -- -----------------------------------------------------
  8. -- -----------------------------------------------------
  9. -- Schema booklibinventory
  10. -- -----------------------------------------------------
  11. CREATE SCHEMA IF NOT EXISTS `booklibinventory` DEFAULT CHARACTER SET utf8 ;
  12. USE `booklibinventory` ;
  13.  
  14. -- -----------------------------------------------------
  15. -- Table `booklibinventory`.`authorstab`
  16. -- -----------------------------------------------------
  17. DROP TABLE IF EXISTS `booklibinventory`.`authorstab` ;
  18.  
  19. CREATE TABLE IF NOT EXISTS `booklibinventory`.`authorstab` (
  20. `idAuthors` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  21. `LastName` VARCHAR(20) NOT NULL,
  22. `FirstName` VARCHAR(20) NOT NULL,
  23. `MiddleName` VARCHAR(20) NULL DEFAULT NULL,
  24. `YearOfBirth` VARCHAR(4) NULL DEFAULT NULL,
  25. `YearOfDeath` VARCHAR(4) NULL DEFAULT NULL,
  26. PRIMARY KEY (`idAuthors`, `LastName`, `FirstName`),
  27. UNIQUE INDEX `idAuthors_UNIQUE` (`idAuthors` ASC),
  28. INDEX `LastName` (`LastName` ASC),
  29. INDEX `LastCMFirst` (`LastName` ASC, `FirstName` ASC))
  30. ENGINE = InnoDB
  31. DEFAULT CHARACTER SET = utf8;
  32.  
  33. -- -----------------------------------------------------
  34. -- Table `booklibinventory`.`bookcategories`
  35. -- -----------------------------------------------------
  36. DROP TABLE IF EXISTS `booklibinventory`.`bookcategories` ;
  37.  
  38. CREATE TABLE IF NOT EXISTS `booklibinventory`.`bookcategories` (
  39. `idBookCategories` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  40. `CategoryName` VARCHAR(45) NOT NULL COMMENT 'This will be strings like Non-Fiction, Mystery, Science-Fiction, Fantasy, Poetry, Art etc.',
  41. PRIMARY KEY (`idBookCategories`, `CategoryName`),
  42. UNIQUE INDEX `idBookCategories_UNIQUE` (`idBookCategories` ASC),
  43. INDEX `CategoryNames` (`CategoryName` ASC))
  44. ENGINE = InnoDB
  45. DEFAULT CHARACTER SET = utf8;
  46.  
  47. -- -----------------------------------------------------
  48. -- Table `booklibinventory`.`bksynopsis`
  49. -- -----------------------------------------------------
  50. DROP TABLE IF EXISTS `booklibinventory`.`bksynopsis` ;
  51.  
  52. CREATE TABLE IF NOT EXISTS `booklibinventory`.`bksynopsis` (
  53. `BookFKbd` INT(10) UNSIGNED NOT NULL,
  54. `StoryLine` VARCHAR(1024) NULL DEFAULT NULL,
  55. PRIMARY KEY (`BookFKbd`),
  56. INDEX `BookFKbD` (`BookFKbd` ASC))
  57. ENGINE = InnoDB
  58. DEFAULT CHARACTER SET = utf8;
  59.  
  60. -- -----------------------------------------------------
  61. -- Table `booklibinventory`.`bookformat`
  62. -- -----------------------------------------------------
  63. DROP TABLE IF EXISTS `booklibinventory`.`bookformat` ;
  64.  
  65. CREATE TABLE IF NOT EXISTS `booklibinventory`.`bookformat` (
  66. `idFormat` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  67. `FormatName` VARCHAR(45) NOT NULL,
  68. PRIMARY KEY (`idFormat`, `FormatName`),
  69. UNIQUE INDEX `idFormat_UNIQUE` (`idFormat` ASC),
  70. UNIQUE INDEX `FormatName_UNIQUE` (`FormatName` ASC))
  71. ENGINE = InnoDB
  72. DEFAULT CHARACTER SET = utf8;
  73.  
  74. -- -----------------------------------------------------
  75. -- Table `booklibinventory`.`bookinfo`
  76. -- -----------------------------------------------------
  77. DROP TABLE IF EXISTS `booklibinventory`.`bookinfo` ;
  78.  
  79. CREATE TABLE IF NOT EXISTS `booklibinventory`.`bookinfo` (
  80. `idBookInfo` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  81. `TitleFKbi` INT(10) UNSIGNED NOT NULL,
  82. `AuthorFKbi` INT(10) UNSIGNED NOT NULL COMMENT 'Foreign Key Into Author Table',
  83. `CategoryFKbi` INT(10) UNSIGNED NOT NULL,
  84. `BookFormatFKbi` INT(10) UNSIGNED NOT NULL COMMENT 'Foreign Key Into Format Table',
  85. `SeriesFKBi` INT(10) UNSIGNED NOT NULL COMMENT 'Foreign Key into Series Table',
  86. PRIMARY KEY (`idBookInfo`, `TitleFKbi`, `AuthorFKbi`),
  87. UNIQUE INDEX `idBookInfo_UNIQUE` (`idBookInfo` ASC),
  88. INDEX `CategoryFKbI` (`CategoryFKbi` ASC),
  89. INDEX `AuthorFKbi` (`AuthorFKbi` ASC),
  90. INDEX `BookFormatFKBi` (`BookFormatFKbi` ASC),
  91. INDEX `SeriesFKBi` (`SeriesFKBi` ASC),
  92. INDEX `TitleFKbi` (`TitleFKbi` ASC))
  93. ENGINE = InnoDB
  94. DEFAULT CHARACTER SET = utf8;
  95.  
  96. -- -----------------------------------------------------
  97. -- Table `booklibinventory`.`forsale`
  98. -- -----------------------------------------------------
  99. DROP TABLE IF EXISTS `booklibinventory`.`forsale` ;
  100.  
  101. CREATE TABLE IF NOT EXISTS `booklibinventory`.`forsale` (
  102. `BookFKfs` INT(10) UNSIGNED NOT NULL,
  103. `IsForSale` TINYINT(4) NOT NULL DEFAULT '0',
  104. `AskingPrice` DOUBLE NOT NULL DEFAULT '0',
  105. `EstimatedValue` DOUBLE NOT NULL DEFAULT '0',
  106. PRIMARY KEY (`BookFKfs`),
  107. INDEX `BookFKfs` (`BookFKfs` ASC))
  108. ENGINE = InnoDB
  109. DEFAULT CHARACTER SET = utf8;
  110.  
  111. -- -----------------------------------------------------
  112. -- Table `booklibinventory`.`haveread`
  113. -- -----------------------------------------------------
  114. DROP TABLE IF EXISTS `booklibinventory`.`haveread` ;
  115.  
  116. CREATE TABLE IF NOT EXISTS `booklibinventory`.`haveread` (
  117. `BookFKhr` INT(10) UNSIGNED NOT NULL,
  118. `HaveReadBook` TINYINT(4) NOT NULL DEFAULT '0',
  119. PRIMARY KEY (`BookFKhr`))
  120. ENGINE = InnoDB
  121. DEFAULT CHARACTER SET = utf8;
  122.  
  123. -- -----------------------------------------------------
  124. -- Table `booklibinventory`.`isbn`
  125. -- -----------------------------------------------------
  126. DROP TABLE IF EXISTS `booklibinventory`.`isbn` ;
  127.  
  128. CREATE TABLE IF NOT EXISTS `booklibinventory`.`isbn` (
  129. `BookFKiSBN` INT(10) UNSIGNED NOT NULL,
  130. `ISBNumber` VARCHAR(32) NULL DEFAULT NULL,
  131. PRIMARY KEY (`BookFKiSBN`),
  132. INDEX `ISBNumber` (`ISBNumber` ASC))
  133. ENGINE = InnoDB
  134. DEFAULT CHARACTER SET = utf8;
  135.  
  136. -- -----------------------------------------------------
  137. -- Table `booklibinventory`.`owned`
  138. -- -----------------------------------------------------
  139. DROP TABLE IF EXISTS `booklibinventory`.`owned` ;
  140.  
  141. CREATE TABLE IF NOT EXISTS `booklibinventory`.`owned` (
  142. `BookFKo` INT(10) UNSIGNED NOT NULL,
  143. `IsOwned` TINYINT(4) NOT NULL,
  144. `IsWishListed` TINYINT NOT NULL,
  145. PRIMARY KEY (`BookFKo`),
  146. INDEX `BookFKo` (`BookFKo` ASC))
  147. ENGINE = InnoDB
  148. DEFAULT CHARACTER SET = utf8;
  149.  
  150. -- -----------------------------------------------------
  151. -- Table `booklibinventory`.`publishinginfo`
  152. -- -----------------------------------------------------
  153. DROP TABLE IF EXISTS `booklibinventory`.`publishinginfo` ;
  154.  
  155. CREATE TABLE IF NOT EXISTS `booklibinventory`.`publishinginfo` (
  156. `BookFKPubI` INT(10) UNSIGNED NOT NULL COMMENT 'Foreign Key into the Book Info Table.',
  157. `Copyright` VARCHAR(4) NOT NULL,
  158. `Edition` INT(10) UNSIGNED NULL DEFAULT NULL,
  159. `Publisher` VARCHAR(45) NULL DEFAULT NULL,
  160. `OutOfPrint` TINYINT(4) NULL DEFAULT NULL COMMENT 'Is the book still being printed or has it lapsed.',
  161. `Printing` INT(10) UNSIGNED NULL DEFAULT NULL COMMENT 'A book may be printed may times. This will indicate which printing it is. Check the back of the title page.',
  162. PRIMARY KEY (`BookFKPubI`),
  163. INDEX `BookFKPubI` (`BookFKPubI` ASC))
  164. ENGINE = InnoDB
  165. DEFAULT CHARACTER SET = utf8;
  166.  
  167. -- -----------------------------------------------------
  168. -- Table `booklibinventory`.`purchaseinfo`
  169. -- -----------------------------------------------------
  170. DROP TABLE IF EXISTS `booklibinventory`.`purchaseinfo` ;
  171.  
  172. CREATE TABLE IF NOT EXISTS `booklibinventory`.`purchaseinfo` (
  173. `BookFKPurI` INT(10) UNSIGNED NOT NULL,
  174. `PurchaseDate` DATE NULL DEFAULT NULL,
  175. `ListPrice` DOUBLE NULL DEFAULT NULL,
  176. `PaidPrice` DOUBLE NULL DEFAULT NULL,
  177. `Vendor` VARCHAR(64) NULL DEFAULT NULL,
  178. PRIMARY KEY (`BookFKPurI`),
  179. INDEX `BookFKPurI` (`BookFKPurI` ASC))
  180. ENGINE = InnoDB
  181. DEFAULT CHARACTER SET = utf8;
  182.  
  183. -- -----------------------------------------------------
  184. -- Table `booklibinventory`.`series`
  185. -- -----------------------------------------------------
  186. DROP TABLE IF EXISTS `booklibinventory`.`series` ;
  187.  
  188. CREATE TABLE IF NOT EXISTS `booklibinventory`.`series` (
  189. `idSeries` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  190. `AuthorFK` INT(10) UNSIGNED NOT NULL COMMENT 'Foriegn Key into Author Table',
  191. `SeriesName` VARCHAR(128) NOT NULL,
  192. PRIMARY KEY (`idSeries`, `AuthorFK`, `SeriesName`),
  193. UNIQUE INDEX `idSeries_UNIQUE` (`idSeries` ASC),
  194. INDEX `AuthorFKs` (`AuthorFK` ASC),
  195. INDEX `SeriesTitle` (`SeriesName` ASC))
  196. ENGINE = InnoDB
  197. DEFAULT CHARACTER SET = utf8;
  198.  
  199. -- -----------------------------------------------------
  200. -- Table `booklibinventory`.`signedbyauthor`
  201. -- -----------------------------------------------------
  202. DROP TABLE IF EXISTS `booklibinventory`.`signedbyauthor` ;
  203.  
  204. CREATE TABLE IF NOT EXISTS `booklibinventory`.`signedbyauthor` (
  205. `BookFKsba` INT(10) UNSIGNED NOT NULL,
  206. `IsSignedByAuthor` TINYINT(4) NULL DEFAULT NULL,
  207. PRIMARY KEY (`BookFKsba`),
  208. INDEX `BookFKsba` (`BookFKsba` ASC))
  209. ENGINE = InnoDB
  210. DEFAULT CHARACTER SET = utf8;
  211.  
  212. -- -----------------------------------------------------
  213. -- Table `booklibinventory`.`title`
  214. -- -----------------------------------------------------
  215. DROP TABLE IF EXISTS `booklibinventory`.`title` ;
  216.  
  217. CREATE TABLE IF NOT EXISTS `booklibinventory`.`title` (
  218. `idTitle` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  219. `TitleStr` VARCHAR(128) NOT NULL,
  220. PRIMARY KEY (`idTitle`, `TitleStr`),
  221. UNIQUE INDEX `idTitle_UNIQUE` (`idTitle` ASC),
  222. INDEX `TitleStr` (`TitleStr` ASC))
  223. ENGINE = InnoDB
  224. DEFAULT CHARACTER SET = utf8;
  225.  
  226. -- -----------------------------------------------------
  227. -- Table `booklibinventory`.`volumeinseries`
  228. -- -----------------------------------------------------
  229. DROP TABLE IF EXISTS `booklibinventory`.`volumeinseries` ;
  230.  
  231. CREATE TABLE IF NOT EXISTS `booklibinventory`.`volumeinseries` (
  232. `BookFKvs` INT(10) UNSIGNED NOT NULL,
  233. `SeriesFK` INT(10) UNSIGNED NOT NULL,
  234. `VolumeNumber` INT(10) UNSIGNED NULL DEFAULT NULL,
  235. PRIMARY KEY (`BookFKvs`),
  236. INDEX `BookFKvs` (`BookFKvs` ASC),
  237. INDEX `SeriesFKvs` (`SeriesFK` ASC))
  238. ENGINE = InnoDB
  239. DEFAULT CHARACTER SET = utf8;
  240.  
  241. USE `booklibinventory` ;
  242.  
  243. -- -----------------------------------------------------
  244. -- function findAuthorKey
  245. -- -----------------------------------------------------
  246.  
  247. USE `booklibinventory`;
  248. DROP function IF EXISTS `booklibinventory`.`findAuthorKey`;
  249.  
  250. DELIMITER $$
  251. USE `booklibinventory`$$
  252. CREATE FUNCTION `findAuthorKey`(
  253. firstName VARCHAR(20),
  254. lastName VARCHAR(20)
  255. ) RETURNS INT
  256. BEGIN
  257.  
  258. SET @authorKey = 0;
  259.  
  260. SELECT COUNT(*) INTO @authorCount FROM authorstab;
  261. IF @authorCount > 0 THEN
  262. SELECT authorstab.idAuthors INTO @authorKey
  263. FROM authorstab
  264. WHERE authorsTab.LastName = lastName AND authorsTab.FirstName = firstName;
  265. IF @authorKey IS NULL THEN
  266. SET @authorKey = 0;
  267. END IF;
  268. END IF;
  269.  
  270. RETURN @authorKey;
  271.  
  272. END$$
  273.  
  274. DELIMITER ;
  275.  
  276. -- -----------------------------------------------------
  277. -- function findBookKey
  278. -- -----------------------------------------------------
  279.  
  280. USE `booklibinventory`;
  281. DROP function IF EXISTS `booklibinventory`.`findBookKey`;
  282.  
  283. DELIMITER $$
  284. USE `booklibinventory`$$
  285. CREATE FUNCTION `findBookKey`(
  286. authorLast VARCHAR(20),
  287. authorFirst VARCHAR(20),
  288. titleStr VARCHAR(128),
  289. formatStr VARCHAR(45)
  290. ) RETURNS INT
  291. BEGIN
  292.  
  293. SET @bookKey = 0;
  294.  
  295. SET @authorKey = findauthorKey(authorFirst, authorLast);
  296.  
  297. SET @titleKey = findTitleKey(titleStr);
  298.  
  299. SET @formatKey = findFormatKeyFromStr(formatStr);
  300.  
  301. IF @authorKey > 0 AND @titleKey > 0 THEN
  302. SET @bookKey = findBookKeyFromKeys(@authorKey, @titleKey, @formatKey);
  303. END IF;
  304.  
  305. RETURN @bookKey;
  306.  
  307. END$$
  308.  
  309. DELIMITER ;
  310.  
  311. -- -----------------------------------------------------
  312. -- function findBookKeyFast
  313. -- -----------------------------------------------------
  314.  
  315. USE `booklibinventory`;
  316. DROP function IF EXISTS `booklibinventory`.`findBookKeyFast`;
  317.  
  318. DELIMITER $$
  319. USE `booklibinventory`$$
  320. CREATE FUNCTION `findBookKeyFast`(
  321. authorLast VARCHAR(20),
  322. authorFirst VARCHAR(20),
  323. titleStr VARCHAR(128),
  324. formatStr VARCHAR(45)
  325. ) RETURNS INT
  326. BEGIN
  327.  
  328. /*
  329. * There may be multiple copies of a book in the library, one of each format.
  330. * Specifying the format makes it distinct.
  331. */
  332.  
  333. SELECT BKI.idBookInfo INTO @bookKey FROM bookinfo as BKI
  334. INNER JOIN authorsTab AS a ON a.idAuthors = BKI.AuthorFKbi
  335. INNER JOIN title AS t ON t.idTitle = BKI.TitleFKbi
  336. INNER JOIN bookformat AS bf ON bf.idFormat = BKI.BookFormatFKBi
  337. WHERE a.LastName = authorLast AND a.FirstName = authorFirst AND t.TitleStr = titleStr and bf.FormatName = formatStr;
  338.  
  339. IF @bookKey IS NULL THEN
  340. SET @bookKey = 0;
  341. END IF;
  342.  
  343.  
  344. RETURN @bookKey;
  345.  
  346. END$$
  347.  
  348. DELIMITER ;
  349.  
  350. -- -----------------------------------------------------
  351. -- function findBookKeyFromKeys
  352. -- -----------------------------------------------------
  353.  
  354. USE `booklibinventory`;
  355. DROP function IF EXISTS `booklibinventory`.`findBookKeyFromKeys`;
  356.  
  357. DELIMITER $$
  358. USE `booklibinventory`$$
  359. CREATE FUNCTION `findBookKeyFromKeys`(
  360. authorKey INT,
  361. titleKey INT,
  362. formatKey INT
  363. ) RETURNS INT
  364. BEGIN
  365.  
  366. SET @bookKey = 0;
  367.  
  368. IF authorKey > 0 AND titleKey > 0 then
  369. SELECT bookinfo.idBookInfo INTO @bookKey
  370. FROM BookInfo
  371. WHERE bookinfo.AuthorFKbi = authorKey AND bookinfo.TitleFKbi = titleKey AND bookinfo.BookFormatFKbi = formatKey;
  372. IF @bookKey IS NULL THEN
  373. SET @bookKey = 0;
  374. END IF;
  375. END IF;
  376.  
  377. RETURN @bookKey;
  378.  
  379. END$$
  380.  
  381. DELIMITER ;
  382.  
  383. -- -----------------------------------------------------
  384. -- function findTitleKey
  385. -- -----------------------------------------------------
  386.  
  387. USE `booklibinventory`;
  388. DROP function IF EXISTS `booklibinventory`.`findTitleKey`;
  389.  
  390. DELIMITER $$
  391. USE `booklibinventory`$$
  392. CREATE FUNCTION `findTitleKey`(
  393. TitleStr VARCHAR(128)
  394. ) RETURNS INT
  395. BEGIN
  396.  
  397. SELECT title.idTitle INTO @titleKey FROM title WHERE title.TitleStr = TitleStr;
  398. IF @titleKey IS NULL THEN
  399. SET @titleKey = 0;
  400. END IF;
  401.  
  402. RETURN @titleKey;
  403.  
  404. END$$
  405.  
  406. DELIMITER ;
  407.  
  408. -- -----------------------------------------------------
  409. -- function insertTitleIfNotExist
  410. -- -----------------------------------------------------
  411.  
  412. USE `booklibinventory`;
  413. DROP function IF EXISTS `booklibinventory`.`insertTitleIfNotExist`;
  414.  
  415. DELIMITER $$
  416. USE `booklibinventory`$$
  417. CREATE FUNCTION `insertTitleIfNotExist`(
  418. titleStr VARCHAR(128)
  419. ) RETURNS INT
  420. BEGIN
  421.  
  422. SET @titleKey = findTitleKey(titleStr);
  423.  
  424. if @titleKey < 1 THEN
  425. INSERT INTO title (title.TitleStr) VALUES(titleStr);
  426. SET @titleKey := LAST_INSERT_ID();
  427. END IF;
  428.  
  429. RETURN @titleKey;
  430. END$$
  431.  
  432. DELIMITER ;
  433.  
  434.  
  435. /*
  436. * Data inserts, deletions and updates.
  437. */
  438.  
  439. -- -----------------------------------------------------
  440. -- procedure UpdateAuthor
  441. -- -----------------------------------------------------
  442.  
  443. USE `booklibinventory`;
  444. DROP procedure IF EXISTS `booklibinventory`.`UpdateAuthor`;
  445.  
  446. DELIMITER $$
  447. USE `booklibinventory`$$
  448. CREATE PROCEDURE `UpdateAuthor`(
  449. IN LastName VARCHAR(20),
  450. IN FirstName VARCHAR(20),
  451. IN MiddleName VARCHAR(20),
  452. IN DOB VARCHAR(4),
  453. IN DOD VARCHAR(4)
  454. )
  455. BEGIN
  456.  
  457. UPDATE authorstab
  458. SET
  459. authorstab.MiddleName = MiddleName,
  460. authorstab.YearOfBirth = DOB,
  461. authorstab.YearOfDeath = DOD
  462. WHERE authorstab.LastName = LastName AND authorstab.FirstName = FirstName;
  463.  
  464. END$$
  465.  
  466. DELIMITER ;
  467.  
  468. -- -----------------------------------------------------
  469. -- procedure addAuthor
  470. -- -----------------------------------------------------
  471.  
  472. USE `booklibinventory`;
  473. DROP procedure IF EXISTS `booklibinventory`.`addAuthor`;
  474.  
  475. DELIMITER $$
  476. USE `booklibinventory`$$
  477. CREATE PROCEDURE `addAuthor`(
  478. IN authorLastName VARCHAR(20),
  479. IN authorFirstName VARCHAR(20),
  480. IN authorMiddleName VARCHAR(20),
  481. IN dob VARCHAR(4),
  482. IN dod VARCHAR(4)
  483. )
  484. BEGIN
  485.  
  486. INSERT INTO authorstab (authorstab.LastName, authorstab.FirstName, authorstab.MiddleName, authorstab.YearOfBirth, authorstab.YearOfDeath)
  487. VALUES(authorLastName, authorFirstName, authorMiddleName, dob, dod);
  488. END$$
  489.  
  490. DELIMITER ;
  491.  
  492. -- -----------------------------------------------------
  493. -- procedure addBookToLibrary
  494. -- -----------------------------------------------------
  495.  
  496. USE `booklibinventory`;
  497. DROP procedure IF EXISTS `booklibinventory`.`addBookToLibrary`;
  498.  
  499. DELIMITER $$
  500. USE `booklibinventory`$$
  501. CREATE PROCEDURE `addBookToLibrary`
  502. (
  503. IN categoryName VARCHAR(45),
  504. IN authorLastName VARCHAR(20),
  505. IN authorFirstName VARCHAR(20),
  506. IN titleStr VARCHAR(128),
  507. IN bookFormatStr VARCHAR(45),
  508. IN copyright VARCHAR(4),
  509. IN edition INT,
  510. IN printing INT,
  511. IN publisher VARCHAR(45),
  512. IN outOfPrint TINYINT,
  513. IN seriesName VARCHAR(128),
  514. IN volumeNumber INT,
  515. IN iSBNumber VARCHAR(32),
  516. IN iSignedByAuthor TINYINT,
  517. IN isOwned TINYINT,
  518. IN isWishListed TINYINT,
  519. IN isForSale TINYINT,
  520. IN askingPrice DOUBLE,
  521. IN estimatedValue DOUBLE,
  522. IN haveRead TINYINT,
  523. IN bookDescription VARCHAR(1024),
  524. OUT bookKey INT
  525. )
  526. BEGIN
  527.  
  528. -- All book data except for purchasing data will be added directly or indirectly from this procedure.
  529. -- Purchasing data will be handled outside of this procedure because the book may be added to a wishlist
  530. -- instead of added to the library.
  531. -- Each independent portion of the data will have it's own add procedure that will be called here.
  532.  
  533. SET @titleKey = 0, @formatKey = 0, @authorKey = 0, @seriesKey = 0;
  534.  
  535. SET @authorKey = findAuthorKey(authorFirstName, authorLastName);
  536.  
  537. -- If the author isn't found then the user has to add the author before they add any books or
  538. -- Series by the author.
  539. if @authorKey > 0 then
  540. SET @formatKey = findFormatKeyFromStr(BookFormatStr);
  541. IF @formatKey > 0 THEN
  542. SET @seriesKey = findSeriesKeyByAuthKeyTitle(@authorKey, SeriesName);
  543. SET @titleKey = insertTitleIfNotExist(titleStr);
  544. SET @categoryKey = findCategoryKeyFromStr(categoryName);
  545.  
  546. SET bookKey = findBookKeyFromKeys(@authorKey, @titleKey, @formatKey);
  547. IF bookKey < 1 THEN
  548. -- Don't add a book if it is already in the library. There will be special cases such as when a book has been signed by the author
  549. -- but these will be added later.
  550. INSERT INTO bookinfo (bookinfo.AuthorFKbi, bookinfo.TitleFKbi, bookinfo.CategoryFKbi, bookinfo.BookFormatFKbi, bookinfo.SeriesFKbi)
  551. VALUES (@authorKey, @titleKey, @categoryKey, @formatKey, @seriesKey);
  552. SET bookKey := LAST_INSERT_ID();
  553.  
  554. CALL insertOrUpdatePublishing(bookKey, copyright, edition, printing, publisher, outOfPrint);
  555. IF iSBNumber IS NOT NULL OR LENGTH(iSBNumber) > 1 THEN
  556. -- Mass Market Paperback Books older than 1985 may not have an isbn printed on them any where.
  557. CALL insertOrUpdateISBN(bookKey, iSBNumber);
  558. END IF;
  559. CALL insertOrUpdateOwned(bookKey, isOwned, isWishListed);
  560. CALL insertOrUpdateHaveRead(bookKey, haveRead);
  561. CALL insertOrUpdateVolumeInSeries(bookKey, volumeNumber, @seriesKey);
  562. IF isOwned > 0 THEN
  563. CALL insertOrUpdateForSale(bookKey, isForSale, askingPrice, estimatedValue);
  564. END IF;
  565. CALL insertOrUpdateIsSignedByAuthor(bookKey, iSignedByAuthor);
  566. IF bookDescription IS NOT NULL OR LENGTH(bookDescription) > 0 THEN
  567. -- Try to save space if there is no description.
  568. CALL insertOrUpdateSynopsis(bookKey, bookDescription);
  569. END IF;
  570. END IF;
  571.  
  572. END IF;
  573. END IF;
  574. END$$
  575.  
  576. DELIMITER ;
  577.  
  578. -- -----------------------------------------------------
  579. -- procedure buyBook
  580. -- -----------------------------------------------------
  581.  
  582. USE `booklibinventory`;
  583. DROP procedure IF EXISTS `booklibinventory`.`buyBook`;
  584.  
  585. DELIMITER $$
  586. USE `booklibinventory`$$
  587. CREATE PROCEDURE `buyBook`
  588. (
  589. IN categoryName VARCHAR(45),
  590. IN authorLastName VARCHAR(20),
  591. IN authorFirstName VARCHAR(20),
  592. IN titleStr VARCHAR(128),
  593. IN bookFormatStr VARCHAR(45),
  594. IN copyright VARCHAR(4),
  595. IN edition INT,
  596. IN printing INT,
  597. IN publisher VARCHAR(45),
  598. IN outOfPrint TINYINT,
  599. IN seriesName VARCHAR(128),
  600. IN volumeNumber INT,
  601. IN iSBNumber VARCHAR(32),
  602. IN iSignedByAuthor TINYINT,
  603. IN bookDescription VARCHAR(1024),
  604. IN purchaseDate DATE,
  605. IN listPrice DOUBLE,
  606. IN pricePaid DOUBLE,
  607. IN vendor VARCHAR(64),
  608. OUT bookKey INT -- allows the calling program or procedure to test for failure.
  609. )
  610. BEGIN
  611.  
  612. SET @estimatedValue = listPrice - 1.00;
  613.  
  614. SET @IsBookAlreadyInDB = findBookKeyFast(authorLastName, authorFirstName, TitleStr, bookFormatStr);
  615. IF @IsBookAlreadyInDB < 1 THEN
  616. -- The book was not already read or wishlisted.
  617. -- Some fields such as IsOwned are added by default because the book was purchased.
  618. CALL addBookToLibrary(
  619. categoryName,
  620. authorLastName,
  621. authorFirstName,
  622. titleStr,
  623. bookFormatStr,
  624. copyright,
  625. edition,
  626. printing,
  627. publisher,
  628. outOfPrint,
  629. seriesName,
  630. volumeNumber,
  631. iSBNumber,
  632. iSignedByAuthor,
  633. 1, -- IsOwned
  634. 0, -- IsWishlisted
  635. 0, -- IsForsale
  636. @estimatedValue, -- Asking Price
  637. @estimatedValue, -- Estimated Value
  638. 0, -- HaveReadBook This is assumed to be false, this might be a bug.
  639. bookDescription,
  640. bookKey
  641. );
  642. IF bookKey IS NOT NULL AND bookKey > 0 THEN
  643. CALL insertOrUpdatePurchaseInfo(bookKey, purchaseDate, listPrice, pricePaid, vendor);
  644. END IF;
  645. ELSE
  646. SET bookKey = @IsBookAlreadyInDB;
  647. -- The book was wishlisted or already read, update any changes.
  648. CALL insertOrUpdatePurchaseInfo(bookKey, purchaseDate, listPrice, pricePaid, vendor);
  649. CALL insertOrUpdatePublishing(bookKey, copyright, edition, printing, publisher, outOfPrint);
  650. CALL insertOrUpdateOwned(bookKey, 1, 0);
  651. CALL insertOrUpdateForSale(bookKey, 0, @estimatedValue, @estimatedValue);
  652. CALL insertOrUpdateIsSignedByAuthor(bookKey, iSignedByAuthor);
  653. IF iSBNumber IS NOT NULL OR LENGTH(iSBNumber) > 1 THEN
  654. -- Mass Market Paperback Books older than 1985 may not have an isbn printed on them any where.
  655. CALL insertOrUpdateISBN(bookKey, iSBNumber);
  656. END IF;
  657. IF bookDescription IS NOT NULL OR LENGTH(bookDescription) > 0 THEN
  658. -- Try to save space if there is no description.
  659. CALL insertOrUpdateSynopsis(bookKey, bookDescription);
  660. END IF;
  661. END IF;
  662.  
  663.  
  664. END$$
  665.  
  666. DELIMITER ;
  667.  
  668. -- -----------------------------------------------------
  669. -- procedure deleteAuthor
  670. -- -----------------------------------------------------
  671.  
  672. USE `booklibinventory`;
  673. DROP procedure IF EXISTS `booklibinventory`.`deleteAuthor`;
  674.  
  675. DELIMITER $$
  676. USE `booklibinventory`$$
  677. CREATE PROCEDURE `deleteAuthor`
  678. (
  679. IN authorLast VARCHAR(20),
  680. IN authorFirst VARCHAR(20),
  681. IN authorMiddle VARCHAR(20)
  682. )
  683. BEGIN
  684. -- This procedure deletes everything associated with the specified author
  685. -- including books, series and volumes in series. It affects almost every table
  686. -- in this database.
  687. -- Do not delete formats and categories.
  688.  
  689. DELETE a, BKI, s, v, i, sba, pub, pur, o, fs, hr, BDesk
  690. FROM authorstab AS a
  691. LEFT JOIN series AS s ON s.AuthorFK = a.idAuthors
  692. LEFT JOIN volumeinseries AS v ON v.SeriesFK = s.idSeries
  693. INNER JOIN bookinfo AS BKI ON BKI.AuthorFKbi = a.idAuthors
  694. LEFT JOIN isbn AS i ON i.BookFKiSBN = BKI.idBookInfo
  695. LEFT JOIN signedbyauthor AS sba ON sba.BookFKsba = BKI.idBookInfo
  696. LEFT JOIN publishinginfo AS pub ON pub.BookFKPubI = BKI.idBookInfo
  697. LEFT JOIN purchaseinfo AS pur ON pur.BookFKPurI = BKI.idBookInfo
  698. LEFT JOIN owned AS o ON o.BookFKo = BKI.idBookInfo
  699. LEFT JOIN forsale AS fs ON fs.BookFKfs = BKI.idBookInfo
  700. LEFT JOIN haveread AS hr ON hr.BookFKhr = BKI.idBookInfo
  701. LEFT JOIN bksynopsis AS BDesk ON BDesk.BookFKbd = BKI.idBookInfo
  702. WHERE a.LastName = authorLast AND a.FirstName = authorFirst AND a.MiddleName = authorMiddle;
  703. END$$
  704.  
  705. DELIMITER ;
  706.  
  707. -- -----------------------------------------------------
  708. -- procedure deleteBook
  709. -- -----------------------------------------------------
  710.  
  711. USE `booklibinventory`;
  712. DROP procedure IF EXISTS `booklibinventory`.`deleteBook`;
  713.  
  714. DELIMITER $$
  715. USE `booklibinventory`$$
  716. CREATE PROCEDURE `deleteBook`
  717. (
  718. IN authorLast VARCHAR(20),
  719. IN authorFirst VARCHAR(20),
  720. IN titleStr VARCHAR(128),
  721. IN formatStr VARCHAR(45)
  722. )
  723. BEGIN
  724.  
  725. -- Do not delete authors, titles, series, formats or categories. These may be shared with other books.
  726.  
  727. DELETE BKI, i, sba, pub, pur, v, o, fs, hr, BDesk
  728. FROM bookinfo AS BKI
  729. INNER JOIN authorsTab AS a ON a.idAuthors = BKI.AuthorFKbi
  730. INNER JOIN title AS t ON t.idTitle = BKI.TitleFKbi
  731. INNER JOIN bookformat AS bf ON bf.idFormat = BKI.BookFormatFKBi
  732. LEFT JOIN isbn AS i ON i.BookFKiSBN = BKI.idBookInfo
  733. LEFT JOIN signedbyauthor AS sba ON sba.BookFKsba = BKI.idBookInfo
  734. LEFT JOIN publishinginfo AS pub ON pub.BookFKPubI = BKI.idBookInfo
  735. LEFT JOIN purchaseinfo AS pur ON pur.BookFKPurI = BKI.idBookInfo
  736. LEFT JOIN volumeinseries AS v ON v.BookFKvs = BKI.idBookInfo
  737. LEFT JOIN owned AS o ON o.BookFKo = BKI.idBookInfo
  738. LEFT JOIN forsale AS fs ON fs.BookFKfs = BKI.idBookInfo
  739. LEFT JOIN haveread AS hr ON hr.BookFKhr = BKI.idBookInfo
  740. LEFT JOIN bksynopsis AS BDesk ON BDesk.BookFKbd = BKI.idBookInfo
  741. WHERE a.LastName = authorLast AND a.FirstName = authorFirst AND t.TitleStr = titleStr and bf.FormatName = formatStr;
  742.  
  743. END$$
  744.  
  745. DELIMITER ;
  746.  
  747. -- -----------------------------------------------------
  748. -- procedure insertOrUpdatePublishing
  749. -- -----------------------------------------------------
  750.  
  751. USE `booklibinventory`;
  752. DROP procedure IF EXISTS `booklibinventory`.`insertOrUpdatePublishing`;
  753.  
  754. DELIMITER $$
  755. USE `booklibinventory`$$
  756. CREATE PROCEDURE `insertOrUpdatePublishing`
  757. (
  758. IN bookKey INT,
  759. IN copyright VARCHAR(4),
  760. IN edition INT,
  761. IN printing INT,
  762. IN publisher VARCHAR(45),
  763. IN outOfPrint TINYINT
  764. )
  765. BEGIN
  766.  
  767. -- DECLARE testCopyright VARCHAR(4);
  768.  
  769. SET @testKey = NULL;
  770. SELECT publishinginfo.Copyright INTO @testCopyright FROM publishinginfo WHERE publishinginfo.BookFKPubI = bookKey;
  771.  
  772. IF @testCopyright IS NULL THEN
  773. INSERT INTO publishinginfo (
  774. publishinginfo.BookFKPubI,
  775. publishinginfo.Copyright,
  776. publishinginfo.Edition,
  777. publishinginfo.Printing,
  778. publishinginfo.Publisher,
  779. publishinginfo.OutOfPrint
  780. )
  781. VALUES(
  782. bookKey,
  783. copyright,
  784. edition,
  785. printing,
  786. publisher,
  787. outOfPrint
  788. )
  789. ;
  790. ELSE
  791. UPDATE publishinginfo
  792. SET
  793. publishinginfo.Copyright = copyright,
  794. publishinginfo.Edition = edition,
  795. publishinginfo.Printing = printing,
  796. publishinginfo.Publisher = publisher,
  797. publishinginfo.OutOfPrint = outOfPrint
  798. WHERE publishinginfo.BookFKPubI = bookKey;
  799. END IF;
  800. END$$
  801.  
  802. DELIMITER ;
  803. -- -----------------------------------------------------
  804. -- procedure addCategory
  805. -- -----------------------------------------------------
  806.  
  807. USE `booklibinventory`;
  808. DROP procedure IF EXISTS `booklibinventory`.`addCategory`;
  809.  
  810. DELIMITER $$
  811. USE `booklibinventory`$$
  812. CREATE PROCEDURE `addCategory`
  813. (
  814. categoryName VARCHAR(45)
  815. )
  816. BEGIN
  817.  
  818. SET @categoryKey = NULL;
  819.  
  820. SELECT bookcategories.idBookCategories INTO @categoryKey
  821. FROM bookcategories
  822. WHERE bookcategories.CategoryName = categoryName;
  823.  
  824. -- Prevent adding the same category again to avoid breaking the unique key structure.
  825.  
  826. IF @categoryKey IS NULL THEN
  827. INSERT INTO bookcategories (bookcategories.CategoryName) VALUES(categoryName);
  828. END IF;
  829.  
  830. END$$
  831.  
  832. DELIMITER ;
  833.  
  834. -- -----------------------------------------------------
  835. -- procedure addFormat
  836. -- -----------------------------------------------------
  837.  
  838. USE `booklibinventory`;
  839. DROP procedure IF EXISTS `booklibinventory`.`addFormat`;
  840.  
  841. DELIMITER $$
  842. USE `booklibinventory`$$
  843. CREATE PROCEDURE `addFormat` (IN bookFormatStr VARCHAR(45))
  844. BEGIN
  845.  
  846. SET @formatKey = findFormatKeyFromStr(bookFormatStr);
  847.  
  848. -- Prevent adding the same format again to avoid breaking the unique key structure.
  849. IF @formatKey < 1 THEN
  850. INSERT INTO bookformat (bookformat.FormatName) VALUES(bookFormatStr);
  851. END IF;
  852.  
  853. END$$
  854.  
  855. DELIMITER ;
  856.  
  857. -- -----------------------------------------------------
  858. -- procedure getAllBooks
  859. -- -----------------------------------------------------
  860.  
  861. USE `booklibinventory`;
  862. DROP procedure IF EXISTS `booklibinventory`.`getAllBooks`;
  863.  
  864. DELIMITER $$
  865. USE `booklibinventory`$$
  866. CREATE PROCEDURE `getAllBooks`()
  867. BEGIN
  868.  
  869. SELECT
  870. a.LastName,
  871. a.FirstName,
  872. t.TitleStr,
  873. bf.FormatName,
  874. BCat.CategoryName,
  875. i.ISBNumber,
  876. pub.Copyright,
  877. pub.Edition,
  878. pub.Publisher,
  879. pub.OutOfPrint,
  880. pub.Printing,
  881. s.SeriesName,
  882. v.VolumeNumber,
  883. pur.PurchaseDate,
  884. pur.ListPrice,
  885. pur.PaidPrice,
  886. pur.Vendor,
  887. sba.IsSignedByAuthor,
  888. o.IsOwned,
  889. o.IsWishListed,
  890. hr.HaveReadBook,
  891. fs.IsForSale,
  892. fs.AskingPrice,
  893. fs.EstimatedValue,
  894. BDesk.StoryLine
  895. FROM bookinfo AS BKI
  896. INNER JOIN authorsTab AS a ON a.idAuthors = BKI.AuthorFKbi
  897. INNER JOIN title AS t ON t.idTitle = BKI.TitleFKbi
  898. INNER JOIN bookformat AS bf ON bf.idFormat = BKI.BookFormatFKBi
  899. INNER JOIN bookcategories AS BCat ON BCat.idBookCategories = BKI.CategoryFKbI
  900. LEFT JOIN isbn AS i ON i.BookFKiSBN = BKI.idBookInfo
  901. LEFT JOIN signedbyauthor AS sba ON sba.BookFKsba = BKI.idBookInfo
  902. LEFT JOIN publishinginfo AS pub ON pub.BookFKPubI = BKI.idBookInfo
  903. LEFT JOIN purchaseinfo AS pur ON pur.BookFKPurI = BKI.idBookInfo
  904. LEFT JOIN series AS s ON s.idSeries = BKI.SeriesFKbi
  905. LEFT JOIN volumeinseries AS v ON v.BookFKvs = BKI.idBookInfo
  906. LEFT JOIN owned AS o ON o.BookFKo = BKI.idBookInfo
  907. LEFT JOIN forsale AS fs ON fs.BookFKfs = BKI.idBookInfo
  908. LEFT JOIN haveread AS hr ON hr.BookFKhr = BKI.idBookInfo
  909. LEFT JOIN bksynopsis AS BDesk ON BDesk.BookFKbd = BKI.idBookInfo
  910. ORDER BY BCat.CategoryName, a.LastName, a.FirstName, s.SeriesName, v.VolumeNumber, t.TitleStr;
  911.  
  912. END$$
  913.  
  914. DELIMITER ;
  915.  
  916. -- -----------------------------------------------------
  917. -- procedure getAllBookCategoriesWithKeys
  918. -- -----------------------------------------------------
  919.  
  920. USE `booklibinventory`;
  921. DROP procedure IF EXISTS `booklibinventory`.`getAllBookCategoriesWithKeys`;
  922.  
  923. DELIMITER $$
  924. USE `booklibinventory`$$
  925. CREATE PROCEDURE `getAllBookCategoriesWithKeys` ()
  926. BEGIN
  927.  
  928. /*
  929. * Example usage would be to get all the categories to CREATE a control that embeds the primary key rather than the text.
  930. */
  931.  
  932. SELECT bookcategories.CategoryName, bookcategories.idBookCategories FROM bookcategories;
  933.  
  934. END$$
  935.  
  936. DELIMITER ;
  937.  
  938. -- -----------------------------------------------------
  939. -- procedure getAllBookFormatsWithKeys
  940. -- -----------------------------------------------------
  941.  
  942. USE `booklibinventory`;
  943. DROP procedure IF EXISTS `booklibinventory`.`getAllBookFormatsWithKeys`;
  944.  
  945. DELIMITER $$
  946. USE `booklibinventory`$$
  947. CREATE PROCEDURE `getAllBookFormatsWithKeys`()
  948. BEGIN
  949.  
  950. /*
  951. * Example usage would be to get all the formats to CREATE a control embeds the primary key rather than the text.
  952. */
  953.  
  954. SELECT bookformat.FormatName, bookformat.idFormat FROM bookformat;
  955.  
  956. END$$
  957.  
  958. DELIMITER ;
  959.  
  960. /*
  961. * Start of functions that allow the user to update books in a limited manner.
  962. */
  963.  
  964. -- -----------------------------------------------------
  965. -- procedure putBookUpForSale
  966. -- -----------------------------------------------------
  967.  
  968. USE `booklibinventory`;
  969. DROP procedure IF EXISTS `booklibinventory`.`putBookUpForSale`;
  970.  
  971. DELIMITER $$
  972. USE `booklibinventory`$$
  973. CREATE PROCEDURE `putBookUpForSale`
  974. (
  975. IN authorFirstName VARCHAR(20),
  976. IN authorLastName VARCHAR(20),
  977. IN bookTitle VARCHAR(128),
  978. IN bookFormat VARCHAR(45),
  979. IN askingPrice DOUBLE,
  980. IN estimatedValue DOUBLE
  981. )
  982. BEGIN
  983.  
  984. SET @isForSale = 1;
  985.  
  986. SET @bookKey = findBookKeyFast(authorLastName, authorFirstName, bookTitle, bookFormat);
  987.  
  988. CALL insertOrUpdateForSale(@bookKey, @isForSale, askingPrice, estimatedValue);
  989.  
  990. END$$
  991.  
  992. DELIMITER ;
  993.  
  994. /*
  995. * Once only code called during installation or testing.
  996. */
  997.  
  998. -- -----------------------------------------------------
  999. -- procedure initBookInventoryTool
  1000. -- -----------------------------------------------------
  1001.  
  1002. USE `booklibinventory`;
  1003. DROP procedure IF EXISTS `booklibinventory`.`initBookInventoryTool`;
  1004.  
  1005. DELIMITER $$
  1006. USE `booklibinventory`$$
  1007. CREATE PROCEDURE `initBookInventoryTool` ()
  1008. BEGIN
  1009.  
  1010. -- Initialize some basic formats, user can add more later.
  1011. CALL addFormat('Hardcover');
  1012. CALL addFormat('Trade Paperback');
  1013. CALL addFormat('Mass Market Paperback');
  1014. CALL addFormat('eBook PDF');
  1015. CALL addFormat('eBook Kindle');
  1016. CALL addFormat('eBook iBooks');
  1017. CALL addFormat('eBook EPUB');
  1018. CALL addFormat('eBook HTML');
  1019.  
  1020. -- Initialize some basic categories, user can add more later.
  1021. CALL addCategory('Non-Fiction');
  1022. CALL addCategory('Non-Fiction: Biography');
  1023. CALL addCategory('Non-Fiction: Biology');
  1024. CALL addCategory('Non-Fiction: Computer');
  1025. CALL addCategory('Non-Fiction: Electrical Engineering');
  1026. CALL addCategory('Non-Fiction: History');
  1027. CALL addCategory('Textbook');
  1028. CALL addCategory('Poetry');
  1029. CALL addCategory('Art');
  1030. CALL addCategory('Dictionary');
  1031. CALL addCategory('Encyclopedia');
  1032. CALL addCategory('Fiction');
  1033. CALL addCategory('Fiction: Anime');
  1034. CALL addCategory('Fiction: Fantasy');
  1035. CALL addCategory('Fiction: Horror');
  1036. CALL addCategory('Fiction: Romance');
  1037. CALL addCategory('Fiction: Science Fiction');
  1038. CALL addCategory('Fiction: Western');
  1039.  
  1040. END$$
  1041.  
  1042. DELIMITER ;
  1043.  
  1044. /*
  1045. * Unit testing procedures.
  1046. */
  1047.  
  1048. -- -----------------------------------------------------
  1049. -- procedure zzzUnitTestAddAuthors
  1050. -- -----------------------------------------------------
  1051.  
  1052. USE `booklibinventory`;
  1053. DROP procedure IF EXISTS `booklibinventory`.`zzzUnitTestAddAuthors`;
  1054.  
  1055. DELIMITER $$
  1056. USE `booklibinventory`$$
  1057. CREATE PROCEDURE `zzzUnitTestAddAuthors` ()
  1058. BEGIN
  1059. SET @procName = 'zzzUnitTestAddAuthors';
  1060.  
  1061. CALL addAuthor('Heinlein', 'Robert', 'Anson', '1907', '1988');
  1062. CALL addAuthor('Asimov', 'Isaac', NULL, '1920', '1992');
  1063. CALL addAuthor('Clarke', 'Arthur', 'Charles', '1917', '2008');
  1064. CALL addAuthor('Le Guin', 'Ursula', 'Kroeber', '1929', '2018');
  1065. CALL addAuthor('Bradbury', 'Ray', 'Douglas ', '1920', '2012');
  1066. CALL addAuthor('Dick', 'Philip', 'Kindred', '1928', '1982');
  1067. CALL addAuthor('Wells', 'Herbert', 'George', '1866', '1946');
  1068. CALL addAuthor('Silverberg', 'Robert', NULL, '1935', NULL);
  1069. CALL addAuthor('Zimmer Bradley', 'Marion', 'Eleanor', '1930', '1999');
  1070. CALL addAuthor('Norton', 'Andre', 'Alice', '1912', '2005');
  1071. CALL addAuthor('Drake', 'David', NULL, '1945', NULL);
  1072. CALL addAuthor('Weber', 'David', 'Mark', '1952', NULL);
  1073. CALL addAuthor('Baxter', 'Stephen', NULL, '1957', NULL);
  1074. CALL addAuthor('Knuth', 'Donald', 'Ervin', '1938', NULL);
  1075.  
  1076. IF (SELECT COUNT(*) FROM authorstab) != 14 THEN
  1077. SELECT @procName, COUNT(*) FROM series;
  1078. SELECT * FROM series;
  1079. END IF;
  1080.  
  1081. END$$
  1082.  
  1083. DELIMITER ;
  1084.  
  1085. -- -----------------------------------------------------
  1086. -- procedure zzzUnitTestAddAuthorSeries
  1087. -- -----------------------------------------------------
  1088.  
  1089. USE `booklibinventory`;
  1090. DROP procedure IF EXISTS `booklibinventory`.`zzzUnitTestAddAuthorSeries`;
  1091.  
  1092. DELIMITER $$
  1093. USE `booklibinventory`$$
  1094. CREATE PROCEDURE `zzzUnitTestAddAuthorSeries` ()
  1095. BEGIN
  1096. SET @procName = 'zzzUnitTestAddAuthorSeries';
  1097.  
  1098. CALL addAuthorSeries('David', 'Weber', 'Safehold');
  1099. CALL addAuthorSeries('David', 'Weber', 'Honor Harrington');
  1100. CALL addAuthorSeries('David', 'Weber', 'Honorverse');
  1101. CALL addAuthorSeries('Marion', 'Zimmer Bradley', 'Darkover');
  1102. CALL addAuthorSeries('Isaac', 'Asimov', 'Foundation');
  1103. CALL addAuthorSeries('Stephen', 'Baxter', 'Northland');
  1104. CALL addAuthorSeries('Donald', 'Knuth', 'The Art of Computer Programming');
  1105. -- The follow statement should fail to insert the series since John Ringo has not been added to authorstab.
  1106. CALL addAuthorSeries('John', 'Ringo', 'Kildar');
  1107.  
  1108. IF (SELECT COUNT(*) FROM series) != 7 THEN
  1109. SELECT @procName, COUNT(*) FROM series;
  1110. SELECT * FROM series;
  1111. END IF;
  1112.  
  1113. END$$
  1114.  
  1115. DELIMITER ;
  1116.  
  1117. -- -----------------------------------------------------
  1118. -- procedure zzzUnitTestAddBookToLibrary
  1119. -- -----------------------------------------------------
  1120.  
  1121. USE `booklibinventory`;
  1122. DROP procedure IF EXISTS `booklibinventory`.`zzzUnitTestAddBookToLibrary`;
  1123.  
  1124. DELIMITER $$
  1125. USE `booklibinventory`$$
  1126. CREATE PROCEDURE `zzzUnitTestAddBookToLibrary` ()
  1127. BEGIN
  1128. /*
  1129. * The following procedures are tested by this procedure.
  1130. * addBookToLibrary
  1131. * insertOrUpdatePublishing
  1132. * insertOrUpdateOwned
  1133. * insertOrUpdateHaveRead
  1134. * insertOrUpdateVolumeInSeries
  1135. * insertOrUpdateForSale()
  1136. * insertOrUpdateIsSignedByAuthor
  1137. * insertOrUpdateSynopsis
  1138. * insertOrUpdateISBN
  1139. * insertOrUpdatePurchaseInfo
  1140. *
  1141. * The following functions are tested by this procedure:
  1142. * findAuthorKey
  1143. * findFormatKeyFromStr
  1144. * findSeriesKeyByAuthKeyTitle
  1145. * insertTitleIfNotExist
  1146. * findCategoryKeyFromStr
  1147. * findBookKeyFromKeys
  1148. *
  1149. */
  1150.  
  1151. DECLARE bookKey INT;
  1152.  
  1153. SET @procName = 'zzzUnitTestAddBookToLibrary';
  1154.  
  1155. CALL addBookToLibrary('Fiction: Science Fiction', 'Weber', 'David', 'On Basilisk Station', 'Mass Market Paperback', '1993', 1, 9, 'Baen Books', 0, 'Honor Harrington', 1,
  1156. '0-7434-3571-0', 0, 1, 0, 0, 8.99, 8.99, 1, 'bookDescription', bookKey);
  1157. IF (bookKey != 1) THEN
  1158. SELECT @procName, bookKey;
  1159. SELECT COUNT(*) FROM bookinfo;
  1160. END IF;
  1161.  
  1162. CALL addBookToLibrary('Fiction: Science Fiction', 'Weber', 'David', 'Honor of the Queen', 'Mass Market Paperback', '1993', 1, 10, 'Baen Books', 0, 'Honor Harrington', 2,
  1163. '978-0-7434-3572-7', 0, 1, 0, 0, 6.99, 6.99, 1, NULL, bookKey);
  1164. IF (bookKey != 2) THEN
  1165. SELECT @procName, bookKey;
  1166. SELECT COUNT(*) FROM bookinfo;
  1167. END IF;
  1168.  
  1169. CALL addBookToLibrary('Fiction: Science Fiction', 'Weber', 'David', 'Short Victorious War', 'Mass Market Paperback', '1994', 1, 8, 'Baen Books', 0, 'Honor Harrington', 3,
  1170. '0-7434-3573-7', 0, 1, 0, 0, 6.99, 6.99, 1, NULL, bookKey);
  1171. IF (bookKey != 3) THEN
  1172. SELECT @procName, bookKey;
  1173. SELECT COUNT(*) FROM bookinfo;
  1174. END IF;
  1175.  
  1176. CALL addBookToLibrary('Fiction: Science Fiction', 'Weber', 'David', 'Field of Dishonor', 'Mass Market Paperback', '1994', 1, 6, 'Baen Books', 0, 'Honor Harrington', 4,
  1177. '0-7434-3574-5', 0, 1, 0, 0, 7.99, 7.99, 1, NULL, bookKey);
  1178. IF (bookKey != 4) THEN
  1179. SELECT @procName, bookKey;
  1180. SELECT COUNT(*) FROM bookinfo;
  1181. END IF;
  1182.  
  1183. CALL addBookToLibrary('Fiction: Science Fiction', 'Norton', 'Andre', 'Star Guard', 'Mass Market Paperback', '1955', 1, NULL, 'Harcourt', 0, NULL, NULL,
  1184. NULL, 0, 0, 1, NULL, NULL, NULL, 1, NULL, bookKey);
  1185. IF (bookKey != 5) THEN
  1186. SELECT @procName, bookKey;
  1187. SELECT COUNT(*) FROM bookinfo;
  1188. END IF;
  1189.  
  1190. -- The following statement should fail to add a book since David Brin is not in authorstab.
  1191. -- The failure is indicated by bookKey being zero.
  1192. CALL addBookToLibrary('Fiction: Science Fiction', 'Brin', 'David', 'Uplift War', 'Hard Cover', '1987', 1, 1, 'Phantasia Press', 0, NULL, NULL,
  1193. 0-932096-44-1, 1, 1, 0, 0, 100.00, 100.00, 1, NULL, bookKey);
  1194. IF (bookKey != 0) THEN
  1195. SELECT @procName, bookKey;
  1196. SELECT COUNT(*) FROM bookinfo;
  1197. END IF;
  1198. IF (SELECT COUNT(*) FROM bookinfo) != 5 THEN
  1199. SELECT @procName, COUNT(*) FROM bookInfo;
  1200. SELECT * FROM bookInfo;
  1201. END IF;
  1202.  
  1203. IF (SELECT COUNT(*) FROM publishinginfo) != 5 THEN
  1204. SELECT @procName, COUNT(*) FROM publishinginfo;
  1205. SELECT * FROM publishinginfo;
  1206. END IF;
  1207.  
  1208. IF (SELECT COUNT(*) FROM bksynopsis) != 1 THEN
  1209. SELECT @procName, COUNT(*) FROM bksynopsis;
  1210. SELECT * FROM bksynopsis;
  1211. END IF;
  1212.  
  1213. IF (SELECT COUNT(*) FROM forsale) != 4 THEN
  1214. SELECT @procName, COUNT(*) FROM forsale;
  1215. SELECT * FROM forsale;
  1216. END IF;
  1217.  
  1218. IF (SELECT COUNT(*) FROM haveread) != 5 THEN
  1219. SELECT @procName, COUNT(*) FROM haveread;
  1220. SELECT * FROM haveread;
  1221. END IF;
  1222.  
  1223. IF (SELECT COUNT(*) FROM owned) != 5 THEN
  1224. SELECT @procName, COUNT(*) FROM owned;
  1225. SELECT * FROM owned;
  1226. END IF;
  1227.  
  1228. IF (SELECT COUNT(*) FROM signedbyauthor) != 5 THEN
  1229. SELECT @procName, COUNT(*) FROM signedbyauthor;
  1230. SELECT * FROM signedbyauthor;
  1231. END IF;
  1232.  
  1233. IF (SELECT COUNT(*) FROM isbn) != 4 THEN
  1234. SELECT @procName, COUNT(*) FROM isbn;
  1235. SELECT * FROM isbn;
  1236. END IF;
  1237.  
  1238. IF (SELECT COUNT(*) FROM purchaseinfo) != 0 THEN
  1239. SELECT @procName, COUNT(*) FROM purchaseinfo;
  1240. SELECT * FROM purchaseinfo;
  1241. END IF;
  1242.  
  1243. IF (SELECT COUNT(*) FROM title) != 5 THEN
  1244. SELECT @procName, COUNT(*) FROM title;
  1245. SELECT * FROM title;
  1246. END IF;
  1247.  
  1248. END$$
  1249.  
  1250. DELIMITER ;
  1251.  
  1252. -- -----------------------------------------------------
  1253. -- procedure zzzUnitTestUserUpdates
  1254. -- -----------------------------------------------------
  1255.  
  1256. USE `booklibinventory`;
  1257. DROP procedure IF EXISTS `booklibinventory`.`zzzUnitTestUserUpdates`;
  1258.  
  1259. DELIMITER $$
  1260. USE `booklibinventory`$$
  1261. CREATE PROCEDURE `zzzUnitTestUserUpdates` ()
  1262. BEGIN
  1263.  
  1264. /*
  1265. * This procedure tests the buyBook procedure. Since the buyBook procedure call addBookToLibrary, everything tested
  1266. * by zzzUnitTestAddBookToLibrary is also tested by this procedure.
  1267. *
  1268. */
  1269.  
  1270. DECLARE bookKey INT;
  1271. SET @procName = 'zzzUnitTestUserUpdates';
  1272.  
  1273. SELECT COUNT(*) INTO @forSaleCount FROM forsale WHERE forsale.IsForSale = 1;
  1274. CALL putBookUpForSale('David', 'Weber', 'Honor of the Queen', 'Mass Market Paperback', 10.99, 7.99);
  1275. IF (SELECT COUNT(*) FROM forsale WHERE forsale.IsForSale = 1) != (@forSaleCount + 1) THEN
  1276. SELECT @procName, COUNT(*) FROM forsale;
  1277. SELECT * FROM forsale;
  1278. END IF;
  1279. SELECT COUNT(*) INTO @forSaleCount FROM forsale;
  1280. -- CALL getAllBooksForSale();
  1281.  
  1282. SELECT COUNT(*) INTO @haveReadCount FROM haveread WHERE haveread.HaveReadBook = 1;
  1283. CALL finishedReadingBook('Stephen', 'Baxter', 'Stone Spring', 'Mass Market Paperback');
  1284. CALL finishedReadingBook('Stephen', 'Baxter', 'Bronze Summer', 'Mass Market Paperback');
  1285. IF (SELECT COUNT(*) FROM haveread WHERE haveread.HaveReadBook = 1) != (@haveReadCount + 2) THEN
  1286. SELECT @procName, COUNT(*) FROM haveread;
  1287. SELECT * FROM haveread;
  1288. END IF;
  1289. -- CALL getAllBooksThatWereRead();
  1290.  
  1291. CALL bookSold('David', 'Weber', 'Honor of the Queen', 'Mass Market Paperback');
  1292. IF (SELECT COUNT(*) FROM forsale) != (@forSaleCount - 1) THEN
  1293. SELECT @procName, COUNT(*) FROM forsale;
  1294. SELECT * FROM forsale;
  1295. END IF;
  1296.  
  1297. -- Test update buy buying wish listed book.
  1298. Set @buyDate = CURDATE();
  1299. CALL buyBook('Fiction: Science Fiction', 'Norton', 'Andre', 'Star Guard', 'Mass Market Paperback', '1955', 3, 4, 'Harcourt', 0, NULL, NULL,
  1300. '978-0-345-35036-7', 0, 'Testing 1 2 3', @buyDate, 7.99, 7.99, 'Amazon', bookKey);
  1301.  
  1302. END$$
  1303.  
  1304. DELIMITER ;
  1305.  
  1306. -- -----------------------------------------------------
  1307. -- procedure zzzUnitTestFunctions
  1308. -- -----------------------------------------------------
  1309.  
  1310. USE `booklibinventory`;
  1311. DROP procedure IF EXISTS `booklibinventory`.`zzzUnitTestFunctions`;
  1312.  
  1313. DELIMITER $$
  1314. USE `booklibinventory`$$
  1315. CREATE PROCEDURE `zzzUnitTestFunctions` ()
  1316. BEGIN
  1317.  
  1318. SET @procName = 'zzzUnitTestFunctions';
  1319.  
  1320. /*
  1321. * The functions not explicitly tested here are tested indirectly
  1322. * through the function calls here with the exception of insertTitleIfNotExist
  1323. */
  1324.  
  1325. SET @authorKey = findAuthorKey('Arthur','Clarke');
  1326. IF @authorKey != 3 THEN
  1327. SELECT @procName, @authorKey;
  1328. SELECT authorstab.FirstName, authorstab.LastName FROM authorstab WHERE idAuthors = @authorKey;
  1329. END IF;
  1330.  
  1331. SET @bookKey = findBookKeyFast('Baxter', 'Stephen', 'Stone Spring', 'Mass Market Paperback');
  1332. IF (@bookKey != 6) THEN
  1333. SELECT @procName, @bookKey;
  1334. SELECT * FROM bookinfo WHERE bookinfo.idBookInfo = @bookKey;
  1335. END IF;
  1336.  
  1337. SET @titleKey = findTitleKey('Star Guard');
  1338. IF (@titleKey != 5) THEN
  1339. SELECT @procName, @titleKey;
  1340. SELECT * FROM title WHERE title.idTitle = @titleKey;
  1341. END IF;
  1342.  
  1343. SET @categoryKey = findCategoryKeyFromStr('Non-Fiction: Electrical Engineering');
  1344. IF (@categoryKey != 5) THEN
  1345. SELECT @procName, @categoryKey;
  1346. SELECT * FROM bookcategories; -- WHERE bookcategories.idBookCategories = @categoryKey;
  1347. END IF;
  1348.  
  1349. SET @formatKey = findFormatKeyFromStr('Mass Market Paperback');
  1350. IF (@formatKey != 3) THEN
  1351. SELECT @procName, @formatKey;
  1352. SELECT * FROM bookformat WHERE bookformat.idFormat = @formatKey;
  1353. END IF;
  1354.  
  1355. SET @seriesKey = findSeriesKey('David', 'Weber', 'Honorverse');
  1356. IF (@seriesKey != 3) THEN
  1357. SELECT @procName, @seriesKey;
  1358. SELECT * FROM series WHERE series.idSeries = @seriesKey;
  1359. END IF;
  1360.  
  1361. END$$
  1362.  
  1363. DELIMITER ;
  1364. -- -----------------------------------------------------
  1365. -- procedure zzzUnitTestDelete
  1366. -- -----------------------------------------------------
  1367.  
  1368. USE `booklibinventory`;
  1369. DROP procedure IF EXISTS `booklibinventory`.`zzzUnitTestDelete`;
  1370.  
  1371. DELIMITER $$
  1372. USE `booklibinventory`$$
  1373. CREATE PROCEDURE `zzzUnitTestDelete` ()
  1374. BEGIN
  1375.  
  1376. SELECT COUNT(*) INTO @bookCount FROM bookinfo;
  1377.  
  1378. CALL deleteBook('Weber', 'David', 'Honor of the Queen', 'Mass Market Paperback');
  1379.  
  1380. IF (SELECT COUNT(*) FROM bookinfo) != (@bookCount - 1) THEN
  1381. SELECT * FROM bookinfo;
  1382. END IF;
  1383. SET @bookCount = @bookCount - 1;
  1384. IF (SELECT COUNT(*) FROM isbn) > @bookCount THEN
  1385. SELECT * FROM isbn;
  1386. END IF;
  1387. IF (SELECT COUNT(*) FROM signedbyauthor) > @bookCount THEN
  1388. SELECT * FROM signedbyauthor;
  1389. END IF;
  1390. IF (SELECT COUNT(*) FROM haveread) > @bookCount THEN
  1391. SELECT * FROM haveread;
  1392. END IF;
  1393. IF (SELECT COUNT(*) FROM forsale) > @bookCount THEN
  1394. SELECT * FROM forsale;
  1395. END IF;
  1396.  
  1397. SELECT COUNT(*) INTO @bookCount FROM bookinfo;
  1398. SELECT COUNT(*) INTO @seriesCount FROM series;
  1399. SELECT COUNT(*) INTO @authorCount FROM authorstab;
  1400.  
  1401. CALL deleteAuthor('Knuth', 'Donald', 'Ervin');
  1402.  
  1403. IF (SELECT COUNT(*) FROM bookinfo) != (@bookCount - 3) THEN
  1404. SELECT * FROM bookinfo;
  1405. END IF;
  1406. IF (SELECT COUNT(*) FROM series) != (@seriesCount - 1) THEN
  1407. SELECT * FROM series;
  1408. END IF;
  1409. IF (SELECT COUNT(*) FROM authorstab) != (@authorsCount - 1) THEN
  1410. SELECT * FROM authors;
  1411. END IF;
  1412. SET @bookCount = @bookCount - 3;
  1413. IF (SELECT COUNT(*) FROM haveread) > @bookCount THEN
  1414. SELECT * FROM haveread;
  1415. END IF;
  1416. IF (SELECT COUNT(*) FROM forsale) > @bookCount THEN
  1417. SELECT * FROM forsale;
  1418. END IF;
  1419. IF (SELECT COUNT(*) FROM owned) > @bookCount THEN
  1420. SELECT * FROM owned;
  1421. END IF;
  1422. IF (SELECT COUNT(*) FROM purchaseinfo) > @bookCount THEN
  1423. SELECT * FROM purchaseinfo;
  1424. END IF;
  1425. IF (SELECT COUNT(*) FROM publishinginfo) > @bookCount THEN
  1426. SELECT * FROM publishinginfo;
  1427. END IF;
  1428.  
  1429. END$$
  1430.  
  1431. DELIMITER ;
  1432.  
  1433. -- -----------------------------------------------------
  1434. -- procedure zzzRunAllUnitTests
  1435. -- -----------------------------------------------------
  1436.  
  1437. USE `booklibinventory`;
  1438. DROP procedure IF EXISTS `booklibinventory`.`zzzRunAllUnitTests`;
  1439.  
  1440. DELIMITER $$
  1441. USE `booklibinventory`$$
  1442. CREATE PROCEDURE `zzzRunAllUnitTests` ()
  1443. BEGIN
  1444. /*
  1445. * The unit tests are in a specific order. Data from the early test procedures
  1446. * is required by the later test procedures.
  1447. *
  1448. * The general functionality of the unit tests is to run the procedures or functions
  1449. * and then test values that would be affected by the routine. If the test failed
  1450. * then a select is run to show the error. No output means no errors.
  1451. */
  1452.  
  1453. SET @ShowAllResults = 1;
  1454.  
  1455. CALL zzzUnitTestInitProcedure();
  1456. CALL zzzUnitTestAddAuthors();
  1457. CALL zzzUnitTestAddAuthorSeries();
  1458. CALL zzzUnitTestAddBookToLibrary();
  1459. CALL zzzUnitTestBuyBook();
  1460. CALL zzzUnitTestFunctions();
  1461.  
  1462. CALL addMoreBooksForInterst();
  1463.  
  1464. -- Test all the data retrieval procedures to see that they return data rows.
  1465. -- These tests by default will provide output.
  1466. IF @showAllResults > 0 THEN
  1467. CALL getAllBookFormatsWithKeys();
  1468. CALL getAllBookCategoriesWithKeys();
  1469. CALL getAllBooksInLib(); -- Test selecting all fields
  1470. CALL getAllBooksByThisAuthor('Baxter', 'Stephen');
  1471. CALL getAllWishListBooks();
  1472. CALL getAllBooksThatWereRead();
  1473. CALL getThisAuthorsData('Norton','Andre');
  1474. CALL getAllSeriesByThisAuthor('Weber', 'David');
  1475. CALL getAllSeriesData();
  1476. CALL getAllAuthorsData();
  1477. CALL getBookData('Weber', 'David', 'Honor of the Queen', 'Mass Market Paperback');
  1478. CALL getAuthorDataByLastName('Asimov'); -- This could be changed if more authors are added, such as all the Greens.
  1479. CALL getAllBooksSignedByAuthor();
  1480. END IF;
  1481.  
  1482. CALL zzzUnitTestUserUpdates();
  1483. CALL getAllBooks(); -- Test selecting all fields all books
  1484. CALL zzzUnitTestDelete ();
  1485. CALL getAllBooks(); -- Test selecting all fields all books
  1486.  
  1487. END$$
  1488.  
  1489. DELIMITER ;
  1490.  
  1491. CALL booklibinventory.zzzRunAllUnitTests();
  1492.  
  1493. SET SQL_MODE=@OLD_SQL_MODE;
  1494. SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
Add Comment
Please, Sign In to add comment