OSDN Git Service

一度コードを崩してロールバックしたので安全のためコミット
[newstable/newstable.git] / Unit1.pas
1 unit Unit1;
2
3 interface
4
5 uses
6   System.SysUtils, System.Classes, System.JSON, FireDAC.Comp.Client, Data.DB,
7   FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param,
8   FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf,
9   FireDAC.Stan.Async, FireDAC.DApt, FireDAC.UI.Intf, FireDAC.Stan.Def,
10   FireDAC.Stan.Pool, FireDAC.Phys, FireDAC.Phys.MySQL, FireDAC.Phys.MySQLDef,
11   FireDAC.Comp.DataSet, FireDAC.VCLUI.Wait, FireDAC.Comp.UI, FireDAC.Phys.FB,
12   FireDAC.Phys.FBDef;
13
14 type
15   TDataModule1 = class(TDataModule)
16     database: TFDTable;
17     indexTable: TFDTable;
18     reader: TFDTable;
19     magList: TFDTable;
20     MagazineConnection: TFDConnection;
21     FDQuery1: TFDQuery;
22     news: TFDTable;
23     FDGUIxWaitCursor1: TFDGUIxWaitCursor;
24     writer: TFDTable;
25     writerwriterId: TIntegerField;
26     writerwriter: TWideStringField;
27     writermail: TWideStringField;
28     writerpassword: TWideStringField;
29     magListwriterId: TIntegerField;
30     magListmagId: TIntegerField;
31     newsmagId: TIntegerField;
32     newsno: TIntegerField;
33     newsday: TDateField;
34     newschanged: TBooleanField;
35     newsenabled: TBooleanField;
36     readerreaderId: TIntegerField;
37     readerreader: TWideStringField;
38     readermail: TWideStringField;
39     readerpassword: TWideStringField;
40     indexTablereaderId: TIntegerField;
41     indexTablemagId: TIntegerField;
42     mag: TFDTable;
43     magmagId: TIntegerField;
44     magmagName: TWideStringField;
45     magcomment: TWideStringField;
46     magday: TDateField;
47     maglastDay: TDateField;
48     magenable: TBooleanField;
49     procedure DataModuleCreate(Sender: TObject);
50   private
51     { Private \90é\8c¾ }
52     function makeTable(Sender: TObject): TJSONObject;
53   public
54     { Public \90é\8c¾ }
55     procedure AddMagazine(id: integer; out Data: TJSONObject);
56     procedure backNumber(id: integer; out Data: TJSONObject);
57     function existsMail(mail: string): Boolean;
58     function checkUserPassword(id: integer; password: string): Boolean;
59     function createReaderId(Data: TJSONObject): Boolean;
60     procedure deleteReaderId(Data: TJSONObject);
61     function updateReaderId(Data: TJSONObject): Boolean;
62     procedure custData(id: integer; Data: TJSONObject);
63     procedure custView(id: integer; out Data: TJSONObject);
64     procedure deleteMagazine(id: integer);
65     procedure deleteNumber(id, num: integer);
66     procedure deleteWriter(id: integer);
67     procedure getView(id, num: integer; out Data: TJSONObject); overload;
68     procedure getView(id: integer; out Data: TJSONObject); overload;
69     procedure magazines(id: integer; out Data: TJSONObject);
70     procedure magListAll(out Data: TJSONObject);
71     procedure magData(id: integer; out Data: TJSONObject);
72     function magid(name: string): integer;
73     procedure magIdOff(id, magid: integer);
74     procedure magIdOn(id, magid: integer);
75     procedure createMagId(id: integer; out Data: TJSONObject);
76     procedure postMessage(id: integer; Data: TJSONObject);
77     procedure createWriterId(Data: TJSONObject);
78     procedure readerData(id: integer; out Data: TJSONObject);
79     procedure titleView(id: integer;out Data: TJSONObject);
80     procedure updateWriterId(id: integer; Data: TJSONObject);
81     procedure userView(id: integer; out Data: TJSONObject);
82     function loginReader(data: TJSONObject): integer;
83     function loginWriter(data: TJSONObject): integer;
84   end;
85
86 var
87   DataModule1: TDataModule1;
88
89 implementation
90
91 uses System.Variants, System.Generics.Collections;
92
93 { %CLASSGROUP 'Vcl.Controls.TControl' }
94
95 {$R *.dfm}
96
97 procedure TDataModule1.AddMagazine(id: integer; out Data: TJSONObject);
98 var
99   i: integer;
100   na, com: string;
101 begin
102   FDQuery1.Open('select MAX(magId) as id from mag;');
103   i := FDQuery1.FieldByName('id').AsInteger + 1;
104   na := Data.Values['magName'].Value;
105   com := Data.Values['comment'].Value;
106   mag.AppendRecord([i, na, com, Date, Date, true]);
107   magList.AppendRecord([id, i]);
108 end;
109
110 procedure TDataModule1.backNumber(id: integer; out Data: TJSONObject);
111 const
112   con = '\82±\82Ì\8bL\8e\96\82Í\8cö\8aJ\90§\8cÀ\82ª\82 \82è\82Ü\82·.';
113 var
114   d: TJSONObject;
115   mem: TStringList;
116   blob: TStream;
117 begin
118   Data := TJSONObject.Create;
119   d := Data;
120   mem := TStringList.Create;
121   with FDQuery1 do
122   begin
123     SQL.Clear;
124     SQL.Add('select file,enabled from news where magId = :id order by lastDay;');
125     Params.ParamByName('id').AsInteger := id;
126     Open;
127     while Eof = false do
128     begin
129       blob := CreateBlobStream(FieldByName('text'), bmRead);
130       mem.LoadFromStream(blob);
131       if FieldByName('enabled').AsBoolean = true then
132         d.AddPair('text', mem.Text)
133       else
134         d.AddPair('text', con);
135       blob.Free;
136       Next;
137     end;
138   end;
139   mem.Free;
140 end;
141
142 function TDataModule1.checkUserPassword(id: integer; password: string): Boolean;
143 begin
144   result := writer.Lookup('id', id, 'password') = password;
145 end;
146
147 procedure TDataModule1.createMagId(id: integer; out Data: TJSONObject);
148 var
149   i: integer;
150 begin
151   FDQuery1.SQL.Clear;
152   FDQuery1.SQL.Add('select MAX(magId) as count from mag;');
153   FDQuery1.Open;
154   i := FDQuery1.FieldByName('count').AsInteger + 1;
155   mag.Append;
156   mag.FieldByName('magId').AsInteger := i;
157   mag.FieldByName('day').AsDateTime := Date;
158   mag.FieldByName('lastDay').AsDateTime := Date;
159   mag.FieldByName('magName').AsString := Data.Values['magName'].Value;
160   mag.FieldByName('comment').AsString := Data.Values['comment'].Value;
161   mag.FieldByName('enable').AsString := Data.Values['enable'].Value;
162   mag.Post;
163   magList.AppendRecord([id, i]);
164 end;
165
166 function TDataModule1.createReaderId(Data: TJSONObject): Boolean;
167 var
168   i: integer;
169   na, ma, pa: string;
170 begin
171   na := Data.Values['name'].Value;
172   ma := Data.Values['mail'].Value;
173   pa := Data.Values['password'].Value;
174   if reader.Locate('mail;password',VarArrayOf([na,ma])) = true then
175   begin
176     FDQuery1.Open('select MAX(readerid) as id from reader;');
177     i := FDQuery1.FieldByName('id').AsInteger + 1;
178     reader.AppendRecord([i, na, ma, pa]);
179     result:=true;
180   end
181   else
182     result:=false;
183 end;
184
185 procedure TDataModule1.DataModuleCreate(Sender: TObject);
186 const
187   tmp = 'create table if not exists ';
188 begin
189 //  FDQuery1.ExecSQL(tmp+'database(number int primary key, magId int, readerId int, writeId int);');
190   FDQuery1.ExecSQL
191     (tmp + 'mag(magId int primary key, magName varchar(20), comment varchar(50), day date, lastDay date, enable bool);');
192   FDQuery1.ExecSQL
193     (tmp + 'writer(writerId int primary key, writer varchar(20), mail varchar(20), password varchar(20));');
194   FDQuery1.ExecSQL
195     (tmp + 'reader(readerId int primary key, reader varchar(20), mail varchar(20), password varchar(20));');
196   FDQuery1.ExecSQL
197     (tmp + 'news(magId int, no int, day date, changed bool, enabled bool, primary key (magId,no));');
198   FDQuery1.ExecSQL
199     (tmp + 'indexTable(readerId int, magId int, primary key (readerId,magId));');
200   FDQuery1.ExecSQL
201     (tmp + 'magList(writerId int, magId int, primary key (writerId,magId));');
202 //  database.Open;
203   mag.Open;
204   writer.Open;
205   reader.Open;
206   news.Open;
207   indexTable.Open;
208   magList.Open;
209 end;
210
211 procedure TDataModule1.deleteMagazine(id: integer);
212   procedure main(Sender: TObject);
213   begin
214     with Sender as TFDTable do
215       while Locate('magid',id) = true do
216         Delete;
217   end;
218
219 begin
220   main(mag);
221   main(news);
222 //    main('database');
223   main(indexTable);
224 end;
225
226 procedure TDataModule1.deleteNumber(id, num: integer);
227 begin
228   if news.Locate('magId;newsId', VarArrayOf([id, num])) = true then
229     news.Delete;
230 end;
231
232 procedure TDataModule1.deleteReaderId(Data: TJSONObject);
233 var
234   id: integer;
235   na, ma, pa: string;
236 begin
237   id := Data.Values['id'].Value.ToInteger;
238   na := Data.Values['reader'].Value;
239   ma := Data.Values['mail'].Value;
240   pa := Data.Values['password'].Value;
241   if reader.Locate('readerid;reader;mail;password', VarArrayOf([id, na, ma, pa])
242     ) = true then
243     reader.Delete;
244   while indexTable.Locate('readerid',id) = true do
245     indexTable.Delete;
246 end;
247
248 procedure TDataModule1.deleteWriter(id: integer);
249 begin
250   if writer.Locate('writerid',id) = true then
251     writer.Delete;
252   while maglist.Locate('writerid',id) = true do
253   begin
254     deleteMagazine(magList.FieldByName('magid').AsInteger);
255     magList.Delete;
256   end;
257 end;
258
259 function TDataModule1.existsMail(mail: string): Boolean;
260 begin
261   result := (writer.Locate('mail',mail) = true)or(reader.Locate('mail',mail) = true);
262 end;
263
264 procedure TDataModule1.readerData(id: integer; out Data: TJSONObject);
265 begin
266   if reader.Locate('readerid', id) = true then
267   begin
268     Data := TJSONObject.Create;
269     Data.AddPair('name', reader.FieldByName('reader').AsString);
270     Data.AddPair('mail', reader.FieldByName('mail').AsString);
271   end;
272 end;
273
274 procedure TDataModule1.userView(id: integer; out Data: TJSONObject);
275 var
276   i: integer;
277   list: TList<integer>;
278   ar: TJSONArray;
279   d: TJSONObject;
280 begin
281   list := TList<integer>.Create;
282   FDQuery1.SQL.Clear;
283   FDQuery1.SQL.Add('select * from indexTable where readerid = :id;');
284   FDQuery1.Params.ParamByName('id').AsInteger := id;
285   FDQuery1.Open;
286   while FDQuery1.Eof = false do
287   begin
288     list.Add(FDQuery1.FieldByName('magid').AsInteger);
289     FDQuery1.Next;
290   end;
291   ar:=TJSONArray.Create;
292   for i in list do
293   begin
294     titleView(i, d);
295     ar.Add(d);
296   end;
297   list.Free;
298   Data := TJSONObject.Create;
299   data.AddPair('mag',ar);
300 end;
301
302 procedure TDataModule1.custData(id: integer; Data: TJSONObject);
303 begin
304   if writer.Locate('writerid', id) = true then
305   begin
306     Data.AddPair('name', writer.FieldByName('writer').AsString);
307     Data.AddPair('mail', writer.FieldByName('mail').AsString);
308   end;
309 end;
310
311 procedure TDataModule1.custView(id: integer; out Data: TJSONObject);
312 var
313   i: integer;
314   list: TList<integer>;
315 begin
316   Data := TJSONObject.Create;
317   list := TList<integer>.Create;
318   FDQuery1.SQL.Clear;
319   FDQuery1.SQL.Add('select * from maglist where readerid = :id;');
320   FDQuery1.Params.ParamByName('id').AsInteger := id;
321   FDQuery1.Open;
322   while FDQuery1.Eof = false do
323   begin
324     list.Add(FDQuery1.FieldByName('magid').AsInteger);
325     FDQuery1.Next;
326   end;
327   for i in list do
328     titleView(i, Data);
329   list.Free;
330 end;
331
332 procedure TDataModule1.getView(id, num: integer; out Data: TJSONObject);
333 begin
334   with FDQuery1.SQL do
335   begin
336     Clear;
337     Add('select updated,day,file from news');
338     Add(' where magId = :id and newsId = :num');
339     Add(' order by day;');
340   end;
341   with FDQuery1.Params do
342   begin
343     ParamByName('id').AsInteger := id;
344     ParamByName('num').AsInteger := num;
345   end;
346   FDQuery1.Open;
347   Data := makeTable(FDQuery1);
348 end;
349
350 procedure TDataModule1.getView(id: integer; out Data: TJSONObject);
351 begin
352   with FDQuery1.SQL do
353   begin
354     Clear;
355     Add('select updated,day,file from indexTable,news');
356     Add(' where readerId = :id and indexTable.magId = news.magId');
357     Add(' and enabled = true order by day;');
358   end;
359   FDQuery1.Params.ParamByName('id').AsInteger := id;
360   FDQuery1.Open;
361   Data := makeTable(FDQuery1);
362 end;
363
364 function TDataModule1.loginReader(data: TJSONObject): integer;
365 var
366   ma,pa: string;
367 begin
368   ma:=Data.Values['mail'].Value;
369   pa:=Data.Values['password'].Value;
370   if reader.Locate('mail;password',VarArrayOf([ma,pa])) = true then
371     result:=reader.FieldByName('readerid').AsInteger
372   else
373     result:=0;
374 end;
375
376 function TDataModule1.loginWriter(data: TJSONObject): integer;
377 var
378   ma,pa: string;
379 begin
380   ma:=Data.Values['mail'].Value;
381   pa:=Data.Values['password'].Value;
382   if writer.Locate('mail;password',VarArrayOf([ma,pa])) = true then
383     result:=writer.FieldByName('writerid').AsInteger
384   else
385     result:=0;
386 end;
387
388 procedure TDataModule1.magData(id: integer; out Data: TJSONObject);
389 begin
390   FDQuery1.SQL.Clear;
391   FDQuery1.SQL.Add('select * from mag where magid = :id;');
392   FDQuery1.ParamByName('id').AsInteger := id;
393   FDQuery1.Open;
394   if FDQuery1.FieldByName('enable').AsBoolean = true then
395   begin
396     Data := TJSONObject.Create;
397     Data.AddPair('name', FDQuery1.FieldByName('magName').AsString);
398     Data.AddPair('comment', FDQuery1.FieldByName('comment').AsString);
399     Data.AddPair('day', FDQuery1.FieldByName('day').AsString);
400     Data.AddPair('last', FDQuery1.FieldByName('lastDay').AsString);
401     FDQuery1.SQL.Clear;
402     FDQuery1.SQL.Add('select COUNT(*) as count from indextable where magid = :id;');
403     FDQuery1.ParamByName('id').AsInteger:=id;
404     FDQuery1.Open;
405     Data.AddPair('count', FDQuery1.FieldByName('count').AsString);
406   end;
407 end;
408
409 function TDataModule1.magid(name: string): integer;
410 begin
411   result := mag.Lookup('magname', name, 'magid');
412 end;
413
414 procedure TDataModule1.magIdOff(id, magid: integer);
415 begin
416   if indexTable.Locate('readerId;magId', VarArrayOf([id, magid])) = true then
417     indexTable.Delete;
418 end;
419
420 procedure TDataModule1.magIdOn(id, magid: integer);
421 begin
422   if (writer.Locate('readerid', id) = true) and
423     (mag.Locate('magid', magid) = true) then
424     indexTable.AppendRecord([id, magid]);
425 end;
426
427 procedure TDataModule1.magListAll(out Data: TJSONObject);
428 var
429   js: TJSONObject;
430   ar: TJSONArray;
431   val: TJSONValue;
432   i: integer;
433   v: Variant;
434 begin
435   mag.First;
436   ar := TJSONArray.Create;
437   FDQuery1.Open('select magId,COUNT(*) as count from indexTable group by magId');
438   while mag.Eof = false do
439   begin
440     i:=mag.FieldByName('magId').AsInteger;
441     v:=FDQuery1.Lookup('magId',i,'count');
442     if VarIsNull(v) = true then
443       v:=0;
444     js := TJSONObject.Create;
445     js.AddPair('magName', mag.FieldByName('magName').AsString);
446     js.AddPair('comment', mag.FieldByName('comment').AsString);
447     js.AddPair('day', mag.FieldByName('day').AsString);
448     js.AddPair('lastDay', mag.FieldByName('lastDay').AsString);
449     js.AddPair('count',v);
450     ar.Add(js);
451     mag.Next;
452   end;
453   Data := TJSONObject.Create;
454   if ar.Count > 0 then
455     Data.AddPair('items', ar)
456   else
457     Data.AddPair('items', TJSONFalse.Create);
458   if mag.FieldByName('enable').AsBoolean = true then
459     val := TJSONTrue.Create
460   else
461     val := TJSONFalse.Create;
462   Data.AddPair('enable', val);
463 end;
464
465 procedure TDataModule1.magazines(id: integer; out Data: TJSONObject);
466 var
467   d: TJSONObject;
468   val: TJSONValue;
469   ar: TJSONArray;
470   list: TList<integer>;
471   i: integer;
472 begin
473   d:=data;
474   FDQuery1.SQL.Clear;
475   FDQuery1.SQL.Add('select * from maglist where writerid = :id;');
476   FDQuery1.Params.ParamByName('id').AsInteger := id;
477   FDQuery1.Open;
478   ar := TJSONArray.Create;
479   list:=TList<integer>.Create;
480   while FDQuery1.Eof = false do
481   begin
482     list.Add(FDQuery1.FieldByName('magId').AsInteger);
483     FDQuery1.Next;
484   end;
485   for i in list do
486   begin
487     magData(i,d);
488     ar.Add(d);
489   end;
490   list.Free;
491   if ar.Count = 0 then
492   begin
493     ar.Free;
494     val := TJSONFalse.Create;
495   end
496   else
497     val := ar;
498   Data := TJSONObject.Create;
499   Data.AddPair('mag', val);
500 end;
501
502 function TDataModule1.makeTable(Sender: TObject): TJSONObject;
503 var
504   blob: TStream;
505   mem: TStringList;
506 begin
507   result := TJSONObject.Create;
508   mem := TStringList.Create;
509   with Sender as TFDQuery do
510   begin
511     First;
512     while Eof = false do
513     begin
514       if FieldByName('updated').AsBoolean = true then
515         result.AddPair('hint', Format('\82±\82Ì\8bL\8e\96\82Í\8dX\90V\82³\82ê\82Ü\82µ\82½:(%s)\93ú.',
516           [FieldByName('day').AsString]));
517       blob := CreateBlobStream(FieldByName('file'), bmRead);
518       mem.LoadFromStream(blob);
519       blob.Free;
520       result.AddPair('text', mem.Text);
521       Next;
522     end;
523   end;
524   mem.Free;
525 end;
526
527 procedure TDataModule1.postMessage(id: integer; Data: TJSONObject);
528 var
529   i: integer;
530 begin
531   FDQuery1.SQL.Clear;
532   FDQuery1.SQL.Add('select MAX(newsId) as id from news where magId = :id;');
533   FDQuery1.Params.ParamByName('id').AsInteger := id;
534   FDQuery1.Open;
535   if FDQuery1.RecordCount > 0 then
536   begin
537     i := FDQuery1.FieldByName('id').AsInteger + 1;
538     news.AppendRecord([id, i, false, Date, Data.Values['file'], true]);
539   end;
540 end;
541
542 procedure TDataModule1.createWriterId(Data: TJSONObject);
543 var
544   i: integer;
545   na, ma, pa: string;
546 begin
547   ma := Data.Values['mail'].Value;
548   if writer.Locate('mail', ma) = false then
549   begin
550     FDQuery1.Open('select MAX(writerId) as id from writer;');
551     i := FDQuery1.FieldByName('id').AsInteger + 1;
552     na := Data.Values['name'].Value;
553     ma := Data.Values['mail'].Value;
554     pa := Data.Values['password'].Value;
555     writer.AppendRecord([i, na, ma, pa]);
556   end;
557 end;
558
559 procedure TDataModule1.titleView(id: integer;out Data: TJSONObject);
560 var
561   d: TJSONObject;
562   i: integer;
563 begin
564   Data:=TJSONObject.Create;
565   d:=Data;
566   FDQuery1.SQL.Clear;
567   FDQuery1.SQL.Add('select * from mag where magid = :id;');
568   FDQuery1.Params.ParamByName('id').AsInteger := id;
569   FDQuery1.Open;
570   with FDQuery1 do
571     while Eof = false do
572     begin
573       for i := 0 to Fields.Count - 1 do
574         d.AddPair(Fields[i].FieldName, Fields[i].AsString);
575       Next;
576     end;
577 end;
578
579 function TDataModule1.updateReaderId(Data: TJSONObject): Boolean;
580 var
581   na, ma, pa: string;
582 begin
583   na:=Data.Values['reader'].Value;
584   ma:=Data.Values['mail'].Value;
585   pa:=data.Values['password'].Value;
586   if reader.Locate('id',data.Values['id'].Value.ToInteger) = true then
587   with reader do
588   begin
589     Edit;
590     FieldByName('reader').AsString:=na;
591     FieldByName('mail').AsString:=ma;
592     FieldByName('password').AsString:=pa;
593     Post;
594     result:=true;
595   end
596   else
597     result:=false;
598 end;
599
600 procedure TDataModule1.updateWriterId(id: integer; Data: TJSONObject);
601 var
602   na, ma, pa: string;
603 begin
604   na := Data.Values['name'].Value;
605   ma := Data.Values['mail'].Value;
606   pa := Data.Values['password'].Value;
607   with writer do
608   begin
609     Edit;
610     FieldByName('writerId').AsInteger := id;
611     FieldByName('writer').AsString := na;
612     FieldByName('mail').AsString := ma;
613     FieldByName('password').AsString := pa;
614     Post;
615   end;
616 end;
617
618 end.