public static void SaveScript(Package.Script script)
 {
     using (IDbConnection cnn = new SQLiteConnection(LoadConnectionString()))
     {
         try
         {
             cnn.Execute(@"insert into Script
                         (PackageId, OSVer, Environment, FileName, Authors, Path, Text, Info, CreationTime, CreationTimeUtc, LastAccessTime, LastAccessTimeUtc, LastWriteTime, LastWriteTimeUtc, Length)
                     values
                         (@PackageId, @OSVer, @Environment, @FileName, @Authors, @Path, @Text, @Info, @CreationTime, @CreationTimeUtc, @LastAccessTime, @LastAccessTimeUtc, @LastWriteTime, @LastWriteTimeUtc, @Length)
         ", new
             {
                 PackageID         = script.PackageID,
                 OSVer             = script.OSVer,
                 Environment       = script.Environment,
                 FileName          = script.FileName,
                 Authors           = script.Authors,
                 Path              = script.Path,
                 Text              = script.Text,
                 Info              = script.Info,
                 CreationTime      = script.CreationTime,
                 CreationTimeUtc   = script.CreationTimeUtc,
                 LastAccessTime    = script.LastAccessTime,
                 LastAccessTimeUtc = script.LastAccessTimeUtc,
                 LastWriteTime     = script.LastWriteTime,
                 LastWriteTimeUtc  = script.LastWriteTimeUtc,
                 Length            = script.Length
             });
         }
         catch (SQLiteException ex)
         {
             if (ex.Message.Contains("UNIQUE"))
             {
                 cnn.Execute(@"UPDATE Script
                         SET 
                             Authors = @Authors,
                             Text = @Text,
                             Info = @Info,
                             CreationTime = @CreationTime,
                             CreationTimeUtc = @CreationTimeUtc,
                             LastAccessTime = @LastAccessTime,
                             LastAccessTimeUtc = @LastAccessTimeUtc,
                             LastWriteTime = @LastWriteTime,
                             LastWriteTimeUtc = @LastWriteTimeUtc,
                             Length = @Length
                     WHERE
                     Path = @Path
         ", new
                 {
                     PackageID         = script.PackageID,
                     OSVer             = script.OSVer,
                     Environment       = script.Environment,
                     FileName          = script.FileName,
                     Authors           = script.Authors,
                     Path              = script.Path,
                     Text              = script.Text,
                     Info              = script.Info,
                     CreationTime      = script.CreationTime,
                     CreationTimeUtc   = script.CreationTimeUtc,
                     LastAccessTime    = script.LastAccessTime,
                     LastAccessTimeUtc = script.LastAccessTimeUtc,
                     LastWriteTime     = script.LastWriteTime,
                     LastWriteTimeUtc  = script.LastWriteTimeUtc,
                     Length            = script.Length
                 });
             }
             else
             {
                 throw;
             }
         }
     }
 }
                public static List <Script> FindScripts(string dir, int maxDepth)
                {
                    List <FileInfo> FindFiles(List <FileInfo> results, string curDir, int depth)
                    {
                        try
                        {
                            results.AddRange(new DirectoryInfo(curDir).GetFiles("*.pl"));
                        }
                        catch (System.UnauthorizedAccessException) { }

                        if (depth > 1)
                        {
                            try
                            {
                                foreach (DirectoryInfo d in new DirectoryInfo(curDir).GetDirectories())
                                {
                                    FindFiles(results, d.FullName, depth - 1);
                                }
                            }
                            catch (System.UnauthorizedAccessException) { }
                        }
                        return(results);
                    }

                    List <Script> scripts = new List <Script>();

                    List <FileInfo> fsis = FindFiles(new List <FileInfo>(), dir, maxDepth);

                    foreach (FileInfo fsi in fsis)
                    {
                        if (!SqliteDataAccess.ScriptIsUpToDate(fsi.FullName, UnixTimestampFromDateTime(fsi.LastWriteTimeUtc), fsi.Length))
                        {
                            string          text           = File.ReadAllText(fsi.FullName);
                            Regex           commentBlocksR = new Regex(@"\=pod(?:(?:(?!\=pod))|(?:[^\*]))*\=cut|\/\/[^\n\r]*(?=[\n\r])", RegexOptions.Multiline);
                            MatchCollection commentBlocks  = commentBlocksR.Matches(text);
                            Regex           commentLinesR  = new Regex(@"#(.*)", RegexOptions.Multiline);
                            MatchCollection commentLines   = commentLinesR.Matches(text);

                            Dictionary <string, string> authors = new Dictionary <string, string>();

                            using (var reader = new StreamReader(@"C:\Users\t-als9xd\source\repos\MSTPackagingHub\MSTPackagingHub\CSV_Database_of_First_Names.csv"))
                            {
                                List <string> firstNames = new List <string>();
                                while (!reader.EndOfStream)
                                {
                                    firstNames.Add(reader.ReadLine().Trim());
                                }

                                foreach (Match m in commentLines)
                                {
                                    foreach (string firstName in firstNames)
                                    {
                                        Regex firstNameExistsR = new Regex(firstName + @"\s", RegexOptions.Multiline);
                                        var   test             = m.ToString();
                                        var   nMatches         = firstNameExistsR.Matches(m.ToString());

                                        if (m.Length != 0)
                                        {
                                            Regex           firstNameR   = new Regex(firstName + @"\s([A-Z][a-z]*\.?)?\s?([A-Z][a-z]*\,?)?\s?", RegexOptions.Multiline);
                                            MatchCollection fNameMatches = firstNameR.Matches(m.ToString());

                                            foreach (Match fnm in fNameMatches)
                                            {
                                                string fNameResult = fnm.ToString().Replace("\n", "").Replace("\r", "").Trim();
                                                authors[firstName] = fNameResult;
                                            }
                                        }
                                    }
                                }

                                string joinedAuthors = string.Join(", ", authors.Select(x => x.Value));

                                List <string>   readmeInfo = new List <string>();
                                List <FileInfo> readmeFsis = new List <FileInfo>();
                                readmeFsis.AddRange(new DirectoryInfo(fsi.Directory.ToString()).GetFiles("readme*"));
                                readmeFsis.AddRange(new DirectoryInfo(fsi.Directory.ToString()).Parent.GetFiles("readme*"));
                                if (readmeFsis.Count() != 0)
                                {
                                    readmeInfo.Add(HttpUtility.JavaScriptStringEncode(File.ReadAllText(readmeFsis[0].FullName), true));
                                }

                                Script script = new Script
                                {
                                    Authors           = joinedAuthors,
                                    FileName          = fsi.Name,
                                    Path              = fsi.FullName,
                                    Length            = fsi.Length,
                                    Extension         = fsi.Extension,
                                    CreationTime      = UnixTimestampFromDateTime(fsi.CreationTime),
                                    CreationTimeUtc   = UnixTimestampFromDateTime(fsi.CreationTimeUtc),
                                    LastWriteTime     = UnixTimestampFromDateTime(fsi.LastWriteTime),
                                    LastWriteTimeUtc  = UnixTimestampFromDateTime(fsi.LastWriteTimeUtc),
                                    LastAccessTime    = UnixTimestampFromDateTime(fsi.LastAccessTime),
                                    LastAccessTimeUtc = UnixTimestampFromDateTime(fsi.LastAccessTimeUtc),
                                    Text              = text,
                                    Info              = $"[{String.Join(",", readmeInfo.ToArray())}]"
                                };
                                string[] scriptPath = script.Path.Split(System.IO.Path.DirectorySeparatorChar);

                                Dictionary <string, int> dirAttrIndexes = Package.FindPackageDirAttrs(scriptPath);

                                Package.Script scriptObj = new Package.Script
                                {
                                    PackageID         = scriptPath[dirAttrIndexes["PackageID"]],
                                    OSVer             = scriptPath[dirAttrIndexes["OSVer"]],
                                    Environment       = dirAttrIndexes.ContainsKey("Environment") ? scriptPath[dirAttrIndexes["Environment"]] : null,
                                    FileName          = script.FileName,
                                    Authors           = script.Authors,
                                    Path              = script.Path,
                                    Text              = script.Text,
                                    Info              = script.Info,
                                    CreationTime      = script.CreationTime,
                                    CreationTimeUtc   = script.CreationTimeUtc,
                                    LastAccessTime    = script.LastAccessTime,
                                    LastAccessTimeUtc = script.LastAccessTimeUtc,
                                    LastWriteTime     = script.LastWriteTime,
                                    LastWriteTimeUtc  = script.LastWriteTimeUtc,
                                    Length            = script.Length
                                };
                                SqliteDataAccess.SaveScript(scriptObj);
                            }
                        }
                    }
                    return(scripts);
                }